Error for Promise redeclaration in module with async

This commit is contained in:
Ron Buckton
2016-01-27 12:41:59 -08:00
parent a5a9655e87
commit 40bac6d1cc
44 changed files with 209 additions and 151 deletions
+57 -3
View File
@@ -2473,10 +2473,21 @@ namespace ts {
function getDeclarationContainer(node: Node): Node {
node = getRootDeclaration(node);
while (node) {
switch (node.kind) {
case SyntaxKind.VariableDeclaration:
case SyntaxKind.VariableDeclarationList:
case SyntaxKind.ImportSpecifier:
case SyntaxKind.NamedImports:
case SyntaxKind.NamespaceImport:
case SyntaxKind.ImportClause:
node = node.parent;
break;
// Parent chain:
// VaribleDeclaration -> VariableDeclarationList -> VariableStatement -> 'Declaration Container'
return node.kind === SyntaxKind.VariableDeclaration ? node.parent.parent.parent : node.parent;
default:
return node.parent;
}
}
}
function getTypeOfPrototypeProperty(prototype: Symbol): Type {
@@ -11625,6 +11636,9 @@ namespace ts {
checkTypeAssignableTo(iterableIteratorInstantiation, returnType, node.type);
}
}
else if (isAsyncFunctionLike(node)) {
checkAsyncFunctionReturnType(<FunctionLikeDeclaration>node);
}
}
}
@@ -12549,6 +12563,21 @@ namespace ts {
return unknownType;
}
if (languageVersion >= ScriptTarget.ES6) {
const promisedType = getPromisedType(promiseType);
if (!promisedType) {
error(node, Diagnostics.Type_0_is_not_a_valid_async_function_return_type, typeToString(promiseType));
return unknownType;
}
const promiseInstantiation = createPromiseType(promisedType);
if (!checkTypeAssignableTo(promiseInstantiation, promiseType, node.type, Diagnostics.Type_0_is_not_a_valid_async_function_return_type)) {
return unknownType;
}
return promisedType;
}
const promiseConstructor = getNodeLinks(node.type).resolvedSymbol;
if (!promiseConstructor || !symbolIsValue(promiseConstructor)) {
const typeName = promiseConstructor
@@ -12723,6 +12752,7 @@ namespace ts {
checkCollisionWithCapturedSuperVariable(node, node.name);
checkCollisionWithCapturedThisVariable(node, node.name);
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name);
}
}
@@ -12907,6 +12937,25 @@ namespace ts {
}
}
function checkCollisionWithGlobalPromiseInGeneratedCode(node: Node, name: Identifier): void {
if (!needCollisionCheckForIdentifier(node, name, "Promise")) {
return;
}
// Uninstantiated modules shouldnt do this check
if (node.kind === SyntaxKind.ModuleDeclaration && getModuleInstanceState(node) !== ModuleInstanceState.Instantiated) {
return;
}
// In case of variable declaration, node.parent is variable statement so look at the variable statement's parent
const parent = getDeclarationContainer(node);
if (parent.kind === SyntaxKind.SourceFile && isExternalOrCommonJsModule(<SourceFile>parent) && parent.flags & NodeFlags.HasAsyncFunctions) {
// If the declaration happens to be in external module, report error that require and exports are reserved keywords
error(name, Diagnostics.Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module_containing_async_functions,
declarationNameToString(name), declarationNameToString(name));
}
}
function checkVarDeclaredNamesNotShadowed(node: VariableDeclaration | BindingElement) {
// - ScriptBody : StatementList
// It is a Syntax Error if any element of the LexicallyDeclaredNames of StatementList
@@ -13085,6 +13134,7 @@ namespace ts {
checkCollisionWithCapturedSuperVariable(node, <Identifier>node.name);
checkCollisionWithCapturedThisVariable(node, <Identifier>node.name);
checkCollisionWithRequireExportsInGeneratedCode(node, <Identifier>node.name);
checkCollisionWithGlobalPromiseInGeneratedCode(node, <Identifier>node.name);
}
}
@@ -13850,6 +13900,7 @@ namespace ts {
checkTypeNameIsReserved(node.name, Diagnostics.Class_name_cannot_be_0);
checkCollisionWithCapturedThisVariable(node, node.name);
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name);
}
checkTypeParameters(node.typeParameters);
checkExportsOnMergedDeclarations(node);
@@ -14356,6 +14407,7 @@ namespace ts {
checkTypeNameIsReserved(node.name, Diagnostics.Enum_name_cannot_be_0);
checkCollisionWithCapturedThisVariable(node, node.name);
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name);
checkExportsOnMergedDeclarations(node);
computeEnumMemberValues(node);
@@ -14460,6 +14512,7 @@ namespace ts {
checkCollisionWithCapturedThisVariable(node, node.name);
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name);
checkExportsOnMergedDeclarations(node);
const symbol = getSymbolOfNode(node);
@@ -14652,6 +14705,7 @@ namespace ts {
function checkImportBinding(node: ImportEqualsDeclaration | ImportClause | NamespaceImport | ImportSpecifier) {
checkCollisionWithCapturedThisVariable(node, node.name);
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name);
checkAliasSymbol(node);
}
+5 -1
View File
@@ -794,7 +794,7 @@
"A decorator can only decorate a method implementation, not an overload.": {
"category": "Error",
"code": 1249
},
},
"'with' statements are not allowed in an async function block.": {
"category": "Error",
"code": 1300
@@ -1687,6 +1687,10 @@
"category": "Error",
"code": 2528
},
"Duplicate identifier '{0}'. Compiler reserves name '{1}' in top level scope of a module containing async functions.": {
"category": "Error",
"code": 2529
},
"JSX element attributes type '{0}' may not be a union type.": {
"category": "Error",
"code": 2600
+4 -4
View File
@@ -320,7 +320,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
const awaiterHelper = `
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new P(function (resolve, reject) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
@@ -4535,11 +4535,11 @@ const _super = (function (geti, seti) {
write(", void 0, ");
}
if (promiseConstructor) {
emitEntityNameAsExpression(promiseConstructor, /*useFallback*/ false);
if (languageVersion >= ScriptTarget.ES6 || !promiseConstructor) {
write("void 0");
}
else {
write("Promise");
emitEntityNameAsExpression(promiseConstructor, /*useFallback*/ false);
}
// Emit the call to __awaiter.
@@ -1,10 +0,0 @@
tests/cases/conformance/async/es6/asyncAliasReturnType_es6.ts(3,16): error TS1055: Type 'PromiseAlias' is not a valid async function return type.
==== tests/cases/conformance/async/es6/asyncAliasReturnType_es6.ts (1 errors) ====
type PromiseAlias<T> = Promise<T>;
async function f(): PromiseAlias<void> {
~
!!! error TS1055: Type 'PromiseAlias' is not a valid async function return type.
}
@@ -6,6 +6,6 @@ async function f(): PromiseAlias<void> {
//// [asyncAliasReturnType_es6.js]
function f() {
return __awaiter(this, void 0, PromiseAlias, function* () {
return __awaiter(this, void 0, void 0, function* () {
});
}
@@ -0,0 +1,11 @@
=== tests/cases/conformance/async/es6/asyncAliasReturnType_es6.ts ===
type PromiseAlias<T> = Promise<T>;
>PromiseAlias : Symbol(PromiseAlias, Decl(asyncAliasReturnType_es6.ts, 0, 0))
>T : Symbol(T, Decl(asyncAliasReturnType_es6.ts, 0, 18))
>Promise : Symbol(Promise, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
>T : Symbol(T, Decl(asyncAliasReturnType_es6.ts, 0, 18))
async function f(): PromiseAlias<void> {
>f : Symbol(f, Decl(asyncAliasReturnType_es6.ts, 0, 34))
>PromiseAlias : Symbol(PromiseAlias, Decl(asyncAliasReturnType_es6.ts, 0, 0))
}
@@ -0,0 +1,11 @@
=== tests/cases/conformance/async/es6/asyncAliasReturnType_es6.ts ===
type PromiseAlias<T> = Promise<T>;
>PromiseAlias : Promise<T>
>T : T
>Promise : Promise<T>
>T : T
async function f(): PromiseAlias<void> {
>f : () => Promise<void>
>PromiseAlias : Promise<T>
}
@@ -4,5 +4,5 @@ var foo = async (): Promise<void> => {
};
//// [asyncArrowFunction1_es6.js]
var foo = () => __awaiter(this, void 0, Promise, function* () {
var foo = () => __awaiter(this, void 0, void 0, function* () {
});
@@ -4,5 +4,5 @@ var foo = async (a = await): Promise<void> => {
}
//// [asyncArrowFunction6_es6.js]
var foo = (a = yield ) => __awaiter(this, void 0, Promise, function* () {
var foo = (a = yield ) => __awaiter(this, void 0, void 0, function* () {
});
@@ -7,8 +7,8 @@ var bar = async (): Promise<void> => {
}
//// [asyncArrowFunction7_es6.js]
var bar = () => __awaiter(this, void 0, Promise, function* () {
var bar = () => __awaiter(this, void 0, void 0, function* () {
// 'await' here is an identifier, and not an await expression.
var foo = (a = yield ) => __awaiter(this, void 0, Promise, function* () {
var foo = (a = yield ) => __awaiter(this, void 0, void 0, function* () {
});
});
@@ -5,6 +5,6 @@ var foo = async (): Promise<void> => {
}
//// [asyncArrowFunction8_es6.js]
var foo = () => __awaiter(this, void 0, Promise, function* () {
var foo = () => __awaiter(this, void 0, void 0, function* () {
var v = { [yield ]: foo };
});
@@ -11,6 +11,6 @@ class C {
class C {
method() {
function other() { }
var fn = () => __awaiter(this, arguments, Promise, function* () { return yield other.apply(this, arguments); });
var fn = () => __awaiter(this, arguments, void 0, function* () { return yield other.apply(this, arguments); });
}
}
@@ -9,6 +9,6 @@ class C {
//// [asyncArrowFunctionCapturesThis_es6.js]
class C {
method() {
var fn = () => __awaiter(this, void 0, Promise, function* () { return yield this; });
var fn = () => __awaiter(this, void 0, void 0, function* () { return yield this; });
}
}
@@ -41,7 +41,7 @@ module M {
//// [asyncAwaitIsolatedModules_es6.js]
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new P(function (resolve, reject) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
@@ -49,65 +49,65 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
});
};
function f0() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
function f1() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
function f3() {
return __awaiter(this, void 0, MyPromise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
let f4 = function () {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
};
let f5 = function () {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
};
let f6 = function () {
return __awaiter(this, void 0, MyPromise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
};
let f7 = () => __awaiter(this, void 0, Promise, function* () { });
let f8 = () => __awaiter(this, void 0, Promise, function* () { });
let f9 = () => __awaiter(this, void 0, MyPromise, function* () { });
let f10 = () => __awaiter(this, void 0, Promise, function* () { return p; });
let f11 = () => __awaiter(this, void 0, Promise, function* () { return mp; });
let f12 = () => __awaiter(this, void 0, Promise, function* () { return mp; });
let f13 = () => __awaiter(this, void 0, MyPromise, function* () { return p; });
let f7 = () => __awaiter(this, void 0, void 0, function* () { });
let f8 = () => __awaiter(this, void 0, void 0, function* () { });
let f9 = () => __awaiter(this, void 0, void 0, function* () { });
let f10 = () => __awaiter(this, void 0, void 0, function* () { return p; });
let f11 = () => __awaiter(this, void 0, void 0, function* () { return mp; });
let f12 = () => __awaiter(this, void 0, void 0, function* () { return mp; });
let f13 = () => __awaiter(this, void 0, void 0, function* () { return p; });
let o = {
m1() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
},
m2() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
},
m3() {
return __awaiter(this, void 0, MyPromise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
};
class C {
m1() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
m2() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
m3() {
return __awaiter(this, void 0, MyPromise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
static m4() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
static m5() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
static m6() {
return __awaiter(this, void 0, MyPromise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
}
var M;
(function (M) {
function f1() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
M.f1 = f1;
})(M || (M = {}));
+24 -24
View File
@@ -41,7 +41,7 @@ module M {
//// [asyncAwait_es6.js]
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new P(function (resolve, reject) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
@@ -49,65 +49,65 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
});
};
function f0() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
function f1() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
function f3() {
return __awaiter(this, void 0, MyPromise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
let f4 = function () {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
};
let f5 = function () {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
};
let f6 = function () {
return __awaiter(this, void 0, MyPromise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
};
let f7 = () => __awaiter(this, void 0, Promise, function* () { });
let f8 = () => __awaiter(this, void 0, Promise, function* () { });
let f9 = () => __awaiter(this, void 0, MyPromise, function* () { });
let f10 = () => __awaiter(this, void 0, Promise, function* () { return p; });
let f11 = () => __awaiter(this, void 0, Promise, function* () { return mp; });
let f12 = () => __awaiter(this, void 0, Promise, function* () { return mp; });
let f13 = () => __awaiter(this, void 0, MyPromise, function* () { return p; });
let f7 = () => __awaiter(this, void 0, void 0, function* () { });
let f8 = () => __awaiter(this, void 0, void 0, function* () { });
let f9 = () => __awaiter(this, void 0, void 0, function* () { });
let f10 = () => __awaiter(this, void 0, void 0, function* () { return p; });
let f11 = () => __awaiter(this, void 0, void 0, function* () { return mp; });
let f12 = () => __awaiter(this, void 0, void 0, function* () { return mp; });
let f13 = () => __awaiter(this, void 0, void 0, function* () { return p; });
let o = {
m1() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
},
m2() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
},
m3() {
return __awaiter(this, void 0, MyPromise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
};
class C {
m1() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
m2() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
m3() {
return __awaiter(this, void 0, MyPromise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
static m4() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
static m5() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
static m6() {
return __awaiter(this, void 0, MyPromise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
}
var M;
(function (M) {
function f1() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
M.f1 = f1;
})(M || (M = {}));
@@ -4,6 +4,6 @@ async function await(): Promise<void> {
//// [asyncFunctionDeclaration11_es6.js]
function await() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
});
}
@@ -7,7 +7,7 @@ async function foo(): Promise<void> {
//// [asyncFunctionDeclaration13_es6.js]
function foo() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
// Legal to use 'await' in a type context.
var v;
});
@@ -5,7 +5,7 @@ async function foo(): Promise<void> {
//// [asyncFunctionDeclaration14_es6.js]
function foo() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
return;
});
}
@@ -1,17 +1,12 @@
tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts(6,16): error TS1055: Type '{}' is not a valid async function return type.
tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts(7,16): error TS1055: Type 'any' is not a valid async function return type.
tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts(8,16): error TS1055: Type 'number' is not a valid async function return type.
tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts(9,16): error TS1055: Type 'PromiseLike' is not a valid async function return type.
tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts(10,16): error TS1055: Type 'typeof Thenable' is not a valid async function return type.
Type 'Thenable' is not assignable to type 'PromiseLike<any>'.
Types of property 'then' are incompatible.
Type '() => void' is not assignable to type '{ <TResult>(onfulfilled?: (value: any) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): PromiseLike<TResult>; <TResult>(onfulfilled?: (value: any) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => void): PromiseLike<TResult>; }'.
Type 'void' is not assignable to type 'PromiseLike<any>'.
tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts(10,16): error TS1055: Type 'Thenable' is not a valid async function return type.
tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts(17,16): error TS1059: Return expression in async function does not have a valid callable 'then' member.
tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts(23,25): error TS1058: Operand for 'await' does not have a valid callable 'then' member.
==== tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts (7 errors) ====
==== tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts (6 errors) ====
declare class Thenable { then(): void; }
declare let a: any;
declare let obj: { then: string; };
@@ -27,15 +22,9 @@ tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration1
~~~
!!! error TS1055: Type 'number' is not a valid async function return type.
async function fn5(): PromiseLike<void> { } // error
~~~
!!! error TS1055: Type 'PromiseLike' is not a valid async function return type.
async function fn6(): Thenable { } // error
~~~
!!! error TS1055: Type 'typeof Thenable' is not a valid async function return type.
!!! error TS1055: Type 'Thenable' is not assignable to type 'PromiseLike<any>'.
!!! error TS1055: Types of property 'then' are incompatible.
!!! error TS1055: Type '() => void' is not assignable to type '{ <TResult>(onfulfilled?: (value: any) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): PromiseLike<TResult>; <TResult>(onfulfilled?: (value: any) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => void): PromiseLike<TResult>; }'.
!!! error TS1055: Type 'void' is not assignable to type 'PromiseLike<any>'.
!!! error TS1055: Type 'Thenable' is not a valid async function return type.
async function fn7() { return; } // valid: Promise<void>
async function fn8() { return 1; } // valid: Promise<number>
async function fn9() { return null; } // valid: Promise<any>
@@ -26,59 +26,59 @@ async function fn19() { await thenable; } // error
//// [asyncFunctionDeclaration15_es6.js]
function fn1() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
} // valid: Promise<void>
function fn2() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
} // error
function fn3() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
} // error
function fn4() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
} // error
function fn5() {
return __awaiter(this, void 0, PromiseLike, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
} // error
function fn6() {
return __awaiter(this, void 0, Thenable, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
} // error
function fn7() {
return __awaiter(this, void 0, Promise, function* () { return; });
return __awaiter(this, void 0, void 0, function* () { return; });
} // valid: Promise<void>
function fn8() {
return __awaiter(this, void 0, Promise, function* () { return 1; });
return __awaiter(this, void 0, void 0, function* () { return 1; });
} // valid: Promise<number>
function fn9() {
return __awaiter(this, void 0, Promise, function* () { return null; });
return __awaiter(this, void 0, void 0, function* () { return null; });
} // valid: Promise<any>
function fn10() {
return __awaiter(this, void 0, Promise, function* () { return undefined; });
return __awaiter(this, void 0, void 0, function* () { return undefined; });
} // valid: Promise<any>
function fn11() {
return __awaiter(this, void 0, Promise, function* () { return a; });
return __awaiter(this, void 0, void 0, function* () { return a; });
} // valid: Promise<any>
function fn12() {
return __awaiter(this, void 0, Promise, function* () { return obj; });
return __awaiter(this, void 0, void 0, function* () { return obj; });
} // valid: Promise<{ then: string; }>
function fn13() {
return __awaiter(this, void 0, Promise, function* () { return thenable; });
return __awaiter(this, void 0, void 0, function* () { return thenable; });
} // error
function fn14() {
return __awaiter(this, void 0, Promise, function* () { yield 1; });
return __awaiter(this, void 0, void 0, function* () { yield 1; });
} // valid: Promise<void>
function fn15() {
return __awaiter(this, void 0, Promise, function* () { yield null; });
return __awaiter(this, void 0, void 0, function* () { yield null; });
} // valid: Promise<void>
function fn16() {
return __awaiter(this, void 0, Promise, function* () { yield undefined; });
return __awaiter(this, void 0, void 0, function* () { yield undefined; });
} // valid: Promise<void>
function fn17() {
return __awaiter(this, void 0, Promise, function* () { yield a; });
return __awaiter(this, void 0, void 0, function* () { yield a; });
} // valid: Promise<void>
function fn18() {
return __awaiter(this, void 0, Promise, function* () { yield obj; });
return __awaiter(this, void 0, void 0, function* () { yield obj; });
} // valid: Promise<void>
function fn19() {
return __awaiter(this, void 0, Promise, function* () { yield thenable; });
return __awaiter(this, void 0, void 0, function* () { yield thenable; });
} // error
@@ -4,6 +4,6 @@ async function foo(): Promise<void> {
//// [asyncFunctionDeclaration1_es6.js]
function foo() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
});
}
@@ -4,6 +4,6 @@ async function foo(a = await): Promise<void> {
//// [asyncFunctionDeclaration6_es6.js]
function foo(a = yield ) {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
});
}
@@ -7,10 +7,10 @@ async function bar(): Promise<void> {
//// [asyncFunctionDeclaration7_es6.js]
function bar() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
// 'await' here is an identifier, and not a yield expression.
function foo(a = yield ) {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
});
}
});
@@ -5,7 +5,7 @@ async function foo(): Promise<void> {
//// [asyncFunctionDeclaration9_es6.js]
function foo() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
var v = { [yield ]: foo };
});
}
@@ -17,7 +17,7 @@ export const b = {
//// [b.js]
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new P(function (resolve, reject) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
@@ -26,13 +26,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
};
import { a } from './a';
export const b = {
f: () => __awaiter(this, void 0, Promise, function* () {
f: () => __awaiter(this, void 0, void 0, function* () {
yield a.f();
})
};
//// [a.js]
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new P(function (resolve, reject) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
@@ -41,7 +41,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
};
import { b } from './b';
export const a = {
f: () => __awaiter(this, void 0, Promise, function* () {
f: () => __awaiter(this, void 0, void 0, function* () {
yield b.f();
})
};
@@ -1,12 +1,12 @@
//// [tests/cases/conformance/async/es6/asyncImportedPromise_es6.ts] ////
//// [task.ts]
export class Task<T> extends Promise<T> { }
export class Task<T> extends Promise<T> { }
//// [test.ts]
import { Task } from "./task";
class Test {
async example<T>(): Task<T> { return; }
import { Task } from "./task";
class Test {
async example<T>(): Task<T> { return; }
}
//// [task.js]
@@ -17,16 +17,15 @@ exports.Task = Task;
//// [test.js]
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new P(function (resolve, reject) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments)).next());
});
};
const task_1 = require("./task");
class Test {
example() {
return __awaiter(this, void 0, task_1.Task, function* () { return; });
return __awaiter(this, void 0, void 0, function* () { return; });
}
}
@@ -59,7 +59,7 @@ class B extends A {
// async method with only call/get on 'super' does not require a binding
simple() {
const _super = name => super[name];
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
// call with property access
_super("x").call(this);
// call with element access
@@ -76,7 +76,7 @@ class B extends A {
const cache = Object.create(null);
return name => cache[name] || (cache[name] = { get value() { return geti(name); }, set value(v) { seti(name, v); } });
})(name => super[name], (name, value) => super[name] = value);
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
const f = () => { };
// call with property access
_super("x").value.call(this);
+2 -2
View File
@@ -7,7 +7,7 @@ function g() { }
//// [a.js]
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new P(function (resolve, reject) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
@@ -15,7 +15,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
});
};
function f() {
return __awaiter(this, void 0, Promise, function* () { });
return __awaiter(this, void 0, void 0, function* () { });
}
//// [b.js]
function g() { }
@@ -15,6 +15,6 @@ var X;
X.MyPromise = MyPromise;
})(X || (X = {}));
function f() {
return __awaiter(this, void 0, X.MyPromise, function* () {
return __awaiter(this, void 0, void 0, function* () {
});
}
@@ -9,7 +9,7 @@ async function func(): Promise<void> {
//// [awaitBinaryExpression1_es6.js]
function func() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
"before";
var b = (yield p) || a;
"after";
@@ -9,7 +9,7 @@ async function func(): Promise<void> {
//// [awaitBinaryExpression2_es6.js]
function func() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
"before";
var b = (yield p) && a;
"after";
@@ -9,7 +9,7 @@ async function func(): Promise<void> {
//// [awaitBinaryExpression3_es6.js]
function func() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
"before";
var b = (yield p) + a;
"after";
@@ -9,7 +9,7 @@ async function func(): Promise<void> {
//// [awaitBinaryExpression4_es6.js]
function func() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
"before";
var b = yield p, a;
"after";
@@ -10,7 +10,7 @@ async function func(): Promise<void> {
//// [awaitBinaryExpression5_es6.js]
function func() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
"before";
var o;
o.a = yield p;
@@ -13,7 +13,7 @@ async function func(): Promise<void> {
//// [awaitCallExpression1_es6.js]
function func() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
"before";
var b = fn(a, a, a);
"after";
@@ -13,7 +13,7 @@ async function func(): Promise<void> {
//// [awaitCallExpression2_es6.js]
function func() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
"before";
var b = fn(yield p, a, a);
"after";
@@ -13,7 +13,7 @@ async function func(): Promise<void> {
//// [awaitCallExpression3_es6.js]
function func() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
"before";
var b = fn(a, yield p, a);
"after";
@@ -13,7 +13,7 @@ async function func(): Promise<void> {
//// [awaitCallExpression4_es6.js]
function func() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
"before";
var b = (yield pfn)(a, a, a);
"after";
@@ -13,7 +13,7 @@ async function func(): Promise<void> {
//// [awaitCallExpression5_es6.js]
function func() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
"before";
var b = o.fn(a, a, a);
"after";
@@ -13,7 +13,7 @@ async function func(): Promise<void> {
//// [awaitCallExpression6_es6.js]
function func() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
"before";
var b = o.fn(yield p, a, a);
"after";
@@ -13,7 +13,7 @@ async function func(): Promise<void> {
//// [awaitCallExpression7_es6.js]
function func() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
"before";
var b = o.fn(a, yield p, a);
"after";
@@ -13,7 +13,7 @@ async function func(): Promise<void> {
//// [awaitCallExpression8_es6.js]
function func() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
"before";
var b = (yield po).fn(a, a, a);
"after";
+1 -1
View File
@@ -14,7 +14,7 @@ async function f() {
//// [awaitUnion_es6.js]
function f() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
let await_a = yield a;
let await_b = yield b;
let await_c = yield c;
@@ -32,7 +32,7 @@ let x1 = () => { use("Test"); }
//// [reachabilityChecks7.js]
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new P(function (resolve, reject) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
@@ -41,26 +41,26 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
};
// async function without return type annotation - error
function f1() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
});
}
let x = function () {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
});
};
// async function with which promised type is void - return can be omitted
function f2() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
});
}
function f3(x) {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
if (x)
return 10;
});
}
function f4() {
return __awaiter(this, void 0, Promise, function* () {
return __awaiter(this, void 0, void 0, function* () {
});
}
function voidFunc() {