From 61ebcb49c7808030b78b01e0c85039a79290cf4b Mon Sep 17 00:00:00 2001 From: "Diogo Franco (Kovensky)" Date: Fri, 17 Mar 2017 10:25:37 +0900 Subject: [PATCH 01/33] Allow exporting a binding before its declaration --- src/compiler/checker.ts | 7 +++++++ tests/baselines/reference/exportBinding.js | 19 +++++++++++++++++++ .../baselines/reference/exportBinding.symbols | 14 ++++++++++++++ tests/baselines/reference/exportBinding.types | 15 +++++++++++++++ .../conformance/es6/modules/exportBinding.ts | 5 +++++ 5 files changed, 60 insertions(+) create mode 100644 tests/baselines/reference/exportBinding.js create mode 100644 tests/baselines/reference/exportBinding.symbols create mode 100644 tests/baselines/reference/exportBinding.types create mode 100644 tests/cases/conformance/es6/modules/exportBinding.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 00498191f28..736b3154fbc 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -742,6 +742,13 @@ namespace ts { // declaration is after usage, but it can still be legal if usage is deferred: // 1. inside a function // 2. inside an instance property initializer, a reference to a non-instance property + // 3. inside an export specifier + + if (usage.parent.kind === SyntaxKind.ExportSpecifier) { + // export specifiers do not use the variable, they only make it available for use + return true; + } + const container = getEnclosingBlockScopeContainer(declaration); const isInstanceProperty = declaration.kind === SyntaxKind.PropertyDeclaration && !(getModifierFlags(declaration) & ModifierFlags.Static); return isUsedInFunctionOrInstanceProperty(usage, isInstanceProperty, container); diff --git a/tests/baselines/reference/exportBinding.js b/tests/baselines/reference/exportBinding.js new file mode 100644 index 00000000000..5059c5356a3 --- /dev/null +++ b/tests/baselines/reference/exportBinding.js @@ -0,0 +1,19 @@ +//// [exportBinding.ts] +export { x } +const x = 'x' + +export { Y as Z } +class Y {} + + +//// [exportBinding.js] +"use strict"; +exports.__esModule = true; +var x = 'x'; +exports.x = x; +var Y = (function () { + function Y() { + } + return Y; +}()); +exports.Z = Y; diff --git a/tests/baselines/reference/exportBinding.symbols b/tests/baselines/reference/exportBinding.symbols new file mode 100644 index 00000000000..cb3b58a5776 --- /dev/null +++ b/tests/baselines/reference/exportBinding.symbols @@ -0,0 +1,14 @@ +=== tests/cases/conformance/es6/modules/exportBinding.ts === +export { x } +>x : Symbol(x, Decl(exportBinding.ts, 0, 8)) + +const x = 'x' +>x : Symbol(x, Decl(exportBinding.ts, 1, 5)) + +export { Y as Z } +>Y : Symbol(Z, Decl(exportBinding.ts, 3, 8)) +>Z : Symbol(Z, Decl(exportBinding.ts, 3, 8)) + +class Y {} +>Y : Symbol(Y, Decl(exportBinding.ts, 3, 17)) + diff --git a/tests/baselines/reference/exportBinding.types b/tests/baselines/reference/exportBinding.types new file mode 100644 index 00000000000..e2553ba1eaa --- /dev/null +++ b/tests/baselines/reference/exportBinding.types @@ -0,0 +1,15 @@ +=== tests/cases/conformance/es6/modules/exportBinding.ts === +export { x } +>x : "x" + +const x = 'x' +>x : "x" +>'x' : "x" + +export { Y as Z } +>Y : typeof Y +>Z : typeof Y + +class Y {} +>Y : Y + diff --git a/tests/cases/conformance/es6/modules/exportBinding.ts b/tests/cases/conformance/es6/modules/exportBinding.ts new file mode 100644 index 00000000000..1e6b0314f0b --- /dev/null +++ b/tests/cases/conformance/es6/modules/exportBinding.ts @@ -0,0 +1,5 @@ +export { x } +const x = 'x' + +export { Y as Z } +class Y {} From 1cf765d664ad78bd0a2b2daa89311b23ec58161e Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Mon, 27 Mar 2017 15:09:00 -0700 Subject: [PATCH 02/33] Lint for fallthrough in switch --- src/compiler/binder.ts | 6 ++++-- src/compiler/checker.ts | 17 +++++++++++------ src/compiler/parser.ts | 9 ++++++--- src/compiler/program.ts | 8 ++++---- src/compiler/scanner.ts | 6 +++++- src/compiler/transformers/module/system.ts | 2 +- src/compiler/utilities.ts | 9 ++++++--- src/compiler/visitor.ts | 6 ++++-- src/services/breakpoints.ts | 7 +++++-- src/services/classifier.ts | 2 +- src/services/codefixes/importFixes.ts | 3 ++- src/services/codefixes/unusedIdentifierFixes.ts | 2 ++ src/services/completions.ts | 2 +- src/services/documentHighlights.ts | 2 +- src/services/findAllReferences.ts | 4 ++-- src/services/formatting/formatting.ts | 5 ++--- src/services/outliningElementsCollector.ts | 2 +- src/services/services.ts | 5 +++-- src/services/utilities.ts | 2 +- tslint.json | 3 ++- 20 files changed, 64 insertions(+), 38 deletions(-) diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 650797c6dba..eb215ce158c 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -1413,6 +1413,7 @@ namespace ts { if (isObjectLiteralOrClassExpressionMethod(node)) { return ContainerFlags.IsContainer | ContainerFlags.IsControlFlowContainer | ContainerFlags.HasLocals | ContainerFlags.IsFunctionLike | ContainerFlags.IsObjectLiteralOrClassExpressionMethod; } + // falls through case SyntaxKind.Constructor: case SyntaxKind.FunctionDeclaration: case SyntaxKind.MethodSignature: @@ -1714,7 +1715,7 @@ namespace ts { declareModuleMember(node, symbolFlags, symbolExcludes); break; } - // fall through. + // falls through default: if (!blockScopeContainer.locals) { blockScopeContainer.locals = createMap(); @@ -2006,6 +2007,7 @@ namespace ts { bindBlockScopedDeclaration(parentNode, SymbolFlags.TypeAlias, SymbolFlags.TypeAliasExcludes); break; } + // falls through case SyntaxKind.ThisKeyword: if (currentFlow && (isExpression(node) || parent.kind === SyntaxKind.ShorthandPropertyAssignment)) { node.flowNode = currentFlow; @@ -2183,7 +2185,7 @@ namespace ts { if (!isFunctionLike(node.parent)) { return; } - // Fall through + // falls through case SyntaxKind.ModuleBlock: return updateStrictModeStatementList((node).statements); } diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 4e55a1c46b5..5dc8f83ff5b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -872,6 +872,7 @@ namespace ts { case SyntaxKind.SourceFile: if (!isExternalOrCommonJsModule(location)) break; isInExternalModule = true; + // falls through case SyntaxKind.ModuleDeclaration: const moduleExports = getSymbolOfNode(location).exports; if (location.kind === SyntaxKind.SourceFile || isAmbientModule(location)) { @@ -1872,6 +1873,7 @@ namespace ts { if (!isExternalOrCommonJsModule(location)) { break; } + // falls through case SyntaxKind.ModuleDeclaration: if (result = callback(getSymbolOfNode(location).exports)) { return result; @@ -3592,7 +3594,7 @@ namespace ts { // If the binding pattern is empty, this variable declaration is not visible return false; } - // Otherwise fall through + // falls through case SyntaxKind.ModuleDeclaration: case SyntaxKind.ClassDeclaration: case SyntaxKind.InterfaceDeclaration: @@ -3623,7 +3625,8 @@ namespace ts { // Private/protected properties/methods are not visible return false; } - // Public properties/methods are visible if its parents are visible, so const it fall into next case statement + // Public properties/methods are visible if its parents are visible, so + // falls through case SyntaxKind.Constructor: case SyntaxKind.ConstructSignature: @@ -20863,7 +20866,7 @@ namespace ts { } break; } - // fallthrough + // falls through case SyntaxKind.ClassDeclaration: case SyntaxKind.EnumDeclaration: case SyntaxKind.FunctionDeclaration: @@ -21498,6 +21501,7 @@ namespace ts { if (!isExternalOrCommonJsModule(location)) { break; } + // falls through case SyntaxKind.ModuleDeclaration: copySymbols(getSymbolOfNode(location).exports, meaning & SymbolFlags.ModuleMember); break; @@ -21509,7 +21513,8 @@ namespace ts { if (className) { copySymbol(location.symbol, meaning); } - // fall through; this fall-through is necessary because we would like to handle + // falls through + // this fall-through is necessary because we would like to handle // type parameter inside class expression similar to how we handle it in classDeclaration and interface Declaration case SyntaxKind.ClassDeclaration: case SyntaxKind.InterfaceDeclaration: @@ -21795,7 +21800,7 @@ namespace ts { return sig.thisParameter; } } - // fallthrough + // falls through case SyntaxKind.SuperKeyword: const type = isPartOfExpression(node) ? getTypeOfExpression(node) : getTypeFromTypeNode(node); @@ -21823,7 +21828,7 @@ namespace ts { if (isInJavaScriptFile(node) && isRequireCall(node.parent, /*checkArgumentIsStringLiteral*/ false)) { return resolveExternalModuleName(node, node); } - // Fall through + // falls through case SyntaxKind.NumericLiteral: // index access diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index ee74ce9c9a5..ffdfe67af87 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -3576,6 +3576,7 @@ namespace ts { if (isAwaitExpression()) { return parseAwaitExpression(); } + // falls through default: return parseIncrementExpression(); } @@ -3609,8 +3610,8 @@ namespace ts { if (sourceFile.languageVariant !== LanguageVariant.JSX) { return false; } - // We are in JSX context and the token is part of JSXElement. - // Fall through + // We are in JSX context and the token is part of JSXElement. + // falls through default: return true; } @@ -6557,7 +6558,8 @@ namespace ts { indent += scanner.getTokenText().length; break; } - // FALLTHROUGH otherwise to record the * as a comment + // record the * as a comment + // falls through default: state = JSDocState.SavingComments; // leading identifiers start recording as well pushComment(scanner.getTokenText()); @@ -6783,6 +6785,7 @@ namespace ts { break; case SyntaxKind.Identifier: canParseTag = false; + break; case SyntaxKind.EndOfFileToken: break; } diff --git a/src/compiler/program.ts b/src/compiler/program.ts index cffb6df1e3d..73d3c0ddb3a 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -941,8 +941,7 @@ namespace ts { diagnostics.push(createDiagnosticForNode(node, Diagnostics._0_can_only_be_used_in_a_ts_file, "?")); return; } - - // Pass through + // falls through case SyntaxKind.MethodDeclaration: case SyntaxKind.MethodSignature: case SyntaxKind.Constructor: @@ -1022,7 +1021,7 @@ namespace ts { diagnostics.push(createDiagnosticForNodeArray(nodes, Diagnostics.type_parameter_declarations_can_only_be_used_in_a_ts_file)); return; } - // pass through + // falls through case SyntaxKind.VariableStatement: // Check modifiers if (nodes === (parent).modifiers) { @@ -1070,7 +1069,8 @@ namespace ts { if (isConstValid) { continue; } - // Fallthrough to report error + // to report error, + // falls through case SyntaxKind.PublicKeyword: case SyntaxKind.PrivateKeyword: case SyntaxKind.ProtectedKeyword: diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 466074bdbcc..fe79a7bfab3 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -306,6 +306,7 @@ namespace ts { if (text.charCodeAt(pos) === CharacterCodes.lineFeed) { pos++; } + // falls through case CharacterCodes.lineFeed: result.push(lineStart); lineStart = pos; @@ -452,6 +453,7 @@ namespace ts { if (text.charCodeAt(pos + 1) === CharacterCodes.lineFeed) { pos++; } + // falls through case CharacterCodes.lineFeed: pos++; if (stopAfterLineBreak) { @@ -623,6 +625,7 @@ namespace ts { if (text.charCodeAt(pos + 1) === CharacterCodes.lineFeed) { pos++; } + // falls through case CharacterCodes.lineFeed: pos++; if (trailing) { @@ -1067,7 +1070,7 @@ namespace ts { if (pos < end && text.charCodeAt(pos) === CharacterCodes.lineFeed) { pos++; } - // fall through + // falls through case CharacterCodes.lineFeed: case CharacterCodes.lineSeparator: case CharacterCodes.paragraphSeparator: @@ -1449,6 +1452,7 @@ namespace ts { // This fall-through is a deviation from the EcmaScript grammar. The grammar says that a leading zero // can only be followed by an octal digit, a dot, or the end of the number literal. However, we are being // permissive and allowing decimal digits of the form 08* and 09* (which many browsers also do). + // falls through case CharacterCodes._1: case CharacterCodes._2: case CharacterCodes._3: diff --git a/src/compiler/transformers/module/system.ts b/src/compiler/transformers/module/system.ts index 642ac1ce6fb..e8c43853191 100644 --- a/src/compiler/transformers/module/system.ts +++ b/src/compiler/transformers/module/system.ts @@ -477,8 +477,8 @@ namespace ts { // module is imported only for side-effects, no emit required break; } + // falls through - // fall-through case SyntaxKind.ImportEqualsDeclaration: Debug.assert(importVariableName !== undefined); // save import into the local diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 33cb0d8f489..fb2a9c34aba 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -733,6 +733,7 @@ namespace ts { // At this point, node is either a qualified name or an identifier Debug.assert(node.kind === SyntaxKind.Identifier || node.kind === SyntaxKind.QualifiedName || node.kind === SyntaxKind.PropertyAccessExpression, "'node' was expected to be a qualified name, identifier or property access in 'isPartOfTypeNode'."); + // falls through case SyntaxKind.QualifiedName: case SyntaxKind.PropertyAccessExpression: case SyntaxKind.ThisKeyword: @@ -842,6 +843,7 @@ namespace ts { if (operand) { traverse(operand); } + return; case SyntaxKind.EnumDeclaration: case SyntaxKind.InterfaceDeclaration: case SyntaxKind.ModuleDeclaration: @@ -1059,7 +1061,7 @@ namespace ts { if (!includeArrowFunctions) { continue; } - // Fall through + // falls through case SyntaxKind.FunctionDeclaration: case SyntaxKind.FunctionExpression: case SyntaxKind.ModuleDeclaration: @@ -1118,6 +1120,7 @@ namespace ts { if (!stopOnFunctions) { continue; } + // falls through case SyntaxKind.PropertyDeclaration: case SyntaxKind.PropertySignature: case SyntaxKind.MethodDeclaration: @@ -1317,7 +1320,7 @@ namespace ts { if (node.parent.kind === SyntaxKind.TypeQuery || isJSXTagName(node)) { return true; } - // fall through + // falls through case SyntaxKind.NumericLiteral: case SyntaxKind.StringLiteral: case SyntaxKind.ThisKeyword: @@ -1995,7 +1998,7 @@ namespace ts { if (node.asteriskToken) { flags |= FunctionFlags.Generator; } - // fall through + // falls through case SyntaxKind.ArrowFunction: if (hasModifier(node, ModifierFlags.Async)) { flags |= FunctionFlags.Async; diff --git a/src/compiler/visitor.ts b/src/compiler/visitor.ts index 297d2cc0dde..b4b46a52fee 100644 --- a/src/compiler/visitor.ts +++ b/src/compiler/visitor.ts @@ -322,7 +322,7 @@ namespace ts { nodesVisitor((node).types, visitor, isTypeNode)); case SyntaxKind.ParenthesizedType: - Debug.fail("not implemented."); + throw Debug.fail("not implemented."); case SyntaxKind.TypeOperator: return updateTypeOperatorNode(node, visitNode((node).type, visitor, isTypeNode)); @@ -1289,6 +1289,7 @@ namespace ts { case SyntaxKind.JsxAttributes: result = reduceNodes((node).properties, cbNodes, result); + break; case SyntaxKind.JsxClosingElement: result = reduceNode((node).tagName, cbNode, result); @@ -1310,7 +1311,7 @@ namespace ts { // Clauses case SyntaxKind.CaseClause: result = reduceNode((node).expression, cbNode, result); - // fall-through + // falls through case SyntaxKind.DefaultClause: result = reduceNodes((node).statements, cbNodes, result); @@ -1344,6 +1345,7 @@ namespace ts { case SyntaxKind.EnumMember: result = reduceNode((node).name, cbNode, result); result = reduceNode((node).initializer, cbNode, result); + break; // Top-level nodes case SyntaxKind.SourceFile: diff --git a/src/services/breakpoints.ts b/src/services/breakpoints.ts index 1f6bec41109..7a49fd2ead7 100644 --- a/src/services/breakpoints.ts +++ b/src/services/breakpoints.ts @@ -97,7 +97,7 @@ namespace ts.BreakpointResolver { if (isFunctionBlock(node)) { return spanInFunctionBlock(node); } - // Fall through + // falls through case SyntaxKind.ModuleBlock: return spanInBlock(node); @@ -186,6 +186,7 @@ namespace ts.BreakpointResolver { if (getModuleInstanceState(node) !== ModuleInstanceState.Instantiated) { return undefined; } + // falls through case SyntaxKind.ClassDeclaration: case SyntaxKind.EnumDeclaration: @@ -473,6 +474,7 @@ namespace ts.BreakpointResolver { if (getModuleInstanceState(block.parent) !== ModuleInstanceState.Instantiated) { return undefined; } + // falls through // Set on parent if on same line otherwise on first statement case SyntaxKind.WhileStatement: @@ -582,6 +584,7 @@ namespace ts.BreakpointResolver { if (getModuleInstanceState(node.parent.parent) !== ModuleInstanceState.Instantiated) { return undefined; } + // falls through case SyntaxKind.EnumDeclaration: case SyntaxKind.ClassDeclaration: @@ -593,7 +596,7 @@ namespace ts.BreakpointResolver { // Span on close brace token return textSpan(node); } - // fall through + // falls through case SyntaxKind.CatchClause: return spanInNode(lastOrUndefined((node.parent).statements)); diff --git a/src/services/classifier.ts b/src/services/classifier.ts index c15b65b0c39..0deff253212 100644 --- a/src/services/classifier.ts +++ b/src/services/classifier.ts @@ -160,7 +160,7 @@ namespace ts { case EndOfLineState.InTemplateMiddleOrTail: text = "}\n" + text; offset = 2; - // fallthrough + // falls through case EndOfLineState.InTemplateSubstitutionPosition: templateStack.push(SyntaxKind.TemplateHead); break; diff --git a/src/services/codefixes/importFixes.ts b/src/services/codefixes/importFixes.ts index 0c1511ff1eb..804a41cda08 100644 --- a/src/services/codefixes/importFixes.ts +++ b/src/services/codefixes/importFixes.ts @@ -42,12 +42,13 @@ namespace ts.codefix { switch (this.compareModuleSpecifiers(existingAction.moduleSpecifier, newAction.moduleSpecifier)) { case ModuleSpecifierComparison.Better: - // the new one is not worth considering if it is a new improt. + // the new one is not worth considering if it is a new import. // However if it is instead a insertion into existing import, the user might want to use // the module specifier even it is worse by our standards. So keep it. if (newAction.kind === "NewImport") { return; } + // falls through case ModuleSpecifierComparison.Equal: // the current one is safe. But it is still possible that the new one is worse // than another existing one. For example, you may have new imports from "./foo/bar" diff --git a/src/services/codefixes/unusedIdentifierFixes.ts b/src/services/codefixes/unusedIdentifierFixes.ts index f77f9723d0f..c16de71c9c6 100644 --- a/src/services/codefixes/unusedIdentifierFixes.ts +++ b/src/services/codefixes/unusedIdentifierFixes.ts @@ -58,6 +58,8 @@ namespace ts.codefix { return deleteNodeInList(token.parent); } } + // TODO: #14885 + // falls through case SyntaxKind.TypeParameter: const typeParameters = (token.parent.parent).typeParameters; diff --git a/src/services/completions.ts b/src/services/completions.ts index 738c8b3b8bd..40e1c194111 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -485,7 +485,7 @@ namespace ts.Completions { // It has a left-hand side, so we're not in an opening JSX tag. break; } - // fall through + // falls through case SyntaxKind.JsxSelfClosingElement: case SyntaxKind.JsxElement: diff --git a/src/services/documentHighlights.ts b/src/services/documentHighlights.ts index 7308ad235fc..9108b3785ab 100644 --- a/src/services/documentHighlights.ts +++ b/src/services/documentHighlights.ts @@ -245,7 +245,7 @@ namespace ts.DocumentHighlights { if (statement.kind === SyntaxKind.ContinueStatement) { continue; } - // Fall through. + // falls through case SyntaxKind.ForStatement: case SyntaxKind.ForInStatement: case SyntaxKind.ForOfStatement: diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 5a471fb6f35..b91eddebb3e 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -956,7 +956,7 @@ namespace ts.FindAllReferences { if (isObjectLiteralMethod(searchSpaceNode)) { break; } - // fall through + // falls through case SyntaxKind.PropertyDeclaration: case SyntaxKind.PropertySignature: case SyntaxKind.Constructor: @@ -969,7 +969,7 @@ namespace ts.FindAllReferences { if (isExternalModule(searchSpaceNode)) { return undefined; } - // Fall through + // falls through case SyntaxKind.FunctionDeclaration: case SyntaxKind.FunctionExpression: break; diff --git a/src/services/formatting/formatting.ts b/src/services/formatting/formatting.ts index 4fa3b71a3a2..c0c5e179395 100644 --- a/src/services/formatting/formatting.ts +++ b/src/services/formatting/formatting.ts @@ -483,9 +483,8 @@ namespace ts.formatting { case SyntaxKind.MethodDeclaration: if ((node).asteriskToken) { return SyntaxKind.AsteriskToken; - }/* - fall-through - */ + } + // falls through case SyntaxKind.PropertyDeclaration: case SyntaxKind.Parameter: return (node).name.kind; diff --git a/src/services/outliningElementsCollector.ts b/src/services/outliningElementsCollector.ts index 43054a10f5d..5f17129db27 100644 --- a/src/services/outliningElementsCollector.ts +++ b/src/services/outliningElementsCollector.ts @@ -144,7 +144,7 @@ namespace ts.OutliningElementsCollector { }); break; } - // Fallthrough. + // falls through case SyntaxKind.ModuleBlock: { const openBrace = findChildOfKind(n, SyntaxKind.OpenBraceToken, sourceFile); diff --git a/src/services/services.ts b/src/services/services.ts index d8a4cbeae67..ae87b800afd 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -635,7 +635,7 @@ namespace ts { if (!hasModifier(node, ModifierFlags.ParameterPropertyModifier)) { break; } - // fall through + // falls through case SyntaxKind.VariableDeclaration: case SyntaxKind.BindingElement: { const decl = node; @@ -646,6 +646,7 @@ namespace ts { if (decl.initializer) visit(decl.initializer); } + // falls through case SyntaxKind.EnumMember: case SyntaxKind.PropertyDeclaration: case SyntaxKind.PropertySignature: @@ -2028,7 +2029,7 @@ namespace ts { if (node.parent.kind === SyntaxKind.ComputedPropertyName) { return isObjectLiteralElement(node.parent.parent) ? node.parent.parent : undefined; } - // intentionally fall through + // falls through case SyntaxKind.Identifier: return isObjectLiteralElement(node.parent) && (node.parent.parent.kind === SyntaxKind.ObjectLiteralExpression || node.parent.parent.kind === SyntaxKind.JsxAttributes) && diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 92b63656573..0450c8c24eb 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -450,7 +450,7 @@ namespace ts { if (!(n).arguments) { return true; } - // fall through + // falls through case SyntaxKind.CallExpression: case SyntaxKind.ParenthesizedExpression: case SyntaxKind.ParenthesizedType: diff --git a/tslint.json b/tslint.json index 920f6087909..6d1b5f29ca7 100644 --- a/tslint.json +++ b/tslint.json @@ -49,6 +49,7 @@ "no-increment-decrement": true, "object-literal-surrounding-space": true, "no-type-assertion-whitespace": true, - "no-in-operator": true + "no-in-operator": true, + "no-switch-case-fall-through": true } } From 84a316bce26ff97512973fb4aef2af4738b7f49b Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Tue, 28 Mar 2017 09:53:49 -0700 Subject: [PATCH 03/33] Add colon --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5dc8f83ff5b..9ee44d59ef3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3625,7 +3625,7 @@ namespace ts { // Private/protected properties/methods are not visible return false; } - // Public properties/methods are visible if its parents are visible, so + // Public properties/methods are visible if its parents are visible, so: // falls through case SyntaxKind.Constructor: From 7e03429a8e110efe5bb074ebe0e795b40f032b61 Mon Sep 17 00:00:00 2001 From: Arthur Ozga Date: Tue, 4 Apr 2017 15:51:13 -0700 Subject: [PATCH 04/33] enforce triple-equals --- src/compiler/checker.ts | 4 ++-- src/compiler/moduleNameResolver.ts | 2 +- src/compiler/program.ts | 4 ++-- src/compiler/tsc.ts | 6 +++--- src/compiler/utilities.ts | 2 +- src/harness/fourslash.ts | 8 ++++---- src/harness/harness.ts | 2 +- src/harness/projectsRunner.ts | 2 +- src/harness/sourceMapRecorder.ts | 8 ++++---- src/harness/unittests/tsserverProjectSystem.ts | 2 +- src/harness/unittests/versionCache.ts | 2 +- src/server/editorServices.ts | 6 +++--- src/server/project.ts | 2 +- src/server/scriptVersionCache.ts | 4 ++-- src/server/server.ts | 2 +- src/server/session.ts | 12 ++++++------ src/server/typingsCache.ts | 2 +- src/server/typingsInstaller/nodeTypingsInstaller.ts | 2 +- src/server/utilities.ts | 2 +- src/services/breakpoints.ts | 2 +- src/services/codefixes/fixAddMissingMember.ts | 2 +- .../codefixes/fixClassSuperMustPrecedeThisAccess.ts | 2 +- src/services/codefixes/unusedIdentifierFixes.ts | 2 +- src/services/completions.ts | 2 +- src/services/shims.ts | 6 +++--- src/services/signatureHelp.ts | 2 +- src/services/textChanges.ts | 2 +- src/services/utilities.ts | 4 ++-- tslint.json | 3 ++- 29 files changed, 51 insertions(+), 50 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7bdde91f286..c1d10f41f79 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -338,7 +338,7 @@ namespace ts { TypeofNEHostObject = 1 << 13, // typeof x !== "xxx" EQUndefined = 1 << 14, // x === undefined EQNull = 1 << 15, // x === null - EQUndefinedOrNull = 1 << 16, // x == undefined / x == null + EQUndefinedOrNull = 1 << 16, // x === undefined / x === null NEUndefined = 1 << 17, // x !== undefined NENull = 1 << 18, // x !== null NEUndefinedOrNull = 1 << 19, // x != undefined / x != null @@ -17506,7 +17506,7 @@ namespace ts { function checkObjectTypeForDuplicateDeclarations(node: TypeLiteralNode | InterfaceDeclaration) { const names = createMap(); for (const member of node.members) { - if (member.kind == SyntaxKind.PropertySignature) { + if (member.kind === SyntaxKind.PropertySignature) { let memberName: string; switch (member.name.kind) { case SyntaxKind.StringLiteral: diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts index 699919e0566..99d7a914880 100644 --- a/src/compiler/moduleNameResolver.ts +++ b/src/compiler/moduleNameResolver.ts @@ -378,7 +378,7 @@ namespace ts { directoryPathMap.set(parent, result); current = parent; - if (current == commonPrefix) { + if (current === commonPrefix) { break; } } diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 31fc665649a..ea3110e5a6a 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -557,7 +557,7 @@ namespace ts { // combine results of resolutions and predicted results let j = 0; for (let i = 0; i < result.length; i++) { - if (result[i] == predictedToResolveToAmbientModuleMarker) { + if (result[i] === predictedToResolveToAmbientModuleMarker) { result[i] = undefined; } else { @@ -1364,7 +1364,7 @@ namespace ts { // If the file was previously found via a node_modules search, but is now being processed as a root file, // then everything it sucks in may also be marked incorrectly, and needs to be checked again. - if (file && sourceFilesFoundSearchingNodeModules.get(file.path) && currentNodeModulesDepth == 0) { + if (file && sourceFilesFoundSearchingNodeModules.get(file.path) && currentNodeModulesDepth === 0) { sourceFilesFoundSearchingNodeModules.set(file.path, false); if (!options.noResolve) { processReferencedFiles(file, isDefaultLib); diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 4fd3ecb02bb..eb84b4ccb41 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -30,7 +30,7 @@ namespace ts { } function reportEmittedFiles(files: string[]): void { - if (!files || files.length == 0) { + if (!files || files.length === 0) { return; } @@ -282,7 +282,7 @@ namespace ts { // When the configFileName is just "tsconfig.json", the watched directory should be // the current directory; if there is a given "project" parameter, then the configFileName // is an absolute file name. - directory == "" ? "." : directory, + directory === "" ? "." : directory, watchedDirectoryChanged, /*recursive*/ true); } } @@ -334,7 +334,7 @@ namespace ts { // When the configFileName is just "tsconfig.json", the watched directory should be // the current directory; if there is a given "project" parameter, then the configFileName // is an absolute file name. - directory == "" ? "." : directory, + directory === "" ? "." : directory, watchedDirectoryChanged, /*recursive*/ true); }; } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 5c6e519519b..b5eea24782a 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -4658,7 +4658,7 @@ namespace ts { */ export function getParseTreeNode(node: Node, nodeTest?: (node: Node) => node is T): T; export function getParseTreeNode(node: Node, nodeTest?: (node: Node) => boolean): Node { - if (node == undefined || isParseTreeNode(node)) { + if (node === undefined || isParseTreeNode(node)) { return node; } diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 499c854b091..482b18274ec 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -2275,13 +2275,13 @@ namespace FourSlash { public verifyImportFixAtPosition(expectedTextArray: string[], errorCode?: number) { const ranges = this.getRanges(); - if (ranges.length == 0) { + if (ranges.length === 0) { this.raiseError("At least one range should be specified in the testfile."); } const codeFixes = this.getCodeFixActions(this.activeFile.fileName, errorCode); - if (!codeFixes || codeFixes.length == 0) { + if (!codeFixes || codeFixes.length === 0) { this.raiseError("No codefixes returned."); } @@ -2646,7 +2646,7 @@ namespace FourSlash { private assertItemInCompletionList(items: ts.CompletionEntry[], name: string, text?: string, documentation?: string, kind?: string, spanIndex?: number) { for (const item of items) { if (item.name === name) { - if (documentation != undefined || text !== undefined) { + if (documentation !== undefined || text !== undefined) { const details = this.getCompletionEntryDetails(item.name); if (documentation !== undefined) { @@ -2899,7 +2899,7 @@ ${code} } // TODO: should be '==='? } - else if (line == "" || lineLength === 0) { + else if (line === "" || lineLength === 0) { // Previously blank lines between fourslash content caused it to be considered as 2 files, // Remove this behavior since it just causes errors now } diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 2c4eef1739d..c0ef2672b27 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -1933,7 +1933,7 @@ namespace Harness { } const parentDirectory = IO.directoryName(dirName); - if (parentDirectory != "") { + if (parentDirectory !== "") { createDirectoryStructure(parentDirectory); } IO.createDirectory(dirName); diff --git a/src/harness/projectsRunner.ts b/src/harness/projectsRunner.ts index f1cc992c4a7..0b032832194 100644 --- a/src/harness/projectsRunner.ts +++ b/src/harness/projectsRunner.ts @@ -112,7 +112,7 @@ class ProjectRunner extends RunnerBase { // Replace the disk specific path into the project root path url = url.substr(diskProjectPath.length); // TODO: should be '!=='? - if (url.charCodeAt(0) != ts.CharacterCodes.slash) { + if (url.charCodeAt(0) !== ts.CharacterCodes.slash) { url = "/" + url; } } diff --git a/src/harness/sourceMapRecorder.ts b/src/harness/sourceMapRecorder.ts index 0ef9f7eb49f..e2fce98da9e 100644 --- a/src/harness/sourceMapRecorder.ts +++ b/src/harness/sourceMapRecorder.ts @@ -50,11 +50,11 @@ namespace Harness.SourceMapRecorder { return true; } - if (sourceMapMappings.charAt(decodingIndex) == ",") { + if (sourceMapMappings.charAt(decodingIndex) === ",") { return true; } - if (sourceMapMappings.charAt(decodingIndex) == ";") { + if (sourceMapMappings.charAt(decodingIndex) === ";") { return true; } @@ -117,7 +117,7 @@ namespace Harness.SourceMapRecorder { } while (decodingIndex < sourceMapMappings.length) { - if (sourceMapMappings.charAt(decodingIndex) == ";") { + if (sourceMapMappings.charAt(decodingIndex) === ";") { // New line decodeOfEncodedMapping.emittedLine++; decodeOfEncodedMapping.emittedColumn = 1; @@ -125,7 +125,7 @@ namespace Harness.SourceMapRecorder { continue; } - if (sourceMapMappings.charAt(decodingIndex) == ",") { + if (sourceMapMappings.charAt(decodingIndex) === ",") { // Next entry is on same line - no action needed decodingIndex++; continue; diff --git a/src/harness/unittests/tsserverProjectSystem.ts b/src/harness/unittests/tsserverProjectSystem.ts index b78fa094571..839097f7e61 100644 --- a/src/harness/unittests/tsserverProjectSystem.ts +++ b/src/harness/unittests/tsserverProjectSystem.ts @@ -3144,7 +3144,7 @@ namespace ts.projectSystem { checkNumberOfInferredProjects(projectService, 1); const configuredProject = projectService.configuredProjects[0]; - assert.isTrue(configuredProject.getFileNames().length == 0); + assert.isTrue(configuredProject.getFileNames().length === 0); const inferredProject = projectService.inferredProjects[0]; assert.isTrue(inferredProject.containsFile(file1.path)); diff --git a/src/harness/unittests/versionCache.ts b/src/harness/unittests/versionCache.ts index 17a70f59d59..ca64ea1118f 100644 --- a/src/harness/unittests/versionCache.ts +++ b/src/harness/unittests/versionCache.ts @@ -278,7 +278,7 @@ and grew 1cm per day`; const insertString = testContent.substring(rsa[i], rsa[i] + las[i]); svc.edit(ersa[i], elas[i], insertString); checkText = editFlat(ersa[i], elas[i], insertString, checkText); - if (0 == (i % 4)) { + if (0 === (i % 4)) { const snap = svc.getSnapshot(); const snapText = snap.getText(0, checkText.length); assert.equal(checkText, snapText); diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 30c7a87dc74..12eae74d602 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -204,7 +204,7 @@ namespace ts.server { startWatchingContainingDirectoriesForFile(fileName: string, project: InferredProject, callback: (fileName: string) => void) { let currentPath = getDirectoryPath(fileName); let parentPath = getDirectoryPath(currentPath); - while (currentPath != parentPath) { + while (currentPath !== parentPath) { if (!this.directoryWatchersForTsconfig.has(currentPath)) { this.projectService.logger.info(`Add watcher for: ${currentPath}`); this.directoryWatchersForTsconfig.set(currentPath, this.projectService.host.watchDirectory(currentPath, callback)); @@ -540,7 +540,7 @@ namespace ts.server { */ private onConfigFileAddedForInferredProject(fileName: string) { // TODO: check directory separators - if (getBaseFileName(fileName) != "tsconfig.json") { + if (getBaseFileName(fileName) !== "tsconfig.json") { this.logger.info(`${fileName} is not tsconfig.json`); return; } @@ -950,7 +950,7 @@ namespace ts.server { const scriptKind = propertyReader.getScriptKind(f); const hasMixedContent = propertyReader.hasMixedContent(f, this.hostConfiguration.extraFileExtensions); if (this.host.fileExists(rootFilename)) { - const info = this.getOrCreateScriptInfoForNormalizedPath(toNormalizedPath(rootFilename), /*openedByClient*/ clientFileName == rootFilename, /*fileContent*/ undefined, scriptKind, hasMixedContent); + const info = this.getOrCreateScriptInfoForNormalizedPath(toNormalizedPath(rootFilename), /*openedByClient*/ clientFileName === rootFilename, /*fileContent*/ undefined, scriptKind, hasMixedContent); project.addRoot(info); } else { diff --git a/src/server/project.ts b/src/server/project.ts index e57e605d65b..9e3e6e6a892 100644 --- a/src/server/project.ts +++ b/src/server/project.ts @@ -643,7 +643,7 @@ namespace ts.server { // check if requested version is the same that we have reported last time if (this.lastReportedFileNames && lastKnownVersion === this.lastReportedVersion) { // if current structure version is the same - return info without any changes - if (this.projectStructureVersion == this.lastReportedVersion && !updatedFileNames) { + if (this.projectStructureVersion === this.lastReportedVersion && !updatedFileNames) { return { info, projectErrors: this.projectErrors }; } // compute and return the difference diff --git a/src/server/scriptVersionCache.ts b/src/server/scriptVersionCache.ts index 7f09bcd549b..35266591098 100644 --- a/src/server/scriptVersionCache.ts +++ b/src/server/scriptVersionCache.ts @@ -79,7 +79,7 @@ namespace ts.server { const lm = LineIndex.linesFromText(insertedText); const lines = lm.lines; if (lines.length > 1) { - if (lines[lines.length - 1] == "") { + if (lines[lines.length - 1] === "") { lines.length--; } } @@ -570,7 +570,7 @@ namespace ts.server { } if (this.checkEdits) { const updatedText = this.getText(0, this.root.charCount()); - Debug.assert(checkText == updatedText, "buffer edit mismatch"); + Debug.assert(checkText === updatedText, "buffer edit mismatch"); } return walker.lineIndex; } diff --git a/src/server/server.ts b/src/server/server.ts index e38f82f35f6..f5244c3b367 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -367,7 +367,7 @@ namespace ts.server { } this.projectService.updateTypingsForProject(response); - if (response.kind == ActionSet && this.socket) { + if (response.kind === ActionSet && this.socket) { this.sendEvent(0, "setTypings", response); } } diff --git a/src/server/session.ts b/src/server/session.ts index 4cdddc831a1..fa44405ef36 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -49,7 +49,7 @@ namespace ts.server { if (a.file < b.file) { return -1; } - else if (a.file == b.file) { + else if (a.file === b.file) { const n = compareNumber(a.start.line, b.start.line); if (n === 0) { return compareNumber(a.start.offset, b.start.offset); @@ -1084,7 +1084,7 @@ namespace ts.server { // getFormattingEditsAfterKeystroke either empty or pertaining // only to the previous line. If all this is true, then // add edits necessary to properly indent the current line. - if ((args.key == "\n") && ((!edits) || (edits.length === 0) || allEditsBeforePos(edits, position))) { + if ((args.key === "\n") && ((!edits) || (edits.length === 0) || allEditsBeforePos(edits, position))) { const lineInfo = scriptInfo.getLineInfo(args.line); if (lineInfo && (lineInfo.leaf) && (lineInfo.leaf.text)) { const lineText = lineInfo.leaf.text; @@ -1093,10 +1093,10 @@ namespace ts.server { let hasIndent = 0; let i: number, len: number; for (i = 0, len = lineText.length; i < len; i++) { - if (lineText.charAt(i) == " ") { + if (lineText.charAt(i) === " ") { hasIndent++; } - else if (lineText.charAt(i) == "\t") { + else if (lineText.charAt(i) === "\t") { hasIndent += formatOptions.tabSize; } else { @@ -1499,7 +1499,7 @@ namespace ts.server { const normalizedFileName = toNormalizedPath(fileName); const project = this.projectService.getDefaultProjectForFile(normalizedFileName, /*refreshInferredProjects*/ true); for (const fileNameInProject of fileNamesInProject) { - if (this.getCanonicalFileName(fileNameInProject) == this.getCanonicalFileName(fileName)) + if (this.getCanonicalFileName(fileNameInProject) === this.getCanonicalFileName(fileName)) highPriorityFiles.push(fileNameInProject); else { const info = this.projectService.getScriptInfo(fileNameInProject); @@ -1520,7 +1520,7 @@ namespace ts.server { const checkList = fileNamesInProject.map(fileName => ({ fileName, project })); // Project level error analysis runs on background files too, therefore // doesn't require the file to be opened - this.updateErrorCheck(next, checkList, this.changeSeq, (n) => n == this.changeSeq, delay, 200, /*requireOpen*/ false); + this.updateErrorCheck(next, checkList, this.changeSeq, (n) => n === this.changeSeq, delay, 200, /*requireOpen*/ false); } } diff --git a/src/server/typingsCache.ts b/src/server/typingsCache.ts index 9379ae82d0e..a97b12ff7a8 100644 --- a/src/server/typingsCache.ts +++ b/src/server/typingsCache.ts @@ -61,7 +61,7 @@ namespace ts.server { function compilerOptionsChanged(opt1: CompilerOptions, opt2: CompilerOptions): boolean { // TODO: add more relevant properties - return opt1.allowJs != opt2.allowJs; + return opt1.allowJs !== opt2.allowJs; } function unresolvedImportsChanged(imports1: SortedReadonlyArray, imports2: SortedReadonlyArray): boolean { diff --git a/src/server/typingsInstaller/nodeTypingsInstaller.ts b/src/server/typingsInstaller/nodeTypingsInstaller.ts index 1018b37d90d..895a4e17cc7 100644 --- a/src/server/typingsInstaller/nodeTypingsInstaller.ts +++ b/src/server/typingsInstaller/nodeTypingsInstaller.ts @@ -31,7 +31,7 @@ namespace ts.server.typingsInstaller { } function getNPMLocation(processName: string) { - if (path.basename(processName).indexOf("node") == 0) { + if (path.basename(processName).indexOf("node") === 0) { return `"${path.join(path.dirname(process.argv[0]), "npm")}"`; } else { diff --git a/src/server/utilities.ts b/src/server/utilities.ts index af1f8e9826f..0f0c2e236c8 100644 --- a/src/server/utilities.ts +++ b/src/server/utilities.ts @@ -219,7 +219,7 @@ namespace ts.server { } public scheduleCollect() { - if (!this.host.gc || this.timerId != undefined) { + if (!this.host.gc || this.timerId !== undefined) { // no global.gc or collection was already scheduled - skip this request return; } diff --git a/src/services/breakpoints.ts b/src/services/breakpoints.ts index 1f6bec41109..1f0b3add897 100644 --- a/src/services/breakpoints.ts +++ b/src/services/breakpoints.ts @@ -264,7 +264,7 @@ namespace ts.BreakpointResolver { // a or ...c or d: x from // [a, b, ...c] or { a, b } or { d: x } from destructuring pattern if ((node.kind === SyntaxKind.Identifier || - node.kind == SyntaxKind.SpreadElement || + node.kind === SyntaxKind.SpreadElement || node.kind === SyntaxKind.PropertyAssignment || node.kind === SyntaxKind.ShorthandPropertyAssignment) && isArrayLiteralOrObjectLiteralDestructuringPattern(node.parent)) { diff --git a/src/services/codefixes/fixAddMissingMember.ts b/src/services/codefixes/fixAddMissingMember.ts index ec772e1e29e..7beae849d5e 100644 --- a/src/services/codefixes/fixAddMissingMember.ts +++ b/src/services/codefixes/fixAddMissingMember.ts @@ -14,7 +14,7 @@ namespace ts.codefix { // ^^^^^^^ const token = getTokenAtPosition(sourceFile, start); - if (token.kind != SyntaxKind.Identifier) { + if (token.kind !== SyntaxKind.Identifier) { return undefined; } diff --git a/src/services/codefixes/fixClassSuperMustPrecedeThisAccess.ts b/src/services/codefixes/fixClassSuperMustPrecedeThisAccess.ts index fc2be3cd0c2..2217dda8b0c 100644 --- a/src/services/codefixes/fixClassSuperMustPrecedeThisAccess.ts +++ b/src/services/codefixes/fixClassSuperMustPrecedeThisAccess.ts @@ -18,7 +18,7 @@ namespace ts.codefix { // figure out if the `this` access is actually inside the supercall // i.e. super(this.a), since in that case we won't suggest a fix - if (superCall.expression && superCall.expression.kind == SyntaxKind.CallExpression) { + if (superCall.expression && superCall.expression.kind === SyntaxKind.CallExpression) { const arguments = (superCall.expression).arguments; for (let i = 0; i < arguments.length; i++) { if ((arguments[i]).expression === token) { diff --git a/src/services/codefixes/unusedIdentifierFixes.ts b/src/services/codefixes/unusedIdentifierFixes.ts index f77f9723d0f..70d61f2be2a 100644 --- a/src/services/codefixes/unusedIdentifierFixes.ts +++ b/src/services/codefixes/unusedIdentifierFixes.ts @@ -125,7 +125,7 @@ namespace ts.codefix { case SyntaxKind.NamespaceImport: const namespaceImport = token.parent; - if (namespaceImport.name == token && !(namespaceImport.parent).name) { + if (namespaceImport.name === token && !(namespaceImport.parent).name) { const importDecl = getAncestor(namespaceImport, SyntaxKind.ImportDeclaration); return deleteNode(importDecl); } diff --git a/src/services/completions.ts b/src/services/completions.ts index 67890a9b000..c06a4f9504a 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -1311,7 +1311,7 @@ namespace ts.Completions { } function isEqualityOperatorKind(kind: SyntaxKind) { - return kind == SyntaxKind.EqualsEqualsToken || + return kind === SyntaxKind.EqualsEqualsToken || kind === SyntaxKind.ExclamationEqualsToken || kind === SyntaxKind.EqualsEqualsEqualsToken || kind === SyntaxKind.ExclamationEqualsEqualsToken; diff --git a/src/services/shims.ts b/src/services/shims.ts index de2fd39b8a8..b2222628735 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -293,7 +293,7 @@ namespace ts { const oldSnapshotShim = oldSnapshot; const encoded = this.scriptSnapshotShim.getChangeRange(oldSnapshotShim.scriptSnapshotShim); // TODO: should this be '==='? - if (encoded == null) { + if (encoded === null) { return null; } @@ -382,7 +382,7 @@ namespace ts { public getCompilationSettings(): CompilerOptions { const settingsJson = this.shimHost.getCompilationSettings(); // TODO: should this be '==='? - if (settingsJson == null || settingsJson == "") { + if (settingsJson === null || settingsJson === "") { throw Error("LanguageServiceShimHostAdapter.getCompilationSettings: empty compilationSettings"); } const compilerOptions = JSON.parse(settingsJson); @@ -416,7 +416,7 @@ namespace ts { public getLocalizedDiagnosticMessages(): any { const diagnosticMessagesJson = this.shimHost.getLocalizedDiagnosticMessages(); - if (diagnosticMessagesJson == null || diagnosticMessagesJson == "") { + if (diagnosticMessagesJson === null || diagnosticMessagesJson === "") { return null; } diff --git a/src/services/signatureHelp.ts b/src/services/signatureHelp.ts index 7b2abc6123c..1487bb410a5 100644 --- a/src/services/signatureHelp.ts +++ b/src/services/signatureHelp.ts @@ -56,7 +56,7 @@ namespace ts.SignatureHelp { // break; // case TypeScript.SyntaxKind.CommaToken: - // if (stack == 0) { + // if (stack === 0) { // argumentIndex++; // } diff --git a/src/services/textChanges.ts b/src/services/textChanges.ts index afc98927495..f19fa548964 100644 --- a/src/services/textChanges.ts +++ b/src/services/textChanges.ts @@ -465,7 +465,7 @@ namespace ts.textChanges { change.options.indentation !== undefined ? change.options.indentation : change.useIndentationFromFile - ? formatting.SmartIndenter.getIndentation(change.range.pos, sourceFile, formatOptions, posStartsLine || (change.options.prefix == this.newLineCharacter)) + ? formatting.SmartIndenter.getIndentation(change.range.pos, sourceFile, formatOptions, posStartsLine || (change.options.prefix === this.newLineCharacter)) : 0; const delta = change.options.delta !== undefined diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 2c48cd79b9b..53dd1d479cd 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -911,10 +911,10 @@ namespace ts { // Internally, we represent the end of the comment at the newline and closing '/', respectively. return predicate ? forEach(commentRanges, c => c.pos < position && - (c.kind == SyntaxKind.SingleLineCommentTrivia ? position <= c.end : position < c.end) && + (c.kind === SyntaxKind.SingleLineCommentTrivia ? position <= c.end : position < c.end) && predicate(c)) : forEach(commentRanges, c => c.pos < position && - (c.kind == SyntaxKind.SingleLineCommentTrivia ? position <= c.end : position < c.end)); + (c.kind === SyntaxKind.SingleLineCommentTrivia ? position <= c.end : position < c.end)); } return false; diff --git a/tslint.json b/tslint.json index be722309a24..b3a5664c1ad 100644 --- a/tslint.json +++ b/tslint.json @@ -59,6 +59,7 @@ "no-increment-decrement": true, "object-literal-surrounding-space": true, "no-type-assertion-whitespace": true, - "no-in-operator": true + "no-in-operator": true, + "triple-equals": true } } From 3b6da51a81dccd18ad44dca975d8eb730b154eea Mon Sep 17 00:00:00 2001 From: Arthur Ozga Date: Wed, 5 Apr 2017 11:39:59 -0700 Subject: [PATCH 05/33] remove TODO's --- src/compiler/utilities.ts | 2 +- src/harness/fourslash.ts | 1 - src/harness/projectsRunner.ts | 1 - src/services/shims.ts | 4 +--- 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index b5eea24782a..de54668cc8e 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -4482,7 +4482,7 @@ namespace ts { newEndN = Math.max(newEnd2, newEnd2 + (newEnd1 - oldEnd2)); } - return createTextChangeRange(createTextSpanFromBounds(oldStartN, oldEndN), /*newLength:*/ newEndN - oldStartN); + return createTextChangeRange(createTextSpanFromBounds(oldStartN, oldEndN), /*newLength*/ newEndN - oldStartN); } export function getTypeParameterOwner(d: Declaration): Declaration { diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 482b18274ec..59144237527 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -2897,7 +2897,6 @@ ${code} } } } - // TODO: should be '==='? } else if (line === "" || lineLength === 0) { // Previously blank lines between fourslash content caused it to be considered as 2 files, diff --git a/src/harness/projectsRunner.ts b/src/harness/projectsRunner.ts index 0b032832194..b0efcf4c389 100644 --- a/src/harness/projectsRunner.ts +++ b/src/harness/projectsRunner.ts @@ -111,7 +111,6 @@ class ProjectRunner extends RunnerBase { else if (url.indexOf(diskProjectPath) === 0) { // Replace the disk specific path into the project root path url = url.substr(diskProjectPath.length); - // TODO: should be '!=='? if (url.charCodeAt(0) !== ts.CharacterCodes.slash) { url = "/" + url; } diff --git a/src/services/shims.ts b/src/services/shims.ts index b2222628735..801edddb2f9 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -37,7 +37,7 @@ namespace ts { * * Or undefined value if there was no change. */ - getChangeRange(oldSnapshot: ScriptSnapshotShim): string; + getChangeRange(oldSnapshot: ScriptSnapshotShim): string | undefined; /** Releases all resources held by this script snapshot */ dispose?(): void; @@ -292,7 +292,6 @@ namespace ts { public getChangeRange(oldSnapshot: IScriptSnapshot): TextChangeRange { const oldSnapshotShim = oldSnapshot; const encoded = this.scriptSnapshotShim.getChangeRange(oldSnapshotShim.scriptSnapshotShim); - // TODO: should this be '==='? if (encoded === null) { return null; } @@ -381,7 +380,6 @@ namespace ts { public getCompilationSettings(): CompilerOptions { const settingsJson = this.shimHost.getCompilationSettings(); - // TODO: should this be '==='? if (settingsJson === null || settingsJson === "") { throw Error("LanguageServiceShimHostAdapter.getCompilationSettings: empty compilationSettings"); } From 8ec593aec2504a2257069032e14c1f9d7454b12c Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Thu, 6 Apr 2017 08:01:15 -0700 Subject: [PATCH 06/33] Support @types module resolution from scoped packages --- src/compiler/diagnosticMessages.json | 4 +++ src/compiler/moduleNameResolver.ts | 15 +++++++++- .../library-reference-scoped-packages.js | 11 +++++++ .../library-reference-scoped-packages.symbols | 7 +++++ ...brary-reference-scoped-packages.trace.json | 12 ++++++++ .../library-reference-scoped-packages.types | 8 +++++ tests/baselines/reference/scopedPackages.js | 20 +++++++++++++ .../reference/scopedPackages.symbols | 22 ++++++++++++++ .../reference/scopedPackages.trace.json | 30 +++++++++++++++++++ .../baselines/reference/scopedPackages.types | 22 ++++++++++++++ .../reference/scopedPackagesClassic.js | 12 ++++++++ .../reference/scopedPackagesClassic.symbols | 8 +++++ .../scopedPackagesClassic.trace.json | 9 ++++++ .../reference/scopedPackagesClassic.types | 9 ++++++ .../moduleResolution/scopedPackages.ts | 17 +++++++++++ .../moduleResolution/scopedPackagesClassic.ts | 10 +++++++ .../library-reference-scoped-packages.ts | 9 ++++++ 17 files changed, 224 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/library-reference-scoped-packages.js create mode 100644 tests/baselines/reference/library-reference-scoped-packages.symbols create mode 100644 tests/baselines/reference/library-reference-scoped-packages.trace.json create mode 100644 tests/baselines/reference/library-reference-scoped-packages.types create mode 100644 tests/baselines/reference/scopedPackages.js create mode 100644 tests/baselines/reference/scopedPackages.symbols create mode 100644 tests/baselines/reference/scopedPackages.trace.json create mode 100644 tests/baselines/reference/scopedPackages.types create mode 100644 tests/baselines/reference/scopedPackagesClassic.js create mode 100644 tests/baselines/reference/scopedPackagesClassic.symbols create mode 100644 tests/baselines/reference/scopedPackagesClassic.trace.json create mode 100644 tests/baselines/reference/scopedPackagesClassic.types create mode 100644 tests/cases/conformance/moduleResolution/scopedPackages.ts create mode 100644 tests/cases/conformance/moduleResolution/scopedPackagesClassic.ts create mode 100644 tests/cases/conformance/references/library-reference-scoped-packages.ts diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 075d4247460..6a5b6fa7526 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3177,6 +3177,10 @@ "category": "Message", "code": 6181 }, + "Scoped package detected, looking in '{0}'": { + "category": "Message", + "code": "6182" + }, "Variable '{0}' implicitly has an '{1}' type.": { "category": "Error", diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts index 5280c794725..44779c3b482 100644 --- a/src/compiler/moduleNameResolver.ts +++ b/src/compiler/moduleNameResolver.ts @@ -954,10 +954,23 @@ namespace ts { } nodeModulesAtTypesExists = false; } - return loadModuleFromNodeModulesFolder(Extensions.DtsOnly, moduleName, nodeModulesAtTypes, nodeModulesAtTypesExists, failedLookupLocations, state); + return loadModuleFromNodeModulesFolder(Extensions.DtsOnly, mangleScopedPackage(moduleName, state.host), nodeModulesAtTypes, nodeModulesAtTypesExists, failedLookupLocations, state); } } + /** For a scoped package, we must look in `@types/foo__bar` instead of `@types/@foo/bar`. */ + function mangleScopedPackage(moduleName: string, host: ModuleResolutionHost): string { + if (startsWith(moduleName, "@")) { + const replaceSlash = moduleName.replace(ts.directorySeparator, "__"); + if (replaceSlash !== moduleName) { + const mangled = replaceSlash.slice(1); // Take off the "@" + trace(host, Diagnostics.Scoped_package_detected_looking_in_0, mangled); + return mangled; + } + } + return moduleName; + } + function tryFindNonRelativeModuleNameInCache(cache: PerModuleNameCache | undefined, moduleName: string, containingDirectory: string, traceEnabled: boolean, host: ModuleResolutionHost): SearchResult { const result = cache && cache.get(containingDirectory); if (result) { diff --git a/tests/baselines/reference/library-reference-scoped-packages.js b/tests/baselines/reference/library-reference-scoped-packages.js new file mode 100644 index 00000000000..3019008c16b --- /dev/null +++ b/tests/baselines/reference/library-reference-scoped-packages.js @@ -0,0 +1,11 @@ +//// [tests/cases/conformance/references/library-reference-scoped-packages.ts] //// + +//// [index.d.ts] +export const y = 0; + +//// [a.ts] +/// + + +//// [a.js] +/// diff --git a/tests/baselines/reference/library-reference-scoped-packages.symbols b/tests/baselines/reference/library-reference-scoped-packages.symbols new file mode 100644 index 00000000000..60ccaab89d2 --- /dev/null +++ b/tests/baselines/reference/library-reference-scoped-packages.symbols @@ -0,0 +1,7 @@ +=== /a.ts === +/// +No type information for this code. +No type information for this code.=== /node_modules/@types/beep__boop/index.d.ts === +export const y = 0; +>y : Symbol(y, Decl(index.d.ts, 0, 12)) + diff --git a/tests/baselines/reference/library-reference-scoped-packages.trace.json b/tests/baselines/reference/library-reference-scoped-packages.trace.json new file mode 100644 index 00000000000..54dcf95fe50 --- /dev/null +++ b/tests/baselines/reference/library-reference-scoped-packages.trace.json @@ -0,0 +1,12 @@ +[ + "======== Resolving type reference directive '@beep/boop', containing file '/a.ts', root directory 'types'. ========", + "Resolving with primary search path 'types'.", + "Directory 'types/@beep' does not exist, skipping all lookups in it.", + "Looking up in 'node_modules' folder, initial location '/'.", + "Scoped package detected, looking in 'beep__boop'", + "File '/node_modules/@types/beep__boop.d.ts' does not exist.", + "File '/node_modules/@types/beep__boop/package.json' does not exist.", + "File '/node_modules/@types/beep__boop/index.d.ts' exist - use it as a name resolution result.", + "Resolving real path for '/node_modules/@types/beep__boop/index.d.ts', result '/node_modules/@types/beep__boop/index.d.ts'.", + "======== Type reference directive '@beep/boop' was successfully resolved to '/node_modules/@types/beep__boop/index.d.ts', primary: false. ========" +] \ No newline at end of file diff --git a/tests/baselines/reference/library-reference-scoped-packages.types b/tests/baselines/reference/library-reference-scoped-packages.types new file mode 100644 index 00000000000..bbb3062d98b --- /dev/null +++ b/tests/baselines/reference/library-reference-scoped-packages.types @@ -0,0 +1,8 @@ +=== /a.ts === +/// +No type information for this code. +No type information for this code.=== /node_modules/@types/beep__boop/index.d.ts === +export const y = 0; +>y : 0 +>0 : 0 + diff --git a/tests/baselines/reference/scopedPackages.js b/tests/baselines/reference/scopedPackages.js new file mode 100644 index 00000000000..75606d2e1b9 --- /dev/null +++ b/tests/baselines/reference/scopedPackages.js @@ -0,0 +1,20 @@ +//// [tests/cases/conformance/moduleResolution/scopedPackages.ts] //// + +//// [index.d.ts] +export const x: number; + +//// [index.d.ts] +export const y: number; + +//// [z.d.ts] +export const z: number; + +//// [a.ts] +import { x } from "@cow/boy"; +import { y } from "@be/bop"; +import { z } from "@be/bop/e/z"; + + +//// [a.js] +"use strict"; +exports.__esModule = true; diff --git a/tests/baselines/reference/scopedPackages.symbols b/tests/baselines/reference/scopedPackages.symbols new file mode 100644 index 00000000000..e992c4d9375 --- /dev/null +++ b/tests/baselines/reference/scopedPackages.symbols @@ -0,0 +1,22 @@ +=== /a.ts === +import { x } from "@cow/boy"; +>x : Symbol(x, Decl(a.ts, 0, 8)) + +import { y } from "@be/bop"; +>y : Symbol(y, Decl(a.ts, 1, 8)) + +import { z } from "@be/bop/e/z"; +>z : Symbol(z, Decl(a.ts, 2, 8)) + +=== /node_modules/@cow/boy/index.d.ts === +export const x: number; +>x : Symbol(x, Decl(index.d.ts, 0, 12)) + +=== /node_modules/@types/be__bop/index.d.ts === +export const y: number; +>y : Symbol(y, Decl(index.d.ts, 0, 12)) + +=== /node_modules/@types/be__bop/e/z.d.ts === +export const z: number; +>z : Symbol(z, Decl(z.d.ts, 0, 12)) + diff --git a/tests/baselines/reference/scopedPackages.trace.json b/tests/baselines/reference/scopedPackages.trace.json new file mode 100644 index 00000000000..20df3bec172 --- /dev/null +++ b/tests/baselines/reference/scopedPackages.trace.json @@ -0,0 +1,30 @@ +[ + "======== Resolving module '@cow/boy' from '/a.ts'. ========", + "Module resolution kind is not specified, using 'NodeJs'.", + "Loading module '@cow/boy' from 'node_modules' folder, target file type 'TypeScript'.", + "File '/node_modules/@cow/boy.ts' does not exist.", + "File '/node_modules/@cow/boy.tsx' does not exist.", + "File '/node_modules/@cow/boy.d.ts' does not exist.", + "File '/node_modules/@cow/boy/package.json' does not exist.", + "File '/node_modules/@cow/boy/index.ts' does not exist.", + "File '/node_modules/@cow/boy/index.tsx' does not exist.", + "File '/node_modules/@cow/boy/index.d.ts' exist - use it as a name resolution result.", + "Resolving real path for '/node_modules/@cow/boy/index.d.ts', result '/node_modules/@cow/boy/index.d.ts'.", + "======== Module name '@cow/boy' was successfully resolved to '/node_modules/@cow/boy/index.d.ts'. ========", + "======== Resolving module '@be/bop' from '/a.ts'. ========", + "Module resolution kind is not specified, using 'NodeJs'.", + "Loading module '@be/bop' from 'node_modules' folder, target file type 'TypeScript'.", + "Scoped package detected, looking in 'be__bop'", + "File '/node_modules/@types/be__bop.d.ts' does not exist.", + "File '/node_modules/@types/be__bop/package.json' does not exist.", + "File '/node_modules/@types/be__bop/index.d.ts' exist - use it as a name resolution result.", + "Resolving real path for '/node_modules/@types/be__bop/index.d.ts', result '/node_modules/@types/be__bop/index.d.ts'.", + "======== Module name '@be/bop' was successfully resolved to '/node_modules/@types/be__bop/index.d.ts'. ========", + "======== Resolving module '@be/bop/e/z' from '/a.ts'. ========", + "Module resolution kind is not specified, using 'NodeJs'.", + "Loading module '@be/bop/e/z' from 'node_modules' folder, target file type 'TypeScript'.", + "Scoped package detected, looking in 'be__bop/e/z'", + "File '/node_modules/@types/be__bop/e/z.d.ts' exist - use it as a name resolution result.", + "Resolving real path for '/node_modules/@types/be__bop/e/z.d.ts', result '/node_modules/@types/be__bop/e/z.d.ts'.", + "======== Module name '@be/bop/e/z' was successfully resolved to '/node_modules/@types/be__bop/e/z.d.ts'. ========" +] \ No newline at end of file diff --git a/tests/baselines/reference/scopedPackages.types b/tests/baselines/reference/scopedPackages.types new file mode 100644 index 00000000000..c876590f54a --- /dev/null +++ b/tests/baselines/reference/scopedPackages.types @@ -0,0 +1,22 @@ +=== /a.ts === +import { x } from "@cow/boy"; +>x : number + +import { y } from "@be/bop"; +>y : number + +import { z } from "@be/bop/e/z"; +>z : number + +=== /node_modules/@cow/boy/index.d.ts === +export const x: number; +>x : number + +=== /node_modules/@types/be__bop/index.d.ts === +export const y: number; +>y : number + +=== /node_modules/@types/be__bop/e/z.d.ts === +export const z: number; +>z : number + diff --git a/tests/baselines/reference/scopedPackagesClassic.js b/tests/baselines/reference/scopedPackagesClassic.js new file mode 100644 index 00000000000..f42acde2306 --- /dev/null +++ b/tests/baselines/reference/scopedPackagesClassic.js @@ -0,0 +1,12 @@ +//// [tests/cases/conformance/moduleResolution/scopedPackagesClassic.ts] //// + +//// [index.d.ts] +export const x = 0; + +//// [a.ts] +import { x } from "@see/saw"; + + +//// [a.js] +"use strict"; +exports.__esModule = true; diff --git a/tests/baselines/reference/scopedPackagesClassic.symbols b/tests/baselines/reference/scopedPackagesClassic.symbols new file mode 100644 index 00000000000..e0d84f44c91 --- /dev/null +++ b/tests/baselines/reference/scopedPackagesClassic.symbols @@ -0,0 +1,8 @@ +=== /a.ts === +import { x } from "@see/saw"; +>x : Symbol(x, Decl(a.ts, 0, 8)) + +=== /node_modules/@types/see__saw/index.d.ts === +export const x = 0; +>x : Symbol(x, Decl(index.d.ts, 0, 12)) + diff --git a/tests/baselines/reference/scopedPackagesClassic.trace.json b/tests/baselines/reference/scopedPackagesClassic.trace.json new file mode 100644 index 00000000000..c58c7d2ed10 --- /dev/null +++ b/tests/baselines/reference/scopedPackagesClassic.trace.json @@ -0,0 +1,9 @@ +[ + "======== Resolving module '@see/saw' from '/a.ts'. ========", + "Explicitly specified module resolution kind: 'Classic'.", + "Scoped package detected, looking in 'see__saw'", + "File '/node_modules/@types/see__saw.d.ts' does not exist.", + "File '/node_modules/@types/see__saw/package.json' does not exist.", + "File '/node_modules/@types/see__saw/index.d.ts' exist - use it as a name resolution result.", + "======== Module name '@see/saw' was successfully resolved to '/node_modules/@types/see__saw/index.d.ts'. ========" +] \ No newline at end of file diff --git a/tests/baselines/reference/scopedPackagesClassic.types b/tests/baselines/reference/scopedPackagesClassic.types new file mode 100644 index 00000000000..65047f2436d --- /dev/null +++ b/tests/baselines/reference/scopedPackagesClassic.types @@ -0,0 +1,9 @@ +=== /a.ts === +import { x } from "@see/saw"; +>x : 0 + +=== /node_modules/@types/see__saw/index.d.ts === +export const x = 0; +>x : 0 +>0 : 0 + diff --git a/tests/cases/conformance/moduleResolution/scopedPackages.ts b/tests/cases/conformance/moduleResolution/scopedPackages.ts new file mode 100644 index 00000000000..b604f10d7ec --- /dev/null +++ b/tests/cases/conformance/moduleResolution/scopedPackages.ts @@ -0,0 +1,17 @@ +// @noImplicitReferences: true +// @traceResolution: true +// @typeRoots: types + +// @filename: /node_modules/@cow/boy/index.d.ts +export const x: number; + +// @filename: /node_modules/@types/be__bop/index.d.ts +export const y: number; + +// @filename: /node_modules/@types/be__bop/e/z.d.ts +export const z: number; + +// @filename: /a.ts +import { x } from "@cow/boy"; +import { y } from "@be/bop"; +import { z } from "@be/bop/e/z"; diff --git a/tests/cases/conformance/moduleResolution/scopedPackagesClassic.ts b/tests/cases/conformance/moduleResolution/scopedPackagesClassic.ts new file mode 100644 index 00000000000..41b6fc09e19 --- /dev/null +++ b/tests/cases/conformance/moduleResolution/scopedPackagesClassic.ts @@ -0,0 +1,10 @@ +// @noImplicitReferences: true +// @traceResolution: true +// @typeRoots: types +// @moduleResolution: classic + +// @filename: /node_modules/@types/see__saw/index.d.ts +export const x = 0; + +// @filename: /a.ts +import { x } from "@see/saw"; diff --git a/tests/cases/conformance/references/library-reference-scoped-packages.ts b/tests/cases/conformance/references/library-reference-scoped-packages.ts new file mode 100644 index 00000000000..86a1ad3e93d --- /dev/null +++ b/tests/cases/conformance/references/library-reference-scoped-packages.ts @@ -0,0 +1,9 @@ +// @noImplicitReferences: true +// @traceResolution: true +// @typeRoots: types + +// @filename: /node_modules/@types/beep__boop/index.d.ts +export const y = 0; + +// @filename: /a.ts +/// From 5c2091ad33d3d0446fbfecd7d5efeeafb3ccfa10 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 7 Apr 2017 11:10:16 -0700 Subject: [PATCH 07/33] Evolving array element ignores contextual type Control flow analysis can easily hit circularities or exponential behaviour when requesting the contextual type of an expression. When adding an element type to an evolving array type, there is no point in checking the contextual type of the new element type because it is unknown -- it is exactly the type of the evolving array, which is in the middle of being found. Fixes #14628 This is code of the form: ```ts let x = [] x[0] = { contextual: 'no' } x[1] = { contextual: 'should not check' } x[2] = { contextual: 'contextual type' } // : // : ``` --- src/compiler/checker.ts | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d7acedd663d..aefdeea9ffe 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10893,7 +10893,7 @@ namespace ts { // we defer subtype reduction until the evolving array type is finalized into a manifest // array type. function addEvolvingArrayElementType(evolvingArrayType: EvolvingArrayType, node: Expression): EvolvingArrayType { - const elementType = getBaseTypeOfLiteralType(getTypeOfExpression(node)); + const elementType = getBaseTypeOfLiteralType(getContextFreeTypeOfExpression(node)); return isTypeSubsetOf(elementType, evolvingArrayType.elementType) ? evolvingArrayType : getEvolvingArrayType(getUnionType([evolvingArrayType.elementType, elementType])); } @@ -17064,10 +17064,12 @@ namespace ts { return type; } - // Returns the type of an expression. Unlike checkExpression, this function is simply concerned - // with computing the type and may not fully check all contained sub-expressions for errors. - // A cache argument of true indicates that if the function performs a full type check, it is ok - // to cache the result. + /** + * Returns the type of an expression. Unlike checkExpression, this function is simply concerned + * with computing the type and may not fully check all contained sub-expressions for errors. + * A cache argument of true indicates that if the function performs a full type check, it is ok + * to cache the result. + */ function getTypeOfExpression(node: Expression, cache?: boolean) { // Optimize for the common case of a call to a function with a single non-generic call // signature where we can just fetch the return type without checking the arguments. @@ -17084,6 +17086,21 @@ namespace ts { return cache ? checkExpressionCached(node) : checkExpression(node); } + /** + * Returns the type of an expression. Unlike checkExpression, this function is simply concerned + * with computing the type and may not fully check all contained sub-expressions for errors. + * It is intended for uses where you know there is no contextual type, + * and requesting the contextual type might cause a circularity or other bad behaviour. + * It sets the contextual type of the node to any before calling getTypeOfExpression. + */ + function getContextFreeTypeOfExpression(node: Expression) { + const saveContextualType = node.contextualType; + node.contextualType = anyType; + const type = getTypeOfExpression(node); + node.contextualType = saveContextualType; + return type; + } + // Checks an expression and returns its type. The contextualMapper parameter serves two purposes: When // contextualMapper is not undefined and not equal to the identityMapper function object it indicates that the // expression is being inferentially typed (section 4.15.2 in spec) and provides the type mapper to use in From 1671a06655aefb5496f7524a01ec4209e0ae2bdd Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 7 Apr 2017 11:14:16 -0700 Subject: [PATCH 08/33] Test: object literal assignments->expanding arrays Previously, the compiler would run out of memory for more than 13 or 14 of these assignments. --- .../assignmentToExpandingArrayType.js | 56 +++++ .../assignmentToExpandingArrayType.symbols | 101 ++++++++ .../assignmentToExpandingArrayType.types | 222 ++++++++++++++++++ .../assignmentToExpandingArrayType.ts | 27 +++ 4 files changed, 406 insertions(+) create mode 100644 tests/baselines/reference/assignmentToExpandingArrayType.js create mode 100644 tests/baselines/reference/assignmentToExpandingArrayType.symbols create mode 100644 tests/baselines/reference/assignmentToExpandingArrayType.types create mode 100644 tests/cases/compiler/assignmentToExpandingArrayType.ts diff --git a/tests/baselines/reference/assignmentToExpandingArrayType.js b/tests/baselines/reference/assignmentToExpandingArrayType.js new file mode 100644 index 00000000000..5b885b6913f --- /dev/null +++ b/tests/baselines/reference/assignmentToExpandingArrayType.js @@ -0,0 +1,56 @@ +//// [assignmentToExpandingArrayType.ts] +// Fixes exponential time/space in #14628 +let x = [] +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } // previously ran out of memory here +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } + + +//// [assignmentToExpandingArrayType.js] +// Fixes exponential time/space in #14628 +var x = []; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; // previously ran out of memory here +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; diff --git a/tests/baselines/reference/assignmentToExpandingArrayType.symbols b/tests/baselines/reference/assignmentToExpandingArrayType.symbols new file mode 100644 index 00000000000..c8285706f6e --- /dev/null +++ b/tests/baselines/reference/assignmentToExpandingArrayType.symbols @@ -0,0 +1,101 @@ +=== tests/cases/compiler/assignmentToExpandingArrayType.ts === +// Fixes exponential time/space in #14628 +let x = [] +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 2, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 3, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 4, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 5, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 6, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 7, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 8, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 9, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 10, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 11, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 12, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 13, 8)) + +x[0] = { foo: 'hi' } // previously ran out of memory here +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 14, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 15, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 16, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 17, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 18, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 19, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 20, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 21, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 22, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 23, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 24, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 25, 8)) + diff --git a/tests/baselines/reference/assignmentToExpandingArrayType.types b/tests/baselines/reference/assignmentToExpandingArrayType.types new file mode 100644 index 00000000000..da923b23646 --- /dev/null +++ b/tests/baselines/reference/assignmentToExpandingArrayType.types @@ -0,0 +1,222 @@ +=== tests/cases/compiler/assignmentToExpandingArrayType.ts === +// Fixes exponential time/space in #14628 +let x = [] +>x : any[] +>[] : undefined[] + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } // previously ran out of memory here +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + diff --git a/tests/cases/compiler/assignmentToExpandingArrayType.ts b/tests/cases/compiler/assignmentToExpandingArrayType.ts new file mode 100644 index 00000000000..05680afa386 --- /dev/null +++ b/tests/cases/compiler/assignmentToExpandingArrayType.ts @@ -0,0 +1,27 @@ +// @noImplicitAny: true +// Fixes exponential time/space in #14628 +let x = [] +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } // previously ran out of memory here +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } From 8ae3e050759311d6cef51cc7b5067a5257b7f33c Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sat, 8 Apr 2017 12:53:01 -0700 Subject: [PATCH 09/33] Treat callback parameters as strictly covariant --- src/compiler/checker.ts | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d7acedd663d..150dc412f7b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8157,7 +8157,8 @@ namespace ts { function isSignatureAssignableTo(source: Signature, target: Signature, ignoreReturnTypes: boolean): boolean { - return compareSignaturesRelated(source, target, ignoreReturnTypes, /*reportErrors*/ false, /*errorReporter*/ undefined, compareTypesAssignable) !== Ternary.False; + return compareSignaturesRelated(source, target, /*strictVariance*/ false, ignoreReturnTypes, /*reportErrors*/ false, + /*errorReporter*/ undefined, compareTypesAssignable) !== Ternary.False; } type ErrorReporter = (message: DiagnosticMessage, arg0?: string, arg1?: string) => void; @@ -8167,6 +8168,7 @@ namespace ts { */ function compareSignaturesRelated(source: Signature, target: Signature, + strictVariance: boolean, ignoreReturnTypes: boolean, reportErrors: boolean, errorReporter: ErrorReporter, @@ -8209,9 +8211,17 @@ namespace ts { const sourceParams = source.parameters; const targetParams = target.parameters; for (let i = 0; i < checkCount; i++) { - const s = i < sourceMax ? getTypeOfParameter(sourceParams[i]) : getRestTypeOfSignature(source); - const t = i < targetMax ? getTypeOfParameter(targetParams[i]) : getRestTypeOfSignature(target); - const related = compareTypes(s, t, /*reportErrors*/ false) || compareTypes(t, s, reportErrors); + const sourceType = i < sourceMax ? getTypeOfParameter(sourceParams[i]) : getRestTypeOfSignature(source); + const targetType = i < targetMax ? getTypeOfParameter(targetParams[i]) : getRestTypeOfSignature(target); + const sourceSig = getSingleCallSignature(sourceType); + const targetSig = getSingleCallSignature(targetType); + // If the source and target parameters both have function types with a single call signature we are + // relating two callback parameters. In that case we compare the callback signatures with strict + // variance, meaning we require the callback parameters to be pairwise co-variant (because, similar + // to return values, callback parameters are output positions). + const related = sourceSig && targetSig ? + compareSignaturesRelated(targetSig, sourceSig, /*strictVariance*/ true, /*ignoreReturnTypes*/ false, reportErrors, errorReporter, compareTypes) : + !strictVariance && compareTypes(sourceType, targetType, /*reportErrors*/ false) || compareTypes(targetType, sourceType, reportErrors); if (!related) { if (reportErrors) { errorReporter(Diagnostics.Types_of_parameters_0_and_1_are_incompatible, @@ -9210,7 +9220,7 @@ namespace ts { * See signatureAssignableTo, compareSignaturesIdentical */ function signatureRelatedTo(source: Signature, target: Signature, reportErrors: boolean): Ternary { - return compareSignaturesRelated(source, target, /*ignoreReturnTypes*/ false, reportErrors, reportError, isRelatedTo); + return compareSignaturesRelated(source, target, /*strictVariance*/ false, /*ignoreReturnTypes*/ false, reportErrors, reportError, isRelatedTo); } function signaturesIdenticalTo(source: Type, target: Type, kind: SignatureKind): Ternary { From eebd67f8d53939e63fc54829dffec88f333ff64d Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sat, 8 Apr 2017 12:54:01 -0700 Subject: [PATCH 10/33] Fix callback types to match covariantly --- src/compiler/parser.ts | 2 +- src/compiler/visitor.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index a82d5b02b44..94f169963ba 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -57,7 +57,7 @@ namespace ts { // The visitXXX functions could be written as local functions that close over the cbNode and cbNodeArray // callback parameters, but that causes a closure allocation for each invocation with noticeable effects // on performance. - const visitNodes: (cb: (node: Node | Node[]) => T, nodes: Node[]) => T = cbNodeArray ? visitNodeArray : visitEachNode; + const visitNodes: (cb: ((node: Node) => T) | ((node: Node[]) => T), nodes: Node[]) => T = cbNodeArray ? visitNodeArray : visitEachNode; const cbNodes = cbNodeArray || cbNode; switch (node.kind) { case SyntaxKind.QualifiedName: diff --git a/src/compiler/visitor.ts b/src/compiler/visitor.ts index 297d2cc0dde..52f9ab0b809 100644 --- a/src/compiler/visitor.ts +++ b/src/compiler/visitor.ts @@ -885,7 +885,7 @@ namespace ts { return initial; } - const reduceNodes: (nodes: NodeArray, f: (memo: T, node: Node | NodeArray) => T, initial: T) => T = cbNodeArray ? reduceNodeArray : reduceLeft; + const reduceNodes: (nodes: NodeArray, f: ((memo: T, node: Node) => T) | ((memo: T, node: NodeArray) => T), initial: T) => T = cbNodeArray ? reduceNodeArray : reduceLeft; const cbNodes = cbNodeArray || cbNode; const kind = node.kind; From 11543d7369b6b0fc594dd0d38b092f0fa66e8075 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sat, 8 Apr 2017 14:03:17 -0700 Subject: [PATCH 11/33] Accept new baselines --- ...typeIsAssignableToReadonlyArray.errors.txt | 2 - ...gnmentCompatWithCallSignatures3.errors.txt | 113 ++++++++++++++++++ ...gnmentCompatWithCallSignatures4.errors.txt | 36 +++--- ...tCompatWithConstructSignatures3.errors.txt | 113 ++++++++++++++++++ ...tCompatWithConstructSignatures4.errors.txt | 36 +++--- ...tureAssignabilityInInheritance3.errors.txt | 18 ++- ...tureAssignabilityInInheritance3.errors.txt | 18 ++- ...ptionalFunctionArgAssignability.errors.txt | 10 +- ...rloadOnConstNoAnyImplementation.errors.txt | 5 +- ...loadOnConstNoAnyImplementation2.errors.txt | 5 +- .../reference/promisePermutations.errors.txt | 44 ++++--- .../reference/promisePermutations2.errors.txt | 44 ++++--- .../reference/promisePermutations3.errors.txt | 44 ++++--- .../promisesWithConstraints.errors.txt | 36 ++++++ .../recursiveTypeComparison2.errors.txt | 9 +- .../subtypingWithCallSignatures2.types | 40 +++---- .../subtypingWithCallSignatures3.types | 8 +- .../subtypingWithCallSignatures4.types | 8 +- 18 files changed, 417 insertions(+), 172 deletions(-) create mode 100644 tests/baselines/reference/assignmentCompatWithCallSignatures3.errors.txt create mode 100644 tests/baselines/reference/assignmentCompatWithConstructSignatures3.errors.txt create mode 100644 tests/baselines/reference/promisesWithConstraints.errors.txt diff --git a/tests/baselines/reference/arrayOfSubtypeIsAssignableToReadonlyArray.errors.txt b/tests/baselines/reference/arrayOfSubtypeIsAssignableToReadonlyArray.errors.txt index 90dc909b11a..51a581b7fb3 100644 --- a/tests/baselines/reference/arrayOfSubtypeIsAssignableToReadonlyArray.errors.txt +++ b/tests/baselines/reference/arrayOfSubtypeIsAssignableToReadonlyArray.errors.txt @@ -3,7 +3,6 @@ tests/cases/compiler/arrayOfSubtypeIsAssignableToReadonlyArray.ts(13,1): error T Type '{ (...items: A[][]): A[]; (...items: (A | A[])[]): A[]; }' is not assignable to type '{ >(...items: U[]): B[]; (...items: B[][]): B[]; (...items: (B | B[])[]): B[]; }'. Type 'A[]' is not assignable to type 'B[]'. Type 'A' is not assignable to type 'B'. - Property 'b' is missing in type 'A'. tests/cases/compiler/arrayOfSubtypeIsAssignableToReadonlyArray.ts(18,1): error TS2322: Type 'C' is not assignable to type 'ReadonlyArray'. Types of property 'concat' are incompatible. Type '{ (...items: A[][]): A[]; (...items: (A | A[])[]): A[]; }' is not assignable to type '{ >(...items: U[]): B[]; (...items: B[][]): B[]; (...items: (B | B[])[]): B[]; }'. @@ -30,7 +29,6 @@ tests/cases/compiler/arrayOfSubtypeIsAssignableToReadonlyArray.ts(18,1): error T !!! error TS2322: Type '{ (...items: A[][]): A[]; (...items: (A | A[])[]): A[]; }' is not assignable to type '{ >(...items: U[]): B[]; (...items: B[][]): B[]; (...items: (B | B[])[]): B[]; }'. !!! error TS2322: Type 'A[]' is not assignable to type 'B[]'. !!! error TS2322: Type 'A' is not assignable to type 'B'. -!!! error TS2322: Property 'b' is missing in type 'A'. rra = cra; rra = crb; // OK, C is assignable to ReadonlyArray diff --git a/tests/baselines/reference/assignmentCompatWithCallSignatures3.errors.txt b/tests/baselines/reference/assignmentCompatWithCallSignatures3.errors.txt new file mode 100644 index 00000000000..0e8605efafd --- /dev/null +++ b/tests/baselines/reference/assignmentCompatWithCallSignatures3.errors.txt @@ -0,0 +1,113 @@ +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithCallSignatures3.ts(71,1): error TS2322: Type '(x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived' is not assignable to type '(x: (arg: T) => U, y: (arg2: { foo: string; bing: number; }) => U) => (r: T) => U'. + Types of parameters 'y' and 'y' are incompatible. + Types of parameters 'arg2' and 'arg2' are incompatible. + Type 'Base' is not assignable to type '{ foo: string; bing: number; }'. + Property 'bing' is missing in type 'Base'. + + +==== tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithCallSignatures3.ts (1 errors) ==== + // these are all permitted with the current rules, since we do not do contextual signature instantiation + + class Base { foo: string; } + class Derived extends Base { bar: string; } + class Derived2 extends Derived { baz: string; } + class OtherDerived extends Base { bing: string; } + + var a: (x: number) => number[]; + var a2: (x: number) => string[]; + var a3: (x: number) => void; + var a4: (x: string, y: number) => string; + var a5: (x: (arg: string) => number) => string; + var a6: (x: (arg: Base) => Derived) => Base; + var a7: (x: (arg: Base) => Derived) => (r: Base) => Derived; + var a8: (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived; + var a9: (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived; + var a10: (...x: Derived[]) => Derived; + var a11: (x: { foo: string }, y: { foo: string; bar: string }) => Base; + var a12: (x: Array, y: Array) => Array; + var a13: (x: Array, y: Array) => Array; + var a14: (x: { a: string; b: number }) => Object; + var a15: { + (x: number): number[]; + (x: string): string[]; + } + var a16: { + (x: T): number[]; + (x: U): number[]; + } + var a17: { + (x: (a: number) => number): number[]; + (x: (a: string) => string): string[]; + }; + var a18: { + (x: { + (a: number): number; + (a: string): string; + }): any[]; + (x: { + (a: boolean): boolean; + (a: Date): Date; + }): any[]; + } + + var b: (x: T) => T[]; + a = b; // ok + b = a; // ok + var b2: (x: T) => string[]; + a2 = b2; // ok + b2 = a2; // ok + var b3: (x: T) => T; + a3 = b3; // ok + b3 = a3; // ok + var b4: (x: T, y: U) => T; + a4 = b4; // ok + b4 = a4; // ok + var b5: (x: (arg: T) => U) => T; + a5 = b5; // ok + b5 = a5; // ok + var b6: (x: (arg: T) => U) => T; + a6 = b6; // ok + b6 = a6; // ok + var b7: (x: (arg: T) => U) => (r: T) => U; + a7 = b7; // ok + b7 = a7; // ok + var b8: (x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U; + a8 = b8; // ok + b8 = a8; // ok + var b9: (x: (arg: T) => U, y: (arg2: { foo: string; bing: number }) => U) => (r: T) => U; + a9 = b9; // ok + b9 = a9; // ok + ~~ +!!! error TS2322: Type '(x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived' is not assignable to type '(x: (arg: T) => U, y: (arg2: { foo: string; bing: number; }) => U) => (r: T) => U'. +!!! error TS2322: Types of parameters 'y' and 'y' are incompatible. +!!! error TS2322: Types of parameters 'arg2' and 'arg2' are incompatible. +!!! error TS2322: Type 'Base' is not assignable to type '{ foo: string; bing: number; }'. +!!! error TS2322: Property 'bing' is missing in type 'Base'. + var b10: (...x: T[]) => T; + a10 = b10; // ok + b10 = a10; // ok + var b11: (x: T, y: T) => T; + a11 = b11; // ok + b11 = a11; // ok + var b12: >(x: Array, y: T) => Array; + a12 = b12; // ok + b12 = a12; // ok + var b13: >(x: Array, y: T) => T; + a13 = b13; // ok + b13 = a13; // ok + var b14: (x: { a: T; b: T }) => T; + a14 = b14; // ok + b14 = a14; // ok + var b15: (x: T) => T[]; + a15 = b15; // ok + b15 = a15; // ok + var b16: (x: T) => number[]; + a16 = b16; // ok + b16 = a16; // ok + var b17: (x: (a: T) => T) => T[]; // ok + a17 = b17; // ok + b17 = a17; // ok + var b18: (x: (a: T) => T) => T[]; + a18 = b18; // ok + b18 = a18; // ok + \ No newline at end of file diff --git a/tests/baselines/reference/assignmentCompatWithCallSignatures4.errors.txt b/tests/baselines/reference/assignmentCompatWithCallSignatures4.errors.txt index 8d184edc085..df391b27f98 100644 --- a/tests/baselines/reference/assignmentCompatWithCallSignatures4.errors.txt +++ b/tests/baselines/reference/assignmentCompatWithCallSignatures4.errors.txt @@ -1,17 +1,15 @@ tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithCallSignatures4.ts(52,9): error TS2322: Type '(x: (arg: T) => U, y: (arg2: { foo: number; }) => U) => (r: T) => U' is not assignable to type '(x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived'. Types of parameters 'y' and 'y' are incompatible. - Type '(arg2: Base) => Derived' is not assignable to type '(arg2: { foo: number; }) => any'. - Types of parameters 'arg2' and 'arg2' are incompatible. - Type '{ foo: number; }' is not assignable to type 'Base'. - Types of property 'foo' are incompatible. - Type 'number' is not assignable to type 'string'. + Types of parameters 'arg2' and 'arg2' are incompatible. + Type '{ foo: number; }' is not assignable to type 'Base'. + Types of property 'foo' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithCallSignatures4.ts(53,9): error TS2322: Type '(x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived' is not assignable to type '(x: (arg: T) => U, y: (arg2: { foo: number; }) => U) => (r: T) => U'. Types of parameters 'y' and 'y' are incompatible. - Type '(arg2: { foo: number; }) => any' is not assignable to type '(arg2: Base) => Derived'. - Types of parameters 'arg2' and 'arg2' are incompatible. - Type 'Base' is not assignable to type '{ foo: number; }'. - Types of property 'foo' are incompatible. - Type 'string' is not assignable to type 'number'. + Types of parameters 'arg2' and 'arg2' are incompatible. + Type 'Base' is not assignable to type '{ foo: number; }'. + Types of property 'foo' are incompatible. + Type 'string' is not assignable to type 'number'. ==== tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithCallSignatures4.ts (2 errors) ==== @@ -70,20 +68,18 @@ tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignme ~~ !!! error TS2322: Type '(x: (arg: T) => U, y: (arg2: { foo: number; }) => U) => (r: T) => U' is not assignable to type '(x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived'. !!! error TS2322: Types of parameters 'y' and 'y' are incompatible. -!!! error TS2322: Type '(arg2: Base) => Derived' is not assignable to type '(arg2: { foo: number; }) => any'. -!!! error TS2322: Types of parameters 'arg2' and 'arg2' are incompatible. -!!! error TS2322: Type '{ foo: number; }' is not assignable to type 'Base'. -!!! error TS2322: Types of property 'foo' are incompatible. -!!! error TS2322: Type 'number' is not assignable to type 'string'. +!!! error TS2322: Types of parameters 'arg2' and 'arg2' are incompatible. +!!! error TS2322: Type '{ foo: number; }' is not assignable to type 'Base'. +!!! error TS2322: Types of property 'foo' are incompatible. +!!! error TS2322: Type 'number' is not assignable to type 'string'. b8 = a8; // error, { foo: number } and Base are incompatible ~~ !!! error TS2322: Type '(x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived' is not assignable to type '(x: (arg: T) => U, y: (arg2: { foo: number; }) => U) => (r: T) => U'. !!! error TS2322: Types of parameters 'y' and 'y' are incompatible. -!!! error TS2322: Type '(arg2: { foo: number; }) => any' is not assignable to type '(arg2: Base) => Derived'. -!!! error TS2322: Types of parameters 'arg2' and 'arg2' are incompatible. -!!! error TS2322: Type 'Base' is not assignable to type '{ foo: number; }'. -!!! error TS2322: Types of property 'foo' are incompatible. -!!! error TS2322: Type 'string' is not assignable to type 'number'. +!!! error TS2322: Types of parameters 'arg2' and 'arg2' are incompatible. +!!! error TS2322: Type 'Base' is not assignable to type '{ foo: number; }'. +!!! error TS2322: Types of property 'foo' are incompatible. +!!! error TS2322: Type 'string' is not assignable to type 'number'. var b10: (...x: T[]) => T; diff --git a/tests/baselines/reference/assignmentCompatWithConstructSignatures3.errors.txt b/tests/baselines/reference/assignmentCompatWithConstructSignatures3.errors.txt new file mode 100644 index 00000000000..995a9b67ccd --- /dev/null +++ b/tests/baselines/reference/assignmentCompatWithConstructSignatures3.errors.txt @@ -0,0 +1,113 @@ +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithConstructSignatures3.ts(71,1): error TS2322: Type 'new (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived' is not assignable to type 'new (x: (arg: T) => U, y: (arg2: { foo: string; bing: number; }) => U) => (r: T) => U'. + Types of parameters 'y' and 'y' are incompatible. + Types of parameters 'arg2' and 'arg2' are incompatible. + Type 'Base' is not assignable to type '{ foo: string; bing: number; }'. + Property 'bing' is missing in type 'Base'. + + +==== tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithConstructSignatures3.ts (1 errors) ==== + // checking assignment compatibility relations for function types. All of these are valid. + + class Base { foo: string; } + class Derived extends Base { bar: string; } + class Derived2 extends Derived { baz: string; } + class OtherDerived extends Base { bing: string; } + + var a: new (x: number) => number[]; + var a2: new (x: number) => string[]; + var a3: new (x: number) => void; + var a4: new (x: string, y: number) => string; + var a5: new (x: (arg: string) => number) => string; + var a6: new (x: (arg: Base) => Derived) => Base; + var a7: new (x: (arg: Base) => Derived) => (r: Base) => Derived; + var a8: new (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived; + var a9: new (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived; + var a10: new (...x: Derived[]) => Derived; + var a11: new (x: { foo: string }, y: { foo: string; bar: string }) => Base; + var a12: new (x: Array, y: Array) => Array; + var a13: new (x: Array, y: Array) => Array; + var a14: new (x: { a: string; b: number }) => Object; + var a15: { + new (x: number): number[]; + new (x: string): string[]; + } + var a16: { + new (x: T): number[]; + new (x: U): number[]; + } + var a17: { + new (x: new (a: number) => number): number[]; + new (x: new (a: string) => string): string[]; + }; + var a18: { + new (x: { + new (a: number): number; + new (a: string): string; + }): any[]; + new (x: { + new (a: boolean): boolean; + new (a: Date): Date; + }): any[]; + } + + var b: new (x: T) => T[]; + a = b; // ok + b = a; // ok + var b2: new (x: T) => string[]; + a2 = b2; // ok + b2 = a2; // ok + var b3: new (x: T) => T; + a3 = b3; // ok + b3 = a3; // ok + var b4: new (x: T, y: U) => T; + a4 = b4; // ok + b4 = a4; // ok + var b5: new (x: (arg: T) => U) => T; + a5 = b5; // ok + b5 = a5; // ok + var b6: new (x: (arg: T) => U) => T; + a6 = b6; // ok + b6 = a6; // ok + var b7: new (x: (arg: T) => U) => (r: T) => U; + a7 = b7; // ok + b7 = a7; // ok + var b8: new (x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U; + a8 = b8; // ok + b8 = a8; // ok + var b9: new (x: (arg: T) => U, y: (arg2: { foo: string; bing: number }) => U) => (r: T) => U; + a9 = b9; // ok + b9 = a9; // ok + ~~ +!!! error TS2322: Type 'new (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived' is not assignable to type 'new (x: (arg: T) => U, y: (arg2: { foo: string; bing: number; }) => U) => (r: T) => U'. +!!! error TS2322: Types of parameters 'y' and 'y' are incompatible. +!!! error TS2322: Types of parameters 'arg2' and 'arg2' are incompatible. +!!! error TS2322: Type 'Base' is not assignable to type '{ foo: string; bing: number; }'. +!!! error TS2322: Property 'bing' is missing in type 'Base'. + var b10: new (...x: T[]) => T; + a10 = b10; // ok + b10 = a10; // ok + var b11: new (x: T, y: T) => T; + a11 = b11; // ok + b11 = a11; // ok + var b12: new >(x: Array, y: T) => Array; + a12 = b12; // ok + b12 = a12; // ok + var b13: new >(x: Array, y: T) => T; + a13 = b13; // ok + b13 = a13; // ok + var b14: new (x: { a: T; b: T }) => T; + a14 = b14; // ok + b14 = a14; // ok + var b15: new (x: T) => T[]; + a15 = b15; // ok + b15 = a15; // ok + var b16: new (x: T) => number[]; + a16 = b16; // ok + b16 = a16; // ok + var b17: new (x: new (a: T) => T) => T[]; // ok + a17 = b17; // ok + b17 = a17; // ok + var b18: new (x: new (a: T) => T) => T[]; + a18 = b18; // ok + b18 = a18; // ok + \ No newline at end of file diff --git a/tests/baselines/reference/assignmentCompatWithConstructSignatures4.errors.txt b/tests/baselines/reference/assignmentCompatWithConstructSignatures4.errors.txt index f6e93e13f04..6b2f4a0de17 100644 --- a/tests/baselines/reference/assignmentCompatWithConstructSignatures4.errors.txt +++ b/tests/baselines/reference/assignmentCompatWithConstructSignatures4.errors.txt @@ -1,17 +1,15 @@ tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithConstructSignatures4.ts(52,9): error TS2322: Type 'new (x: (arg: T) => U, y: (arg2: { foo: number; }) => U) => (r: T) => U' is not assignable to type 'new (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived'. Types of parameters 'y' and 'y' are incompatible. - Type '(arg2: Base) => Derived' is not assignable to type '(arg2: { foo: number; }) => any'. - Types of parameters 'arg2' and 'arg2' are incompatible. - Type '{ foo: number; }' is not assignable to type 'Base'. - Types of property 'foo' are incompatible. - Type 'number' is not assignable to type 'string'. + Types of parameters 'arg2' and 'arg2' are incompatible. + Type '{ foo: number; }' is not assignable to type 'Base'. + Types of property 'foo' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithConstructSignatures4.ts(53,9): error TS2322: Type 'new (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived' is not assignable to type 'new (x: (arg: T) => U, y: (arg2: { foo: number; }) => U) => (r: T) => U'. Types of parameters 'y' and 'y' are incompatible. - Type '(arg2: { foo: number; }) => any' is not assignable to type '(arg2: Base) => Derived'. - Types of parameters 'arg2' and 'arg2' are incompatible. - Type 'Base' is not assignable to type '{ foo: number; }'. - Types of property 'foo' are incompatible. - Type 'string' is not assignable to type 'number'. + Types of parameters 'arg2' and 'arg2' are incompatible. + Type 'Base' is not assignable to type '{ foo: number; }'. + Types of property 'foo' are incompatible. + Type 'string' is not assignable to type 'number'. tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithConstructSignatures4.ts(77,9): error TS2322: Type 'new (x: (a: T) => T) => T[]' is not assignable to type '{ new (x: { new (a: number): number; new (a?: number): number; }): number[]; new (x: { new (a: boolean): boolean; new (a?: boolean): boolean; }): boolean[]; }'. Types of parameters 'x' and 'x' are incompatible. Type '{ new (a: number): number; new (a?: number): number; }' is not assignable to type '(a: any) => any'. @@ -86,20 +84,18 @@ tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignme ~~ !!! error TS2322: Type 'new (x: (arg: T) => U, y: (arg2: { foo: number; }) => U) => (r: T) => U' is not assignable to type 'new (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived'. !!! error TS2322: Types of parameters 'y' and 'y' are incompatible. -!!! error TS2322: Type '(arg2: Base) => Derived' is not assignable to type '(arg2: { foo: number; }) => any'. -!!! error TS2322: Types of parameters 'arg2' and 'arg2' are incompatible. -!!! error TS2322: Type '{ foo: number; }' is not assignable to type 'Base'. -!!! error TS2322: Types of property 'foo' are incompatible. -!!! error TS2322: Type 'number' is not assignable to type 'string'. +!!! error TS2322: Types of parameters 'arg2' and 'arg2' are incompatible. +!!! error TS2322: Type '{ foo: number; }' is not assignable to type 'Base'. +!!! error TS2322: Types of property 'foo' are incompatible. +!!! error TS2322: Type 'number' is not assignable to type 'string'. b8 = a8; // error ~~ !!! error TS2322: Type 'new (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived' is not assignable to type 'new (x: (arg: T) => U, y: (arg2: { foo: number; }) => U) => (r: T) => U'. !!! error TS2322: Types of parameters 'y' and 'y' are incompatible. -!!! error TS2322: Type '(arg2: { foo: number; }) => any' is not assignable to type '(arg2: Base) => Derived'. -!!! error TS2322: Types of parameters 'arg2' and 'arg2' are incompatible. -!!! error TS2322: Type 'Base' is not assignable to type '{ foo: number; }'. -!!! error TS2322: Types of property 'foo' are incompatible. -!!! error TS2322: Type 'string' is not assignable to type 'number'. +!!! error TS2322: Types of parameters 'arg2' and 'arg2' are incompatible. +!!! error TS2322: Type 'Base' is not assignable to type '{ foo: number; }'. +!!! error TS2322: Types of property 'foo' are incompatible. +!!! error TS2322: Type 'string' is not assignable to type 'number'. var b10: new (...x: T[]) => T; diff --git a/tests/baselines/reference/callSignatureAssignabilityInInheritance3.errors.txt b/tests/baselines/reference/callSignatureAssignabilityInInheritance3.errors.txt index 2d7e795d26a..f5e05567b25 100644 --- a/tests/baselines/reference/callSignatureAssignabilityInInheritance3.errors.txt +++ b/tests/baselines/reference/callSignatureAssignabilityInInheritance3.errors.txt @@ -7,11 +7,10 @@ tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSign Types of property 'a8' are incompatible. Type '(x: (arg: T) => U, y: (arg2: { foo: number; }) => U) => (r: T) => U' is not assignable to type '(x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived'. Types of parameters 'y' and 'y' are incompatible. - Type '(arg2: Base) => Derived' is not assignable to type '(arg2: { foo: number; }) => any'. - Types of parameters 'arg2' and 'arg2' are incompatible. - Type '{ foo: number; }' is not assignable to type 'Base'. - Types of property 'foo' are incompatible. - Type 'number' is not assignable to type 'string'. + Types of parameters 'arg2' and 'arg2' are incompatible. + Type '{ foo: number; }' is not assignable to type 'Base'. + Types of property 'foo' are incompatible. + Type 'number' is not assignable to type 'string'. ==== tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance3.ts (2 errors) ==== @@ -86,11 +85,10 @@ tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSign !!! error TS2430: Types of property 'a8' are incompatible. !!! error TS2430: Type '(x: (arg: T) => U, y: (arg2: { foo: number; }) => U) => (r: T) => U' is not assignable to type '(x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived'. !!! error TS2430: Types of parameters 'y' and 'y' are incompatible. -!!! error TS2430: Type '(arg2: Base) => Derived' is not assignable to type '(arg2: { foo: number; }) => any'. -!!! error TS2430: Types of parameters 'arg2' and 'arg2' are incompatible. -!!! error TS2430: Type '{ foo: number; }' is not assignable to type 'Base'. -!!! error TS2430: Types of property 'foo' are incompatible. -!!! error TS2430: Type 'number' is not assignable to type 'string'. +!!! error TS2430: Types of parameters 'arg2' and 'arg2' are incompatible. +!!! error TS2430: Type '{ foo: number; }' is not assignable to type 'Base'. +!!! error TS2430: Types of property 'foo' are incompatible. +!!! error TS2430: Type 'number' is not assignable to type 'string'. a8: (x: (arg: T) => U, y: (arg2: { foo: number; }) => U) => (r: T) => U; // error, type mismatch } diff --git a/tests/baselines/reference/constructSignatureAssignabilityInInheritance3.errors.txt b/tests/baselines/reference/constructSignatureAssignabilityInInheritance3.errors.txt index 086372aac17..7bd76159391 100644 --- a/tests/baselines/reference/constructSignatureAssignabilityInInheritance3.errors.txt +++ b/tests/baselines/reference/constructSignatureAssignabilityInInheritance3.errors.txt @@ -7,11 +7,10 @@ tests/cases/conformance/types/typeRelationships/assignmentCompatibility/construc Types of property 'a8' are incompatible. Type 'new (x: (arg: T) => U, y: (arg2: { foo: number; }) => U) => (r: T) => U' is not assignable to type 'new (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived'. Types of parameters 'y' and 'y' are incompatible. - Type '(arg2: Base) => Derived' is not assignable to type '(arg2: { foo: number; }) => any'. - Types of parameters 'arg2' and 'arg2' are incompatible. - Type '{ foo: number; }' is not assignable to type 'Base'. - Types of property 'foo' are incompatible. - Type 'number' is not assignable to type 'string'. + Types of parameters 'arg2' and 'arg2' are incompatible. + Type '{ foo: number; }' is not assignable to type 'Base'. + Types of property 'foo' are incompatible. + Type 'number' is not assignable to type 'string'. ==== tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance3.ts (2 errors) ==== @@ -76,11 +75,10 @@ tests/cases/conformance/types/typeRelationships/assignmentCompatibility/construc !!! error TS2430: Types of property 'a8' are incompatible. !!! error TS2430: Type 'new (x: (arg: T) => U, y: (arg2: { foo: number; }) => U) => (r: T) => U' is not assignable to type 'new (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived'. !!! error TS2430: Types of parameters 'y' and 'y' are incompatible. -!!! error TS2430: Type '(arg2: Base) => Derived' is not assignable to type '(arg2: { foo: number; }) => any'. -!!! error TS2430: Types of parameters 'arg2' and 'arg2' are incompatible. -!!! error TS2430: Type '{ foo: number; }' is not assignable to type 'Base'. -!!! error TS2430: Types of property 'foo' are incompatible. -!!! error TS2430: Type 'number' is not assignable to type 'string'. +!!! error TS2430: Types of parameters 'arg2' and 'arg2' are incompatible. +!!! error TS2430: Type '{ foo: number; }' is not assignable to type 'Base'. +!!! error TS2430: Types of property 'foo' are incompatible. +!!! error TS2430: Type 'number' is not assignable to type 'string'. a8: new (x: (arg: T) => U, y: (arg2: { foo: number; }) => U) => (r: T) => U; // error, type mismatch } diff --git a/tests/baselines/reference/optionalFunctionArgAssignability.errors.txt b/tests/baselines/reference/optionalFunctionArgAssignability.errors.txt index 024c5c1ea2b..1898db92463 100644 --- a/tests/baselines/reference/optionalFunctionArgAssignability.errors.txt +++ b/tests/baselines/reference/optionalFunctionArgAssignability.errors.txt @@ -1,8 +1,7 @@ tests/cases/compiler/optionalFunctionArgAssignability.ts(7,1): error TS2322: Type '(onFulFill?: (value: number) => U, onReject?: (reason: any) => U) => Promise' is not assignable to type '(onFulfill?: (value: string) => U, onReject?: (reason: any) => U) => Promise'. Types of parameters 'onFulFill' and 'onFulfill' are incompatible. - Type '(value: string) => any' is not assignable to type '(value: number) => any'. - Types of parameters 'value' and 'value' are incompatible. - Type 'number' is not assignable to type 'string'. + Types of parameters 'value' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. ==== tests/cases/compiler/optionalFunctionArgAssignability.ts (1 errors) ==== @@ -16,7 +15,6 @@ tests/cases/compiler/optionalFunctionArgAssignability.ts(7,1): error TS2322: Typ ~ !!! error TS2322: Type '(onFulFill?: (value: number) => U, onReject?: (reason: any) => U) => Promise' is not assignable to type '(onFulfill?: (value: string) => U, onReject?: (reason: any) => U) => Promise'. !!! error TS2322: Types of parameters 'onFulFill' and 'onFulfill' are incompatible. -!!! error TS2322: Type '(value: string) => any' is not assignable to type '(value: number) => any'. -!!! error TS2322: Types of parameters 'value' and 'value' are incompatible. -!!! error TS2322: Type 'number' is not assignable to type 'string'. +!!! error TS2322: Types of parameters 'value' and 'value' are incompatible. +!!! error TS2322: Type 'number' is not assignable to type 'string'. \ No newline at end of file diff --git a/tests/baselines/reference/overloadOnConstNoAnyImplementation.errors.txt b/tests/baselines/reference/overloadOnConstNoAnyImplementation.errors.txt index 0573c6ed79e..aa7bbf77239 100644 --- a/tests/baselines/reference/overloadOnConstNoAnyImplementation.errors.txt +++ b/tests/baselines/reference/overloadOnConstNoAnyImplementation.errors.txt @@ -1,8 +1,11 @@ +tests/cases/compiler/overloadOnConstNoAnyImplementation.ts(1,10): error TS2394: Overload signature is not compatible with function implementation. tests/cases/compiler/overloadOnConstNoAnyImplementation.ts(9,8): error TS2345: Argument of type '1' is not assignable to parameter of type 'string'. -==== tests/cases/compiler/overloadOnConstNoAnyImplementation.ts (1 errors) ==== +==== tests/cases/compiler/overloadOnConstNoAnyImplementation.ts (2 errors) ==== function x1(a: number, cb: (x: 'hi') => number); + ~~ +!!! error TS2394: Overload signature is not compatible with function implementation. function x1(a: number, cb: (x: 'bye') => number); function x1(a: number, cb: (x: string) => number) { cb('hi'); diff --git a/tests/baselines/reference/overloadOnConstNoAnyImplementation2.errors.txt b/tests/baselines/reference/overloadOnConstNoAnyImplementation2.errors.txt index 24047578ec6..a090f370863 100644 --- a/tests/baselines/reference/overloadOnConstNoAnyImplementation2.errors.txt +++ b/tests/baselines/reference/overloadOnConstNoAnyImplementation2.errors.txt @@ -1,3 +1,4 @@ +tests/cases/compiler/overloadOnConstNoAnyImplementation2.ts(6,5): error TS2394: Overload signature is not compatible with function implementation. tests/cases/compiler/overloadOnConstNoAnyImplementation2.ts(12,18): error TS2345: Argument of type '1' is not assignable to parameter of type 'string'. tests/cases/compiler/overloadOnConstNoAnyImplementation2.ts(18,9): error TS2345: Argument of type '(x: "bye") => number' is not assignable to parameter of type '(x: "hi") => number'. Types of parameters 'x' and 'x' are incompatible. @@ -7,13 +8,15 @@ tests/cases/compiler/overloadOnConstNoAnyImplementation2.ts(21,9): error TS2345: Type '"hi"' is not assignable to type 'number'. -==== tests/cases/compiler/overloadOnConstNoAnyImplementation2.ts (3 errors) ==== +==== tests/cases/compiler/overloadOnConstNoAnyImplementation2.ts (4 errors) ==== interface I { x1(a: number, callback: (x: 'hi') => number); } class C { x1(a: number, callback: (x: 'hi') => number); + ~~ +!!! error TS2394: Overload signature is not compatible with function implementation. x1(a: number, callback: (x: string) => number) { callback('hi'); callback('bye'); diff --git a/tests/baselines/reference/promisePermutations.errors.txt b/tests/baselines/reference/promisePermutations.errors.txt index e5e7f2109a9..8b46f18666f 100644 --- a/tests/baselines/reference/promisePermutations.errors.txt +++ b/tests/baselines/reference/promisePermutations.errors.txt @@ -31,16 +31,16 @@ tests/cases/compiler/promisePermutations.ts(110,19): error TS2345: Argument of t tests/cases/compiler/promisePermutations.ts(111,19): error TS2345: Argument of type '(cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. Types of parameters 'cb' and 'value' are incompatible. Type 'string' is not assignable to type '(a: T) => T'. -tests/cases/compiler/promisePermutations.ts(117,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. -tests/cases/compiler/promisePermutations.ts(120,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. -tests/cases/compiler/promisePermutations.ts(121,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => Promise'. +tests/cases/compiler/promisePermutations.ts(117,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +tests/cases/compiler/promisePermutations.ts(120,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +tests/cases/compiler/promisePermutations.ts(121,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => Promise'. tests/cases/compiler/promisePermutations.ts(122,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => IPromise'. -tests/cases/compiler/promisePermutations.ts(126,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +tests/cases/compiler/promisePermutations.ts(126,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. tests/cases/compiler/promisePermutations.ts(129,11): error TS2453: The type argument for type parameter 'U' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'IPromise' is not a valid type argument because it is not a supertype of candidate 'IPromise'. Type 'string' is not assignable to type 'number'. -tests/cases/compiler/promisePermutations.ts(132,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. -tests/cases/compiler/promisePermutations.ts(133,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => Promise'. +tests/cases/compiler/promisePermutations.ts(132,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +tests/cases/compiler/promisePermutations.ts(133,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => Promise'. tests/cases/compiler/promisePermutations.ts(134,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => IPromise'. tests/cases/compiler/promisePermutations.ts(137,11): error TS2453: The type argument for type parameter 'U' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'IPromise' is not a valid type argument because it is not a supertype of candidate 'IPromise'. @@ -51,9 +51,8 @@ tests/cases/compiler/promisePermutations.ts(152,12): error TS2453: The type argu Types of property 'then' are incompatible. Type '{ (success?: (value: string) => IPromise, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => IPromise, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; }' is not assignable to type '{ (onfulfilled?: (value: number) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike): Promise; (success?: (value: number) => Promise, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => Promise, error?: (error: any) => U, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }'. Types of parameters 'success' and 'onfulfilled' are incompatible. - Type '(value: number) => any' is not assignable to type '(value: string) => IPromise'. - Types of parameters 'value' and 'value' are incompatible. - Type 'string' is not assignable to type 'number'. + Types of parameters 'value' and 'value' are incompatible. + Type 'string' is not assignable to type 'number'. tests/cases/compiler/promisePermutations.ts(156,21): error TS2345: Argument of type '{ (x: number): IPromise; (x: string): IPromise; }' is not assignable to parameter of type '(value: number) => IPromise'. Type 'IPromise' is not assignable to type 'IPromise'. Type 'number' is not assignable to type 'string'. @@ -67,9 +66,8 @@ tests/cases/compiler/promisePermutations.ts(160,21): error TS2345: Argument of t Types of property 'then' are incompatible. Type '{ (onfulfilled?: (value: number) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike): Promise; (success?: (value: number) => Promise, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => Promise, error?: (error: any) => U, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }' is not assignable to type '{ (success?: (value: string) => IPromise, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => IPromise, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; }'. Types of parameters 'onfulfilled' and 'success' are incompatible. - Type '(value: string) => IPromise' is not assignable to type '(value: number) => any'. - Types of parameters 'value' and 'value' are incompatible. - Type 'number' is not assignable to type 'string'. + Types of parameters 'value' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. ==== tests/cases/compiler/promisePermutations.ts (33 errors) ==== @@ -241,15 +239,15 @@ tests/cases/compiler/promisePermutations.ts(160,21): error TS2345: Argument of t var nPromise: (x: any) => Promise; var r8a = r8.then(testFunction8, testFunction8, testFunction8); // error ~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. var r8b = r8.then(nIPromise, nIPromise, nIPromise).then(nIPromise, nIPromise, nIPromise); // ok var s8: Promise; var s8a = s8.then(testFunction8, testFunction8, testFunction8); // error ~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. var s8b = s8.then(testFunction8P, testFunction8P, testFunction8P); // error ~~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => Promise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => Promise'. var s8c = s8.then(testFunction8P, testFunction8, testFunction8); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => IPromise'. @@ -258,7 +256,7 @@ tests/cases/compiler/promisePermutations.ts(160,21): error TS2345: Argument of t var r9: IPromise; var r9a = r9.then(testFunction9, testFunction9, testFunction9); // error ~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. var r9b = r9.then(sIPromise, sIPromise, sIPromise); // ok var r9c = r9.then(nIPromise, nIPromise, nIPromise); // ok var r9d = r9.then(testFunction, sIPromise, nIPromise); // ok @@ -270,10 +268,10 @@ tests/cases/compiler/promisePermutations.ts(160,21): error TS2345: Argument of t var s9: Promise; var s9a = s9.then(testFunction9, testFunction9, testFunction9); // error ~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. var s9b = s9.then(testFunction9P, testFunction9P, testFunction9P); // error ~~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => Promise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => Promise'. var s9c = s9.then(testFunction9P, testFunction9, testFunction9); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => IPromise'. @@ -307,9 +305,8 @@ tests/cases/compiler/promisePermutations.ts(160,21): error TS2345: Argument of t !!! error TS2453: Types of property 'then' are incompatible. !!! error TS2453: Type '{ (success?: (value: string) => IPromise, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => IPromise, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; }' is not assignable to type '{ (onfulfilled?: (value: number) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike): Promise; (success?: (value: number) => Promise, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => Promise, error?: (error: any) => U, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }'. !!! error TS2453: Types of parameters 'success' and 'onfulfilled' are incompatible. -!!! error TS2453: Type '(value: number) => any' is not assignable to type '(value: string) => IPromise'. -!!! error TS2453: Types of parameters 'value' and 'value' are incompatible. -!!! error TS2453: Type 'string' is not assignable to type 'number'. +!!! error TS2453: Types of parameters 'value' and 'value' are incompatible. +!!! error TS2453: Type 'string' is not assignable to type 'number'. var s10g = s10.then(testFunctionP, nIPromise, sIPromise).then(sPromise, sIPromise, sIPromise); // ok var r11: IPromise; @@ -335,9 +332,8 @@ tests/cases/compiler/promisePermutations.ts(160,21): error TS2345: Argument of t !!! error TS2345: Types of property 'then' are incompatible. !!! error TS2345: Type '{ (onfulfilled?: (value: number) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike): Promise; (success?: (value: number) => Promise, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => Promise, error?: (error: any) => U, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }' is not assignable to type '{ (success?: (value: string) => IPromise, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => IPromise, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; }'. !!! error TS2345: Types of parameters 'onfulfilled' and 'success' are incompatible. -!!! error TS2345: Type '(value: string) => IPromise' is not assignable to type '(value: number) => any'. -!!! error TS2345: Types of parameters 'value' and 'value' are incompatible. -!!! error TS2345: Type 'number' is not assignable to type 'string'. +!!! error TS2345: Types of parameters 'value' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var r12 = testFunction12(x => x); var r12a = r12.then(testFunction12, testFunction12, testFunction12); // ok diff --git a/tests/baselines/reference/promisePermutations2.errors.txt b/tests/baselines/reference/promisePermutations2.errors.txt index 26fec6b2fd1..32df80e20f1 100644 --- a/tests/baselines/reference/promisePermutations2.errors.txt +++ b/tests/baselines/reference/promisePermutations2.errors.txt @@ -31,16 +31,16 @@ tests/cases/compiler/promisePermutations2.ts(109,19): error TS2345: Argument of tests/cases/compiler/promisePermutations2.ts(110,19): error TS2345: Argument of type '(cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. Types of parameters 'cb' and 'value' are incompatible. Type 'string' is not assignable to type '(a: T) => T'. -tests/cases/compiler/promisePermutations2.ts(116,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. -tests/cases/compiler/promisePermutations2.ts(119,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. -tests/cases/compiler/promisePermutations2.ts(120,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => Promise'. +tests/cases/compiler/promisePermutations2.ts(116,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +tests/cases/compiler/promisePermutations2.ts(119,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +tests/cases/compiler/promisePermutations2.ts(120,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => Promise'. tests/cases/compiler/promisePermutations2.ts(121,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => IPromise'. -tests/cases/compiler/promisePermutations2.ts(125,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +tests/cases/compiler/promisePermutations2.ts(125,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. tests/cases/compiler/promisePermutations2.ts(128,11): error TS2453: The type argument for type parameter 'U' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'IPromise' is not a valid type argument because it is not a supertype of candidate 'IPromise'. Type 'string' is not assignable to type 'number'. -tests/cases/compiler/promisePermutations2.ts(131,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. -tests/cases/compiler/promisePermutations2.ts(132,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => Promise'. +tests/cases/compiler/promisePermutations2.ts(131,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +tests/cases/compiler/promisePermutations2.ts(132,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => Promise'. tests/cases/compiler/promisePermutations2.ts(133,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => IPromise'. tests/cases/compiler/promisePermutations2.ts(136,11): error TS2453: The type argument for type parameter 'U' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'IPromise' is not a valid type argument because it is not a supertype of candidate 'IPromise'. @@ -51,9 +51,8 @@ tests/cases/compiler/promisePermutations2.ts(151,12): error TS2453: The type arg Types of property 'then' are incompatible. Type '{ (success?: (value: string) => IPromise, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => IPromise, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; }' is not assignable to type '{ (onfulfilled?: (value: number) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }'. Types of parameters 'success' and 'onfulfilled' are incompatible. - Type '(value: number) => any' is not assignable to type '(value: string) => IPromise'. - Types of parameters 'value' and 'value' are incompatible. - Type 'string' is not assignable to type 'number'. + Types of parameters 'value' and 'value' are incompatible. + Type 'string' is not assignable to type 'number'. tests/cases/compiler/promisePermutations2.ts(155,21): error TS2345: Argument of type '{ (x: number): IPromise; (x: string): IPromise; }' is not assignable to parameter of type '(value: number) => IPromise'. Type 'IPromise' is not assignable to type 'IPromise'. Type 'number' is not assignable to type 'string'. @@ -67,9 +66,8 @@ tests/cases/compiler/promisePermutations2.ts(159,21): error TS2345: Argument of Types of property 'then' are incompatible. Type '{ (onfulfilled?: (value: number) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }' is not assignable to type '{ (success?: (value: string) => IPromise, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => IPromise, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; }'. Types of parameters 'onfulfilled' and 'success' are incompatible. - Type '(value: string) => IPromise' is not assignable to type '(value: number) => any'. - Types of parameters 'value' and 'value' are incompatible. - Type 'number' is not assignable to type 'string'. + Types of parameters 'value' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. ==== tests/cases/compiler/promisePermutations2.ts (33 errors) ==== @@ -240,15 +238,15 @@ tests/cases/compiler/promisePermutations2.ts(159,21): error TS2345: Argument of var nPromise: (x: any) => Promise; var r8a = r8.then(testFunction8, testFunction8, testFunction8); // error ~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. var r8b = r8.then(nIPromise, nIPromise, nIPromise).then(nIPromise, nIPromise, nIPromise); // ok var s8: Promise; var s8a = s8.then(testFunction8, testFunction8, testFunction8); // error ~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. var s8b = s8.then(testFunction8P, testFunction8P, testFunction8P); // error ~~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => Promise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => Promise'. var s8c = s8.then(testFunction8P, testFunction8, testFunction8); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => IPromise'. @@ -257,7 +255,7 @@ tests/cases/compiler/promisePermutations2.ts(159,21): error TS2345: Argument of var r9: IPromise; var r9a = r9.then(testFunction9, testFunction9, testFunction9); // error ~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. var r9b = r9.then(sIPromise, sIPromise, sIPromise); // ok var r9c = r9.then(nIPromise, nIPromise, nIPromise); // ok var r9d = r9.then(testFunction, sIPromise, nIPromise); // error @@ -269,10 +267,10 @@ tests/cases/compiler/promisePermutations2.ts(159,21): error TS2345: Argument of var s9: Promise; var s9a = s9.then(testFunction9, testFunction9, testFunction9); // error ~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. var s9b = s9.then(testFunction9P, testFunction9P, testFunction9P); // error ~~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => Promise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => Promise'. var s9c = s9.then(testFunction9P, testFunction9, testFunction9); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => IPromise'. @@ -306,9 +304,8 @@ tests/cases/compiler/promisePermutations2.ts(159,21): error TS2345: Argument of !!! error TS2453: Types of property 'then' are incompatible. !!! error TS2453: Type '{ (success?: (value: string) => IPromise, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => IPromise, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; }' is not assignable to type '{ (onfulfilled?: (value: number) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }'. !!! error TS2453: Types of parameters 'success' and 'onfulfilled' are incompatible. -!!! error TS2453: Type '(value: number) => any' is not assignable to type '(value: string) => IPromise'. -!!! error TS2453: Types of parameters 'value' and 'value' are incompatible. -!!! error TS2453: Type 'string' is not assignable to type 'number'. +!!! error TS2453: Types of parameters 'value' and 'value' are incompatible. +!!! error TS2453: Type 'string' is not assignable to type 'number'. var s10g = s10.then(testFunctionP, nIPromise, sIPromise).then(sPromise, sIPromise, sIPromise); // ok var r11: IPromise; @@ -334,9 +331,8 @@ tests/cases/compiler/promisePermutations2.ts(159,21): error TS2345: Argument of !!! error TS2345: Types of property 'then' are incompatible. !!! error TS2345: Type '{ (onfulfilled?: (value: number) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }' is not assignable to type '{ (success?: (value: string) => IPromise, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => IPromise, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; }'. !!! error TS2345: Types of parameters 'onfulfilled' and 'success' are incompatible. -!!! error TS2345: Type '(value: string) => IPromise' is not assignable to type '(value: number) => any'. -!!! error TS2345: Types of parameters 'value' and 'value' are incompatible. -!!! error TS2345: Type 'number' is not assignable to type 'string'. +!!! error TS2345: Types of parameters 'value' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var r12 = testFunction12(x => x); var r12a = r12.then(testFunction12, testFunction12, testFunction12); // ok diff --git a/tests/baselines/reference/promisePermutations3.errors.txt b/tests/baselines/reference/promisePermutations3.errors.txt index 1354f486fcb..3d9fc1b2d26 100644 --- a/tests/baselines/reference/promisePermutations3.errors.txt +++ b/tests/baselines/reference/promisePermutations3.errors.txt @@ -34,16 +34,16 @@ tests/cases/compiler/promisePermutations3.ts(109,19): error TS2345: Argument of tests/cases/compiler/promisePermutations3.ts(110,19): error TS2345: Argument of type '(cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. Types of parameters 'cb' and 'value' are incompatible. Type 'string' is not assignable to type '(a: T) => T'. -tests/cases/compiler/promisePermutations3.ts(116,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. -tests/cases/compiler/promisePermutations3.ts(119,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. -tests/cases/compiler/promisePermutations3.ts(120,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => Promise'. +tests/cases/compiler/promisePermutations3.ts(116,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +tests/cases/compiler/promisePermutations3.ts(119,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +tests/cases/compiler/promisePermutations3.ts(120,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => Promise'. tests/cases/compiler/promisePermutations3.ts(121,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => IPromise'. -tests/cases/compiler/promisePermutations3.ts(125,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +tests/cases/compiler/promisePermutations3.ts(125,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. tests/cases/compiler/promisePermutations3.ts(128,11): error TS2453: The type argument for type parameter 'U' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'IPromise' is not a valid type argument because it is not a supertype of candidate 'IPromise'. Type 'string' is not assignable to type 'number'. -tests/cases/compiler/promisePermutations3.ts(131,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. -tests/cases/compiler/promisePermutations3.ts(132,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => Promise'. +tests/cases/compiler/promisePermutations3.ts(131,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +tests/cases/compiler/promisePermutations3.ts(132,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => Promise'. tests/cases/compiler/promisePermutations3.ts(133,19): error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => IPromise'. tests/cases/compiler/promisePermutations3.ts(136,11): error TS2453: The type argument for type parameter 'U' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'IPromise' is not a valid type argument because it is not a supertype of candidate 'IPromise'. @@ -54,9 +54,8 @@ tests/cases/compiler/promisePermutations3.ts(151,12): error TS2453: The type arg Types of property 'then' are incompatible. Type '(success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void) => IPromise' is not assignable to type '{ (onfulfilled?: (value: number) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike): Promise; (success?: (value: number) => Promise, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => Promise, error?: (error: any) => U, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }'. Types of parameters 'success' and 'onfulfilled' are incompatible. - Type '(value: number) => any' is not assignable to type '(value: string) => any'. - Types of parameters 'value' and 'value' are incompatible. - Type 'string' is not assignable to type 'number'. + Types of parameters 'value' and 'value' are incompatible. + Type 'string' is not assignable to type 'number'. tests/cases/compiler/promisePermutations3.ts(155,21): error TS2345: Argument of type '{ (x: number): IPromise; (x: string): IPromise; }' is not assignable to parameter of type '(value: number) => IPromise'. Type 'IPromise' is not assignable to type 'IPromise'. Type 'number' is not assignable to type 'string'. @@ -70,9 +69,8 @@ tests/cases/compiler/promisePermutations3.ts(159,21): error TS2345: Argument of Types of property 'then' are incompatible. Type '{ (onfulfilled?: (value: number) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike): Promise; (success?: (value: number) => Promise, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => Promise, error?: (error: any) => U, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }' is not assignable to type '(success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void) => IPromise'. Types of parameters 'onfulfilled' and 'success' are incompatible. - Type '(value: string) => any' is not assignable to type '(value: number) => any'. - Types of parameters 'value' and 'value' are incompatible. - Type 'number' is not assignable to type 'string'. + Types of parameters 'value' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations3.ts(165,21): error TS2345: Argument of type '{ (x: T): IPromise; (x: T, y: T): Promise; }' is not assignable to parameter of type '(value: (x: any) => any) => Promise'. Type 'IPromise' is not assignable to type 'Promise'. Types of property 'then' are incompatible. @@ -252,15 +250,15 @@ tests/cases/compiler/promisePermutations3.ts(165,21): error TS2345: Argument of var nPromise: (x: any) => Promise; var r8a = r8.then(testFunction8, testFunction8, testFunction8); // error ~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. var r8b = r8.then(nIPromise, nIPromise, nIPromise).then(nIPromise, nIPromise, nIPromise); // ok var s8: Promise; var s8a = s8.then(testFunction8, testFunction8, testFunction8); // error ~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. var s8b = s8.then(testFunction8P, testFunction8P, testFunction8P); // error ~~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => Promise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => Promise'. var s8c = s8.then(testFunction8P, testFunction8, testFunction8); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => IPromise'. @@ -269,7 +267,7 @@ tests/cases/compiler/promisePermutations3.ts(165,21): error TS2345: Argument of var r9: IPromise; var r9a = r9.then(testFunction9, testFunction9, testFunction9); // error ~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. var r9b = r9.then(sIPromise, sIPromise, sIPromise); // ok var r9c = r9.then(nIPromise, nIPromise, nIPromise); // ok var r9d = r9.then(testFunction, sIPromise, nIPromise); // error @@ -281,10 +279,10 @@ tests/cases/compiler/promisePermutations3.ts(165,21): error TS2345: Argument of var s9: Promise; var s9a = s9.then(testFunction9, testFunction9, testFunction9); // error ~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. var s9b = s9.then(testFunction9P, testFunction9P, testFunction9P); // error ~~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => Promise'. +!!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => Promise'. var s9c = s9.then(testFunction9P, testFunction9, testFunction9); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: T, cb: (a: U) => U) => Promise' is not assignable to parameter of type '(value: number) => IPromise'. @@ -318,9 +316,8 @@ tests/cases/compiler/promisePermutations3.ts(165,21): error TS2345: Argument of !!! error TS2453: Types of property 'then' are incompatible. !!! error TS2453: Type '(success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void) => IPromise' is not assignable to type '{ (onfulfilled?: (value: number) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike): Promise; (success?: (value: number) => Promise, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => Promise, error?: (error: any) => U, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }'. !!! error TS2453: Types of parameters 'success' and 'onfulfilled' are incompatible. -!!! error TS2453: Type '(value: number) => any' is not assignable to type '(value: string) => any'. -!!! error TS2453: Types of parameters 'value' and 'value' are incompatible. -!!! error TS2453: Type 'string' is not assignable to type 'number'. +!!! error TS2453: Types of parameters 'value' and 'value' are incompatible. +!!! error TS2453: Type 'string' is not assignable to type 'number'. var s10g = s10.then(testFunctionP, nIPromise, sIPromise).then(sPromise, sIPromise, sIPromise); // ok var r11: IPromise; @@ -346,9 +343,8 @@ tests/cases/compiler/promisePermutations3.ts(165,21): error TS2345: Argument of !!! error TS2345: Types of property 'then' are incompatible. !!! error TS2345: Type '{ (onfulfilled?: (value: number) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike): Promise; (success?: (value: number) => Promise, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => Promise, error?: (error: any) => U, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }' is not assignable to type '(success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void) => IPromise'. !!! error TS2345: Types of parameters 'onfulfilled' and 'success' are incompatible. -!!! error TS2345: Type '(value: string) => any' is not assignable to type '(value: number) => any'. -!!! error TS2345: Types of parameters 'value' and 'value' are incompatible. -!!! error TS2345: Type 'number' is not assignable to type 'string'. +!!! error TS2345: Types of parameters 'value' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var r12 = testFunction12(x => x); var r12a = r12.then(testFunction12, testFunction12, testFunction12); // ok diff --git a/tests/baselines/reference/promisesWithConstraints.errors.txt b/tests/baselines/reference/promisesWithConstraints.errors.txt new file mode 100644 index 00000000000..d2c459da284 --- /dev/null +++ b/tests/baselines/reference/promisesWithConstraints.errors.txt @@ -0,0 +1,36 @@ +tests/cases/compiler/promisesWithConstraints.ts(15,1): error TS2322: Type 'Promise' is not assignable to type 'Promise'. + Type 'Foo' is not assignable to type 'Bar'. + Property 'y' is missing in type 'Foo'. +tests/cases/compiler/promisesWithConstraints.ts(20,1): error TS2322: Type 'CPromise' is not assignable to type 'CPromise'. + Type 'Foo' is not assignable to type 'Bar'. + + +==== tests/cases/compiler/promisesWithConstraints.ts (2 errors) ==== + interface Promise { + then(cb: (x: T) => Promise): Promise; + } + + interface CPromise { + then(cb: (x: T) => Promise): Promise; + } + + interface Foo { x; } + interface Bar { x; y; } + + var a: Promise; + var b: Promise; + a = b; // ok + b = a; // ok + ~ +!!! error TS2322: Type 'Promise' is not assignable to type 'Promise'. +!!! error TS2322: Type 'Foo' is not assignable to type 'Bar'. +!!! error TS2322: Property 'y' is missing in type 'Foo'. + + var a2: CPromise; + var b2: CPromise; + a2 = b2; // ok + b2 = a2; // was error + ~~ +!!! error TS2322: Type 'CPromise' is not assignable to type 'CPromise'. +!!! error TS2322: Type 'Foo' is not assignable to type 'Bar'. + \ No newline at end of file diff --git a/tests/baselines/reference/recursiveTypeComparison2.errors.txt b/tests/baselines/reference/recursiveTypeComparison2.errors.txt index 5c1200ceec6..71f337ad15f 100644 --- a/tests/baselines/reference/recursiveTypeComparison2.errors.txt +++ b/tests/baselines/reference/recursiveTypeComparison2.errors.txt @@ -1,7 +1,9 @@ tests/cases/compiler/recursiveTypeComparison2.ts(13,80): error TS2304: Cannot find name 'StateValue'. +tests/cases/compiler/recursiveTypeComparison2.ts(30,5): error TS2322: Type 'Bus<{}>' is not assignable to type 'Bus'. + Type '{}' is not assignable to type 'number'. -==== tests/cases/compiler/recursiveTypeComparison2.ts (1 errors) ==== +==== tests/cases/compiler/recursiveTypeComparison2.ts (2 errors) ==== // Before fix this would cause compiler to hang (#1170) declare module Bacon { @@ -33,4 +35,7 @@ tests/cases/compiler/recursiveTypeComparison2.ts(13,80): error TS2304: Cannot fi var Bus: new () => Bus; } - var stuck: Bacon.Bus = new Bacon.Bus(); \ No newline at end of file + var stuck: Bacon.Bus = new Bacon.Bus(); + ~~~~~ +!!! error TS2322: Type 'Bus<{}>' is not assignable to type 'Bus'. +!!! error TS2322: Type '{}' is not assignable to type 'number'. \ No newline at end of file diff --git a/tests/baselines/reference/subtypingWithCallSignatures2.types b/tests/baselines/reference/subtypingWithCallSignatures2.types index 8ce4b566b86..3d0b212acce 100644 --- a/tests/baselines/reference/subtypingWithCallSignatures2.types +++ b/tests/baselines/reference/subtypingWithCallSignatures2.types @@ -470,14 +470,14 @@ var r5 = foo5(r5arg1); // any >r5arg1 : (x: (arg: T) => U) => T var r5a = [r5arg1, r5arg2]; ->r5a : ((x: (arg: T) => U) => T)[] ->[r5arg1, r5arg2] : ((x: (arg: T) => U) => T)[] +>r5a : (((x: (arg: T) => U) => T) | ((x: (arg: string) => number) => string))[] +>[r5arg1, r5arg2] : (((x: (arg: T) => U) => T) | ((x: (arg: string) => number) => string))[] >r5arg1 : (x: (arg: T) => U) => T >r5arg2 : (x: (arg: string) => number) => string var r5b = [r5arg2, r5arg1]; ->r5b : ((x: (arg: T) => U) => T)[] ->[r5arg2, r5arg1] : ((x: (arg: T) => U) => T)[] +>r5b : (((x: (arg: T) => U) => T) | ((x: (arg: string) => number) => string))[] +>[r5arg2, r5arg1] : (((x: (arg: T) => U) => T) | ((x: (arg: string) => number) => string))[] >r5arg2 : (x: (arg: string) => number) => string >r5arg1 : (x: (arg: T) => U) => T @@ -514,14 +514,14 @@ var r6 = foo6(r6arg1); // any >r6arg1 : (x: (arg: T) => U) => T var r6a = [r6arg1, r6arg2]; ->r6a : ((x: (arg: T) => U) => T)[] ->[r6arg1, r6arg2] : ((x: (arg: T) => U) => T)[] +>r6a : (((x: (arg: T) => U) => T) | ((x: (arg: Base) => Derived) => Base))[] +>[r6arg1, r6arg2] : (((x: (arg: T) => U) => T) | ((x: (arg: Base) => Derived) => Base))[] >r6arg1 : (x: (arg: T) => U) => T >r6arg2 : (x: (arg: Base) => Derived) => Base var r6b = [r6arg2, r6arg1]; ->r6b : ((x: (arg: T) => U) => T)[] ->[r6arg2, r6arg1] : ((x: (arg: T) => U) => T)[] +>r6b : (((x: (arg: T) => U) => T) | ((x: (arg: Base) => Derived) => Base))[] +>[r6arg2, r6arg1] : (((x: (arg: T) => U) => T) | ((x: (arg: Base) => Derived) => Base))[] >r6arg2 : (x: (arg: Base) => Derived) => Base >r6arg1 : (x: (arg: T) => U) => T @@ -564,14 +564,14 @@ var r7 = foo7(r7arg1); // any >r7arg1 : (x: (arg: T) => U) => (r: T) => U var r7a = [r7arg1, r7arg2]; ->r7a : ((x: (arg: T) => U) => (r: T) => U)[] ->[r7arg1, r7arg2] : ((x: (arg: T) => U) => (r: T) => U)[] +>r7a : (((x: (arg: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived) => (r: Base) => Derived))[] +>[r7arg1, r7arg2] : (((x: (arg: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived) => (r: Base) => Derived))[] >r7arg1 : (x: (arg: T) => U) => (r: T) => U >r7arg2 : (x: (arg: Base) => Derived) => (r: Base) => Derived var r7b = [r7arg2, r7arg1]; ->r7b : ((x: (arg: T) => U) => (r: T) => U)[] ->[r7arg2, r7arg1] : ((x: (arg: T) => U) => (r: T) => U)[] +>r7b : (((x: (arg: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived) => (r: Base) => Derived))[] +>[r7arg2, r7arg1] : (((x: (arg: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived) => (r: Base) => Derived))[] >r7arg2 : (x: (arg: Base) => Derived) => (r: Base) => Derived >r7arg1 : (x: (arg: T) => U) => (r: T) => U @@ -622,14 +622,14 @@ var r8 = foo8(r8arg1); // any >r8arg1 : (x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U var r8a = [r8arg1, r8arg2]; ->r8a : ((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U)[] ->[r8arg1, r8arg2] : ((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U)[] +>r8a : (((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived))[] +>[r8arg1, r8arg2] : (((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived))[] >r8arg1 : (x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U >r8arg2 : (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived var r8b = [r8arg2, r8arg1]; ->r8b : ((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U)[] ->[r8arg2, r8arg1] : ((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U)[] +>r8b : (((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived))[] +>[r8arg2, r8arg1] : (((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived))[] >r8arg2 : (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived >r8arg1 : (x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U @@ -681,14 +681,14 @@ var r9 = foo9(r9arg1); // any >r9arg1 : (x: (arg: T) => U, y: (arg2: { foo: string; bing: number; }) => U) => (r: T) => U var r9a = [r9arg1, r9arg2]; ->r9a : ((x: (arg: T) => U, y: (arg2: { foo: string; bing: number; }) => U) => (r: T) => U)[] ->[r9arg1, r9arg2] : ((x: (arg: T) => U, y: (arg2: { foo: string; bing: number; }) => U) => (r: T) => U)[] +>r9a : (((x: (arg: T) => U, y: (arg2: { foo: string; bing: number; }) => U) => (r: T) => U) | ((x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived))[] +>[r9arg1, r9arg2] : (((x: (arg: T) => U, y: (arg2: { foo: string; bing: number; }) => U) => (r: T) => U) | ((x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived))[] >r9arg1 : (x: (arg: T) => U, y: (arg2: { foo: string; bing: number; }) => U) => (r: T) => U >r9arg2 : (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived var r9b = [r9arg2, r9arg1]; ->r9b : ((x: (arg: T) => U, y: (arg2: { foo: string; bing: number; }) => U) => (r: T) => U)[] ->[r9arg2, r9arg1] : ((x: (arg: T) => U, y: (arg2: { foo: string; bing: number; }) => U) => (r: T) => U)[] +>r9b : (((x: (arg: T) => U, y: (arg2: { foo: string; bing: number; }) => U) => (r: T) => U) | ((x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived))[] +>[r9arg2, r9arg1] : (((x: (arg: T) => U, y: (arg2: { foo: string; bing: number; }) => U) => (r: T) => U) | ((x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived))[] >r9arg2 : (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived >r9arg1 : (x: (arg: T) => U, y: (arg2: { foo: string; bing: number; }) => U) => (r: T) => U diff --git a/tests/baselines/reference/subtypingWithCallSignatures3.types b/tests/baselines/reference/subtypingWithCallSignatures3.types index 6abc7567efb..d505fc7d346 100644 --- a/tests/baselines/reference/subtypingWithCallSignatures3.types +++ b/tests/baselines/reference/subtypingWithCallSignatures3.types @@ -291,14 +291,14 @@ module Errors { >r2arg : (x: (arg: T) => U) => (r: T) => V var r2a = [r2arg2, r2arg]; ->r2a : ((x: (arg: T) => U) => (r: T) => V)[] ->[r2arg2, r2arg] : ((x: (arg: T) => U) => (r: T) => V)[] +>r2a : (((x: (arg: T) => U) => (r: T) => V) | ((x: (arg: Base) => Derived) => (r: Base) => Derived2))[] +>[r2arg2, r2arg] : (((x: (arg: T) => U) => (r: T) => V) | ((x: (arg: Base) => Derived) => (r: Base) => Derived2))[] >r2arg2 : (x: (arg: Base) => Derived) => (r: Base) => Derived2 >r2arg : (x: (arg: T) => U) => (r: T) => V var r2b = [r2arg, r2arg2]; ->r2b : ((x: (arg: T) => U) => (r: T) => V)[] ->[r2arg, r2arg2] : ((x: (arg: T) => U) => (r: T) => V)[] +>r2b : (((x: (arg: T) => U) => (r: T) => V) | ((x: (arg: Base) => Derived) => (r: Base) => Derived2))[] +>[r2arg, r2arg2] : (((x: (arg: T) => U) => (r: T) => V) | ((x: (arg: Base) => Derived) => (r: Base) => Derived2))[] >r2arg : (x: (arg: T) => U) => (r: T) => V >r2arg2 : (x: (arg: Base) => Derived) => (r: Base) => Derived2 diff --git a/tests/baselines/reference/subtypingWithCallSignatures4.types b/tests/baselines/reference/subtypingWithCallSignatures4.types index 5926636289a..a882d07e8ea 100644 --- a/tests/baselines/reference/subtypingWithCallSignatures4.types +++ b/tests/baselines/reference/subtypingWithCallSignatures4.types @@ -447,14 +447,14 @@ var r6 = foo6(r6arg); >r6arg : (x: (arg: T) => U) => T var r6a = [r6arg, r6arg2]; ->r6a : ((x: (arg: T) => U) => T)[] ->[r6arg, r6arg2] : ((x: (arg: T) => U) => T)[] +>r6a : ((x: (arg: T) => Derived) => T)[] +>[r6arg, r6arg2] : ((x: (arg: T) => Derived) => T)[] >r6arg : (x: (arg: T) => U) => T >r6arg2 : (x: (arg: T) => Derived) => T var r6b = [r6arg2, r6arg]; ->r6b : ((x: (arg: T) => U) => T)[] ->[r6arg2, r6arg] : ((x: (arg: T) => U) => T)[] +>r6b : ((x: (arg: T) => Derived) => T)[] +>[r6arg2, r6arg] : ((x: (arg: T) => Derived) => T)[] >r6arg2 : (x: (arg: T) => Derived) => T >r6arg : (x: (arg: T) => U) => T From 50f84b12a2ad5fef8294410c2cdfcce35b49a577 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sat, 8 Apr 2017 14:19:25 -0700 Subject: [PATCH 12/33] Add tests --- .../reference/covariantCallbacks.errors.txt | 105 ++++++++++++++++++ .../baselines/reference/covariantCallbacks.js | 82 ++++++++++++++ .../covariantCallbacks.ts | 59 ++++++++++ 3 files changed, 246 insertions(+) create mode 100644 tests/baselines/reference/covariantCallbacks.errors.txt create mode 100644 tests/baselines/reference/covariantCallbacks.js create mode 100644 tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts diff --git a/tests/baselines/reference/covariantCallbacks.errors.txt b/tests/baselines/reference/covariantCallbacks.errors.txt new file mode 100644 index 00000000000..3a1ea25b96e --- /dev/null +++ b/tests/baselines/reference/covariantCallbacks.errors.txt @@ -0,0 +1,105 @@ +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(12,5): error TS2322: Type 'P' is not assignable to type 'P'. + Type 'A' is not assignable to type 'B'. + Property 'b' is missing in type 'A'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(17,5): error TS2322: Type 'Promise' is not assignable to type 'Promise'. + Type 'A' is not assignable to type 'B'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(30,5): error TS2322: Type 'AList1' is not assignable to type 'BList1'. + Types of property 'forEach' are incompatible. + Type '(cb: (item: A) => void) => void' is not assignable to type '(cb: (item: B) => void) => void'. + Types of parameters 'cb' and 'cb' are incompatible. + Types of parameters 'item' and 'item' are incompatible. + Type 'A' is not assignable to type 'B'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(43,5): error TS2322: Type 'AList2' is not assignable to type 'BList2'. + Types of property 'forEach' are incompatible. + Type '(cb: (item: A) => boolean) => void' is not assignable to type '(cb: (item: A) => void) => void'. + Types of parameters 'cb' and 'cb' are incompatible. + Type 'void' is not assignable to type 'boolean'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(56,5): error TS2322: Type 'AList3' is not assignable to type 'BList3'. + Types of property 'forEach' are incompatible. + Type '(cb: (item: A) => void) => void' is not assignable to type '(cb: (item: A, context: any) => void) => void'. + Types of parameters 'cb' and 'cb' are incompatible. + + +==== tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts (5 errors) ==== + // Test that callback parameters are related covariantly + + interface P { + then(cb: (value: T) => void): void; + }; + + interface A { a: string } + interface B extends A { b: string } + + function f1(a: P, b: P) { + a = b; + b = a; // Error + ~ +!!! error TS2322: Type 'P' is not assignable to type 'P'. +!!! error TS2322: Type 'A' is not assignable to type 'B'. +!!! error TS2322: Property 'b' is missing in type 'A'. + } + + function f2(a: Promise, b: Promise) { + a = b; + b = a; // Error + ~ +!!! error TS2322: Type 'Promise' is not assignable to type 'Promise'. +!!! error TS2322: Type 'A' is not assignable to type 'B'. + } + + interface AList1 { + forEach(cb: (item: A) => void): void; + } + + interface BList1 { + forEach(cb: (item: B) => void): void; + } + + function f11(a: AList1, b: BList1) { + a = b; + b = a; // Error + ~ +!!! error TS2322: Type 'AList1' is not assignable to type 'BList1'. +!!! error TS2322: Types of property 'forEach' are incompatible. +!!! error TS2322: Type '(cb: (item: A) => void) => void' is not assignable to type '(cb: (item: B) => void) => void'. +!!! error TS2322: Types of parameters 'cb' and 'cb' are incompatible. +!!! error TS2322: Types of parameters 'item' and 'item' are incompatible. +!!! error TS2322: Type 'A' is not assignable to type 'B'. + } + + interface AList2 { + forEach(cb: (item: A) => boolean): void; + } + + interface BList2 { + forEach(cb: (item: A) => void): void; + } + + function f12(a: AList2, b: BList2) { + a = b; + b = a; // Error + ~ +!!! error TS2322: Type 'AList2' is not assignable to type 'BList2'. +!!! error TS2322: Types of property 'forEach' are incompatible. +!!! error TS2322: Type '(cb: (item: A) => boolean) => void' is not assignable to type '(cb: (item: A) => void) => void'. +!!! error TS2322: Types of parameters 'cb' and 'cb' are incompatible. +!!! error TS2322: Type 'void' is not assignable to type 'boolean'. + } + + interface AList3 { + forEach(cb: (item: A) => void): void; + } + + interface BList3 { + forEach(cb: (item: A, context: any) => void): void; + } + + function f13(a: AList3, b: BList3) { + a = b; + b = a; // Error + ~ +!!! error TS2322: Type 'AList3' is not assignable to type 'BList3'. +!!! error TS2322: Types of property 'forEach' are incompatible. +!!! error TS2322: Type '(cb: (item: A) => void) => void' is not assignable to type '(cb: (item: A, context: any) => void) => void'. +!!! error TS2322: Types of parameters 'cb' and 'cb' are incompatible. + } \ No newline at end of file diff --git a/tests/baselines/reference/covariantCallbacks.js b/tests/baselines/reference/covariantCallbacks.js new file mode 100644 index 00000000000..fb2ecfbc3c1 --- /dev/null +++ b/tests/baselines/reference/covariantCallbacks.js @@ -0,0 +1,82 @@ +//// [covariantCallbacks.ts] +// Test that callback parameters are related covariantly + +interface P { + then(cb: (value: T) => void): void; +}; + +interface A { a: string } +interface B extends A { b: string } + +function f1(a: P, b: P) { + a = b; + b = a; // Error +} + +function f2(a: Promise, b: Promise) { + a = b; + b = a; // Error +} + +interface AList1 { + forEach(cb: (item: A) => void): void; +} + +interface BList1 { + forEach(cb: (item: B) => void): void; +} + +function f11(a: AList1, b: BList1) { + a = b; + b = a; // Error +} + +interface AList2 { + forEach(cb: (item: A) => boolean): void; +} + +interface BList2 { + forEach(cb: (item: A) => void): void; +} + +function f12(a: AList2, b: BList2) { + a = b; + b = a; // Error +} + +interface AList3 { + forEach(cb: (item: A) => void): void; +} + +interface BList3 { + forEach(cb: (item: A, context: any) => void): void; +} + +function f13(a: AList3, b: BList3) { + a = b; + b = a; // Error +} + +//// [covariantCallbacks.js] +// Test that callback parameters are related covariantly +; +function f1(a, b) { + a = b; + b = a; // Error +} +function f2(a, b) { + a = b; + b = a; // Error +} +function f11(a, b) { + a = b; + b = a; // Error +} +function f12(a, b) { + a = b; + b = a; // Error +} +function f13(a, b) { + a = b; + b = a; // Error +} diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts new file mode 100644 index 00000000000..c46f396f414 --- /dev/null +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts @@ -0,0 +1,59 @@ +// @target: es2015 + +// Test that callback parameters are related covariantly + +interface P { + then(cb: (value: T) => void): void; +}; + +interface A { a: string } +interface B extends A { b: string } + +function f1(a: P, b: P) { + a = b; + b = a; // Error +} + +function f2(a: Promise, b: Promise) { + a = b; + b = a; // Error +} + +interface AList1 { + forEach(cb: (item: A) => void): void; +} + +interface BList1 { + forEach(cb: (item: B) => void): void; +} + +function f11(a: AList1, b: BList1) { + a = b; + b = a; // Error +} + +interface AList2 { + forEach(cb: (item: A) => boolean): void; +} + +interface BList2 { + forEach(cb: (item: A) => void): void; +} + +function f12(a: AList2, b: BList2) { + a = b; + b = a; // Error +} + +interface AList3 { + forEach(cb: (item: A) => void): void; +} + +interface BList3 { + forEach(cb: (item: A, context: any) => void): void; +} + +function f13(a: AList3, b: BList3) { + a = b; + b = a; // Error +} \ No newline at end of file From e9f95e2296e66b6fd2afc51663309426bbf3e0ae Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Mon, 10 Apr 2017 09:06:26 -0700 Subject: [PATCH 13/33] Only trace if traceEnabled --- src/compiler/moduleNameResolver.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts index 44779c3b482..e42088c3a2b 100644 --- a/src/compiler/moduleNameResolver.ts +++ b/src/compiler/moduleNameResolver.ts @@ -954,17 +954,19 @@ namespace ts { } nodeModulesAtTypesExists = false; } - return loadModuleFromNodeModulesFolder(Extensions.DtsOnly, mangleScopedPackage(moduleName, state.host), nodeModulesAtTypes, nodeModulesAtTypesExists, failedLookupLocations, state); + return loadModuleFromNodeModulesFolder(Extensions.DtsOnly, mangleScopedPackage(moduleName, state), nodeModulesAtTypes, nodeModulesAtTypesExists, failedLookupLocations, state); } } /** For a scoped package, we must look in `@types/foo__bar` instead of `@types/@foo/bar`. */ - function mangleScopedPackage(moduleName: string, host: ModuleResolutionHost): string { + function mangleScopedPackage(moduleName: string, state: ModuleResolutionState): string { if (startsWith(moduleName, "@")) { const replaceSlash = moduleName.replace(ts.directorySeparator, "__"); if (replaceSlash !== moduleName) { const mangled = replaceSlash.slice(1); // Take off the "@" - trace(host, Diagnostics.Scoped_package_detected_looking_in_0, mangled); + if (state.traceEnabled) { + trace(state.host, Diagnostics.Scoped_package_detected_looking_in_0, mangled); + } return mangled; } } From 189fc515796a2612874ea7f74226edc0aacc5088 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Mon, 10 Apr 2017 07:22:10 -1000 Subject: [PATCH 14/33] Check callback return values bi-variantly --- src/compiler/checker.ts | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 150dc412f7b..e3fad53c3a7 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8157,7 +8157,7 @@ namespace ts { function isSignatureAssignableTo(source: Signature, target: Signature, ignoreReturnTypes: boolean): boolean { - return compareSignaturesRelated(source, target, /*strictVariance*/ false, ignoreReturnTypes, /*reportErrors*/ false, + return compareSignaturesRelated(source, target, /*checkAsCallback*/ false, ignoreReturnTypes, /*reportErrors*/ false, /*errorReporter*/ undefined, compareTypesAssignable) !== Ternary.False; } @@ -8168,7 +8168,7 @@ namespace ts { */ function compareSignaturesRelated(source: Signature, target: Signature, - strictVariance: boolean, + checkAsCallback: boolean, ignoreReturnTypes: boolean, reportErrors: boolean, errorReporter: ErrorReporter, @@ -8215,13 +8215,17 @@ namespace ts { const targetType = i < targetMax ? getTypeOfParameter(targetParams[i]) : getRestTypeOfSignature(target); const sourceSig = getSingleCallSignature(sourceType); const targetSig = getSingleCallSignature(targetType); - // If the source and target parameters both have function types with a single call signature we are - // relating two callback parameters. In that case we compare the callback signatures with strict - // variance, meaning we require the callback parameters to be pairwise co-variant (because, similar - // to return values, callback parameters are output positions). - const related = sourceSig && targetSig ? - compareSignaturesRelated(targetSig, sourceSig, /*strictVariance*/ true, /*ignoreReturnTypes*/ false, reportErrors, errorReporter, compareTypes) : - !strictVariance && compareTypes(sourceType, targetType, /*reportErrors*/ false) || compareTypes(targetType, sourceType, reportErrors); + // In order to ensure that any generic type Foo is at least co-variant with respect to T no matter + // how Foo uses T, we need to relate parameters bi-variantly (given that parameters are input positions, + // they naturally relate only contra-variantly). However, if the source and target parameters both have + // function types with a single call signature, we known we are relating two callback parameters. In + // that case it is sufficient to only relate the parameters of the signatures co-variantly because, + // similar to return values, callback parameters are output positions. This means that a Promise, + // where T is used only in callback parameter positions, will be co-variant (as opposed to bi-variant) + // with respect to T. + const related = sourceSig && targetSig && !sourceSig.typePredicate && !targetSig.typePredicate ? + compareSignaturesRelated(targetSig, sourceSig, /*checkAsCallback*/ true, /*ignoreReturnTypes*/ false, reportErrors, errorReporter, compareTypes) : + !checkAsCallback && compareTypes(sourceType, targetType, /*reportErrors*/ false) || compareTypes(targetType, sourceType, reportErrors); if (!related) { if (reportErrors) { errorReporter(Diagnostics.Types_of_parameters_0_and_1_are_incompatible, @@ -8253,7 +8257,11 @@ namespace ts { } } else { - result &= compareTypes(sourceReturnType, targetReturnType, reportErrors); + // When relating callback signatures, we still need to relate return types bi-variantly as otherwise + // the containing type wouldn't be co-variant. For example, interface Foo { add(cb: () => T): void } + // wouldn't be co-variant for T without this rule. + result &= checkAsCallback && compareTypes(targetReturnType, sourceReturnType, /*reportErrors*/ false) || + compareTypes(sourceReturnType, targetReturnType, reportErrors); } } @@ -9220,7 +9228,7 @@ namespace ts { * See signatureAssignableTo, compareSignaturesIdentical */ function signatureRelatedTo(source: Signature, target: Signature, reportErrors: boolean): Ternary { - return compareSignaturesRelated(source, target, /*strictVariance*/ false, /*ignoreReturnTypes*/ false, reportErrors, reportError, isRelatedTo); + return compareSignaturesRelated(source, target, /*checkAsCallback*/ false, /*ignoreReturnTypes*/ false, reportErrors, reportError, isRelatedTo); } function signaturesIdenticalTo(source: Type, target: Type, kind: SignatureKind): Ternary { From 33bc9d161685bf41d0072a566b89226543ad0a63 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Mon, 10 Apr 2017 07:22:20 -1000 Subject: [PATCH 15/33] Accept new baselines --- ...typeIsAssignableToReadonlyArray.errors.txt | 2 ++ .../subtypingWithCallSignatures2.types | 32 +++++++++---------- .../subtypingWithCallSignatures3.types | 8 ++--- .../subtypingWithCallSignatures4.types | 8 ++--- 4 files changed, 26 insertions(+), 24 deletions(-) diff --git a/tests/baselines/reference/arrayOfSubtypeIsAssignableToReadonlyArray.errors.txt b/tests/baselines/reference/arrayOfSubtypeIsAssignableToReadonlyArray.errors.txt index 51a581b7fb3..90dc909b11a 100644 --- a/tests/baselines/reference/arrayOfSubtypeIsAssignableToReadonlyArray.errors.txt +++ b/tests/baselines/reference/arrayOfSubtypeIsAssignableToReadonlyArray.errors.txt @@ -3,6 +3,7 @@ tests/cases/compiler/arrayOfSubtypeIsAssignableToReadonlyArray.ts(13,1): error T Type '{ (...items: A[][]): A[]; (...items: (A | A[])[]): A[]; }' is not assignable to type '{ >(...items: U[]): B[]; (...items: B[][]): B[]; (...items: (B | B[])[]): B[]; }'. Type 'A[]' is not assignable to type 'B[]'. Type 'A' is not assignable to type 'B'. + Property 'b' is missing in type 'A'. tests/cases/compiler/arrayOfSubtypeIsAssignableToReadonlyArray.ts(18,1): error TS2322: Type 'C' is not assignable to type 'ReadonlyArray'. Types of property 'concat' are incompatible. Type '{ (...items: A[][]): A[]; (...items: (A | A[])[]): A[]; }' is not assignable to type '{ >(...items: U[]): B[]; (...items: B[][]): B[]; (...items: (B | B[])[]): B[]; }'. @@ -29,6 +30,7 @@ tests/cases/compiler/arrayOfSubtypeIsAssignableToReadonlyArray.ts(18,1): error T !!! error TS2322: Type '{ (...items: A[][]): A[]; (...items: (A | A[])[]): A[]; }' is not assignable to type '{ >(...items: U[]): B[]; (...items: B[][]): B[]; (...items: (B | B[])[]): B[]; }'. !!! error TS2322: Type 'A[]' is not assignable to type 'B[]'. !!! error TS2322: Type 'A' is not assignable to type 'B'. +!!! error TS2322: Property 'b' is missing in type 'A'. rra = cra; rra = crb; // OK, C is assignable to ReadonlyArray diff --git a/tests/baselines/reference/subtypingWithCallSignatures2.types b/tests/baselines/reference/subtypingWithCallSignatures2.types index 3d0b212acce..86c65702b98 100644 --- a/tests/baselines/reference/subtypingWithCallSignatures2.types +++ b/tests/baselines/reference/subtypingWithCallSignatures2.types @@ -470,14 +470,14 @@ var r5 = foo5(r5arg1); // any >r5arg1 : (x: (arg: T) => U) => T var r5a = [r5arg1, r5arg2]; ->r5a : (((x: (arg: T) => U) => T) | ((x: (arg: string) => number) => string))[] ->[r5arg1, r5arg2] : (((x: (arg: T) => U) => T) | ((x: (arg: string) => number) => string))[] +>r5a : ((x: (arg: T) => U) => T)[] +>[r5arg1, r5arg2] : ((x: (arg: T) => U) => T)[] >r5arg1 : (x: (arg: T) => U) => T >r5arg2 : (x: (arg: string) => number) => string var r5b = [r5arg2, r5arg1]; ->r5b : (((x: (arg: T) => U) => T) | ((x: (arg: string) => number) => string))[] ->[r5arg2, r5arg1] : (((x: (arg: T) => U) => T) | ((x: (arg: string) => number) => string))[] +>r5b : ((x: (arg: T) => U) => T)[] +>[r5arg2, r5arg1] : ((x: (arg: T) => U) => T)[] >r5arg2 : (x: (arg: string) => number) => string >r5arg1 : (x: (arg: T) => U) => T @@ -514,14 +514,14 @@ var r6 = foo6(r6arg1); // any >r6arg1 : (x: (arg: T) => U) => T var r6a = [r6arg1, r6arg2]; ->r6a : (((x: (arg: T) => U) => T) | ((x: (arg: Base) => Derived) => Base))[] ->[r6arg1, r6arg2] : (((x: (arg: T) => U) => T) | ((x: (arg: Base) => Derived) => Base))[] +>r6a : ((x: (arg: T) => U) => T)[] +>[r6arg1, r6arg2] : ((x: (arg: T) => U) => T)[] >r6arg1 : (x: (arg: T) => U) => T >r6arg2 : (x: (arg: Base) => Derived) => Base var r6b = [r6arg2, r6arg1]; ->r6b : (((x: (arg: T) => U) => T) | ((x: (arg: Base) => Derived) => Base))[] ->[r6arg2, r6arg1] : (((x: (arg: T) => U) => T) | ((x: (arg: Base) => Derived) => Base))[] +>r6b : ((x: (arg: T) => U) => T)[] +>[r6arg2, r6arg1] : ((x: (arg: T) => U) => T)[] >r6arg2 : (x: (arg: Base) => Derived) => Base >r6arg1 : (x: (arg: T) => U) => T @@ -564,14 +564,14 @@ var r7 = foo7(r7arg1); // any >r7arg1 : (x: (arg: T) => U) => (r: T) => U var r7a = [r7arg1, r7arg2]; ->r7a : (((x: (arg: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived) => (r: Base) => Derived))[] ->[r7arg1, r7arg2] : (((x: (arg: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived) => (r: Base) => Derived))[] +>r7a : ((x: (arg: T) => U) => (r: T) => U)[] +>[r7arg1, r7arg2] : ((x: (arg: T) => U) => (r: T) => U)[] >r7arg1 : (x: (arg: T) => U) => (r: T) => U >r7arg2 : (x: (arg: Base) => Derived) => (r: Base) => Derived var r7b = [r7arg2, r7arg1]; ->r7b : (((x: (arg: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived) => (r: Base) => Derived))[] ->[r7arg2, r7arg1] : (((x: (arg: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived) => (r: Base) => Derived))[] +>r7b : ((x: (arg: T) => U) => (r: T) => U)[] +>[r7arg2, r7arg1] : ((x: (arg: T) => U) => (r: T) => U)[] >r7arg2 : (x: (arg: Base) => Derived) => (r: Base) => Derived >r7arg1 : (x: (arg: T) => U) => (r: T) => U @@ -622,14 +622,14 @@ var r8 = foo8(r8arg1); // any >r8arg1 : (x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U var r8a = [r8arg1, r8arg2]; ->r8a : (((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived))[] ->[r8arg1, r8arg2] : (((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived))[] +>r8a : ((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U)[] +>[r8arg1, r8arg2] : ((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U)[] >r8arg1 : (x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U >r8arg2 : (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived var r8b = [r8arg2, r8arg1]; ->r8b : (((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived))[] ->[r8arg2, r8arg1] : (((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U) | ((x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived))[] +>r8b : ((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U)[] +>[r8arg2, r8arg1] : ((x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U)[] >r8arg2 : (x: (arg: Base) => Derived, y: (arg2: Base) => Derived) => (r: Base) => Derived >r8arg1 : (x: (arg: T) => U, y: (arg2: T) => U) => (r: T) => U diff --git a/tests/baselines/reference/subtypingWithCallSignatures3.types b/tests/baselines/reference/subtypingWithCallSignatures3.types index d505fc7d346..6abc7567efb 100644 --- a/tests/baselines/reference/subtypingWithCallSignatures3.types +++ b/tests/baselines/reference/subtypingWithCallSignatures3.types @@ -291,14 +291,14 @@ module Errors { >r2arg : (x: (arg: T) => U) => (r: T) => V var r2a = [r2arg2, r2arg]; ->r2a : (((x: (arg: T) => U) => (r: T) => V) | ((x: (arg: Base) => Derived) => (r: Base) => Derived2))[] ->[r2arg2, r2arg] : (((x: (arg: T) => U) => (r: T) => V) | ((x: (arg: Base) => Derived) => (r: Base) => Derived2))[] +>r2a : ((x: (arg: T) => U) => (r: T) => V)[] +>[r2arg2, r2arg] : ((x: (arg: T) => U) => (r: T) => V)[] >r2arg2 : (x: (arg: Base) => Derived) => (r: Base) => Derived2 >r2arg : (x: (arg: T) => U) => (r: T) => V var r2b = [r2arg, r2arg2]; ->r2b : (((x: (arg: T) => U) => (r: T) => V) | ((x: (arg: Base) => Derived) => (r: Base) => Derived2))[] ->[r2arg, r2arg2] : (((x: (arg: T) => U) => (r: T) => V) | ((x: (arg: Base) => Derived) => (r: Base) => Derived2))[] +>r2b : ((x: (arg: T) => U) => (r: T) => V)[] +>[r2arg, r2arg2] : ((x: (arg: T) => U) => (r: T) => V)[] >r2arg : (x: (arg: T) => U) => (r: T) => V >r2arg2 : (x: (arg: Base) => Derived) => (r: Base) => Derived2 diff --git a/tests/baselines/reference/subtypingWithCallSignatures4.types b/tests/baselines/reference/subtypingWithCallSignatures4.types index a882d07e8ea..5926636289a 100644 --- a/tests/baselines/reference/subtypingWithCallSignatures4.types +++ b/tests/baselines/reference/subtypingWithCallSignatures4.types @@ -447,14 +447,14 @@ var r6 = foo6(r6arg); >r6arg : (x: (arg: T) => U) => T var r6a = [r6arg, r6arg2]; ->r6a : ((x: (arg: T) => Derived) => T)[] ->[r6arg, r6arg2] : ((x: (arg: T) => Derived) => T)[] +>r6a : ((x: (arg: T) => U) => T)[] +>[r6arg, r6arg2] : ((x: (arg: T) => U) => T)[] >r6arg : (x: (arg: T) => U) => T >r6arg2 : (x: (arg: T) => Derived) => T var r6b = [r6arg2, r6arg]; ->r6b : ((x: (arg: T) => Derived) => T)[] ->[r6arg2, r6arg] : ((x: (arg: T) => Derived) => T)[] +>r6b : ((x: (arg: T) => U) => T)[] +>[r6arg2, r6arg] : ((x: (arg: T) => U) => T)[] >r6arg2 : (x: (arg: T) => Derived) => T >r6arg : (x: (arg: T) => U) => T From 510bc8196760f9d62b29d2f3e48a8bc6ad0d8d14 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Mon, 10 Apr 2017 07:33:08 -1000 Subject: [PATCH 16/33] Add another test case --- .../reference/covariantCallbacks.errors.txt | 31 +++++++++++++++++-- .../baselines/reference/covariantCallbacks.js | 20 +++++++++++- .../covariantCallbacks.ts | 15 ++++++++- 3 files changed, 62 insertions(+), 4 deletions(-) diff --git a/tests/baselines/reference/covariantCallbacks.errors.txt b/tests/baselines/reference/covariantCallbacks.errors.txt index 3a1ea25b96e..55c69c89728 100644 --- a/tests/baselines/reference/covariantCallbacks.errors.txt +++ b/tests/baselines/reference/covariantCallbacks.errors.txt @@ -18,9 +18,15 @@ tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covarian Types of property 'forEach' are incompatible. Type '(cb: (item: A) => void) => void' is not assignable to type '(cb: (item: A, context: any) => void) => void'. Types of parameters 'cb' and 'cb' are incompatible. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(69,5): error TS2322: Type 'AList4' is not assignable to type 'BList4'. + Types of property 'forEach' are incompatible. + Type '(cb: (item: A) => A) => void' is not assignable to type '(cb: (item: B) => B) => void'. + Types of parameters 'cb' and 'cb' are incompatible. + Types of parameters 'item' and 'item' are incompatible. + Type 'A' is not assignable to type 'B'. -==== tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts (5 errors) ==== +==== tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts (6 errors) ==== // Test that callback parameters are related covariantly interface P { @@ -102,4 +108,25 @@ tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covarian !!! error TS2322: Types of property 'forEach' are incompatible. !!! error TS2322: Type '(cb: (item: A) => void) => void' is not assignable to type '(cb: (item: A, context: any) => void) => void'. !!! error TS2322: Types of parameters 'cb' and 'cb' are incompatible. - } \ No newline at end of file + } + + interface AList4 { + forEach(cb: (item: A) => A): void; + } + + interface BList4 { + forEach(cb: (item: B) => B): void; + } + + function f14(a: AList4, b: BList4) { + a = b; + b = a; // Error + ~ +!!! error TS2322: Type 'AList4' is not assignable to type 'BList4'. +!!! error TS2322: Types of property 'forEach' are incompatible. +!!! error TS2322: Type '(cb: (item: A) => A) => void' is not assignable to type '(cb: (item: B) => B) => void'. +!!! error TS2322: Types of parameters 'cb' and 'cb' are incompatible. +!!! error TS2322: Types of parameters 'item' and 'item' are incompatible. +!!! error TS2322: Type 'A' is not assignable to type 'B'. + } + \ No newline at end of file diff --git a/tests/baselines/reference/covariantCallbacks.js b/tests/baselines/reference/covariantCallbacks.js index fb2ecfbc3c1..497a1ff9916 100644 --- a/tests/baselines/reference/covariantCallbacks.js +++ b/tests/baselines/reference/covariantCallbacks.js @@ -55,7 +55,21 @@ interface BList3 { function f13(a: AList3, b: BList3) { a = b; b = a; // Error -} +} + +interface AList4 { + forEach(cb: (item: A) => A): void; +} + +interface BList4 { + forEach(cb: (item: B) => B): void; +} + +function f14(a: AList4, b: BList4) { + a = b; + b = a; // Error +} + //// [covariantCallbacks.js] // Test that callback parameters are related covariantly @@ -80,3 +94,7 @@ function f13(a, b) { a = b; b = a; // Error } +function f14(a, b) { + a = b; + b = a; // Error +} diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts index c46f396f414..462911fb17a 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts @@ -56,4 +56,17 @@ interface BList3 { function f13(a: AList3, b: BList3) { a = b; b = a; // Error -} \ No newline at end of file +} + +interface AList4 { + forEach(cb: (item: A) => A): void; +} + +interface BList4 { + forEach(cb: (item: B) => B): void; +} + +function f14(a: AList4, b: BList4) { + a = b; + b = a; // Error +} From ec35b800e30ec735be8946842fcfa6ef45649a2c Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Mon, 10 Apr 2017 17:14:11 -1000 Subject: [PATCH 17/33] Allow callbacks unioned with null and/or undefined --- src/compiler/checker.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e3fad53c3a7..47697d4ff23 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8213,8 +8213,8 @@ namespace ts { for (let i = 0; i < checkCount; i++) { const sourceType = i < sourceMax ? getTypeOfParameter(sourceParams[i]) : getRestTypeOfSignature(source); const targetType = i < targetMax ? getTypeOfParameter(targetParams[i]) : getRestTypeOfSignature(target); - const sourceSig = getSingleCallSignature(sourceType); - const targetSig = getSingleCallSignature(targetType); + const sourceSig = getSingleCallSignature(getNonNullableType(sourceType)); + const targetSig = getSingleCallSignature(getNonNullableType(targetType)); // In order to ensure that any generic type Foo is at least co-variant with respect to T no matter // how Foo uses T, we need to relate parameters bi-variantly (given that parameters are input positions, // they naturally relate only contra-variantly). However, if the source and target parameters both have @@ -8223,7 +8223,9 @@ namespace ts { // similar to return values, callback parameters are output positions. This means that a Promise, // where T is used only in callback parameter positions, will be co-variant (as opposed to bi-variant) // with respect to T. - const related = sourceSig && targetSig && !sourceSig.typePredicate && !targetSig.typePredicate ? + const callbacks = sourceSig && targetSig && !sourceSig.typePredicate && !targetSig.typePredicate && + (getFalsyFlags(sourceType) & TypeFlags.Nullable) === (getFalsyFlags(targetType) & TypeFlags.Nullable); + const related = callbacks ? compareSignaturesRelated(targetSig, sourceSig, /*checkAsCallback*/ true, /*ignoreReturnTypes*/ false, reportErrors, errorReporter, compareTypes) : !checkAsCallback && compareTypes(sourceType, targetType, /*reportErrors*/ false) || compareTypes(targetType, sourceType, reportErrors); if (!related) { From 3cda0eac32e265a0f4e4b0814af8b4724bfa889d Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Mon, 10 Apr 2017 17:14:22 -1000 Subject: [PATCH 18/33] Update tests --- tests/baselines/reference/covariantCallbacks.js | 1 + .../assignmentCompatibility/covariantCallbacks.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/baselines/reference/covariantCallbacks.js b/tests/baselines/reference/covariantCallbacks.js index 497a1ff9916..4678c13bf15 100644 --- a/tests/baselines/reference/covariantCallbacks.js +++ b/tests/baselines/reference/covariantCallbacks.js @@ -72,6 +72,7 @@ function f14(a: AList4, b: BList4) { //// [covariantCallbacks.js] +"use strict"; // Test that callback parameters are related covariantly ; function f1(a, b) { diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts index 462911fb17a..4f3e7ecda0d 100644 --- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts @@ -1,4 +1,5 @@ // @target: es2015 +// @strict: true // Test that callback parameters are related covariantly From 26d5af384c6c26ee3c4aa0f903fd04e6220ffa0c Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 17 Apr 2017 13:15:06 -0700 Subject: [PATCH 19/33] Check for the file before getting line map --- src/compiler/program.ts | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index f2d44adb1f1..3661ca647ef 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -930,20 +930,22 @@ namespace ts { */ function shouldReportDiagnostic(diagnostic: Diagnostic) { const { file, start } = diagnostic; - const lineStarts = getLineStarts(file); - let { line } = computeLineAndCharacterOfPosition(lineStarts, start); - while (line > 0) { - const previousLineText = file.text.slice(lineStarts[line - 1], lineStarts[line]); - const result = ignoreDiagnosticCommentRegEx.exec(previousLineText); - if (!result) { - // non-empty line - return true; + if (file) { + const lineStarts = getLineStarts(file); + let { line } = computeLineAndCharacterOfPosition(lineStarts, start); + while (line > 0) { + const previousLineText = file.text.slice(lineStarts[line - 1], lineStarts[line]); + const result = ignoreDiagnosticCommentRegEx.exec(previousLineText); + if (!result) { + // non-empty line + return true; + } + if (result[3]) { + // @ts-ignore + return false; + } + line--; } - if (result[3]) { - // @ts-ignore - return false; - } - line--; } return true; } From 4546b0dd8e2bae4cefb91e6c24717824e0f71c9e Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 17 Apr 2017 13:15:27 -0700 Subject: [PATCH 20/33] Make sure we have a node for the error in cases of special property assignment --- src/compiler/checker.ts | 2 +- .../checkJsFiles_noErrorLocation.errors.txt | 25 +++++++++++++++++++ .../compiler/checkJsFiles_noErrorLocation.ts | 24 ++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/checkJsFiles_noErrorLocation.errors.txt create mode 100644 tests/cases/compiler/checkJsFiles_noErrorLocation.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index f11112811f5..c7d7da5e678 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -20530,7 +20530,7 @@ namespace ts { errorMessage = Diagnostics.Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_function; } - error(derived.valueDeclaration.name, errorMessage, typeToString(baseType), symbolToString(base), typeToString(type)); + error(derived.valueDeclaration.name || derived.valueDeclaration, errorMessage, typeToString(baseType), symbolToString(base), typeToString(type)); } } } diff --git a/tests/baselines/reference/checkJsFiles_noErrorLocation.errors.txt b/tests/baselines/reference/checkJsFiles_noErrorLocation.errors.txt new file mode 100644 index 00000000000..758b295a49d --- /dev/null +++ b/tests/baselines/reference/checkJsFiles_noErrorLocation.errors.txt @@ -0,0 +1,25 @@ +tests/cases/compiler/a.js(14,5): error TS2424: Class 'A' defines instance member function 'foo', but extended class 'B' defines it as instance member property. + + +==== tests/cases/compiler/a.js (1 errors) ==== + // @ts-check + class A { + constructor() { + + } + foo() { + return 4; + } + } + + class B extends A { + constructor() { + super(); + this.foo = () => 3; + ~~~~~~~~~~~~~~~~~~ +!!! error TS2424: Class 'A' defines instance member function 'foo', but extended class 'B' defines it as instance member property. + } + } + + const i = new B(); + i.foo(); \ No newline at end of file diff --git a/tests/cases/compiler/checkJsFiles_noErrorLocation.ts b/tests/cases/compiler/checkJsFiles_noErrorLocation.ts new file mode 100644 index 00000000000..a0b12c47115 --- /dev/null +++ b/tests/cases/compiler/checkJsFiles_noErrorLocation.ts @@ -0,0 +1,24 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true + +// @fileName: a.js +// @ts-check +class A { + constructor() { + + } + foo() { + return 4; + } +} + +class B extends A { + constructor() { + super(); + this.foo = () => 3; + } +} + +const i = new B(); +i.foo(); \ No newline at end of file From 6fd86538473619837dff923de37faaee360d6742 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 17 Apr 2017 14:04:05 -0700 Subject: [PATCH 21/33] Fix globalPlugins TSServer Flag **Bug** globalPlugins flag not being threaded through IOSession object properly **Fix** Pass these flags to superclass in IOSession --- src/server/server.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/server/server.ts b/src/server/server.ts index 433c7e16ab1..5ba1fce30d9 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -401,7 +401,9 @@ namespace ts.server { byteLength: Buffer.byteLength, hrtime: process.hrtime, logger, - canUseEvents}); + canUseEvents, + globalPlugins: options.globalPlugins, + pluginProbeLocations: options.pluginProbeLocations}); if (telemetryEnabled && typingsInstaller) { typingsInstaller.setTelemetrySender(this); From fbd57974c9424fd7a647c1b493a76b84498484e7 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Mon, 17 Apr 2017 14:15:13 -0700 Subject: [PATCH 22/33] yield in async generator should implicitly unwrap operand --- src/compiler/transformers/esnext.ts | 3 ++- ...ter.asyncGenerators.classMethods.es2015.js | 27 ++++++++++++------- ...mitter.asyncGenerators.classMethods.es5.js | 27 ++++++++++++------- ...cGenerators.functionDeclarations.es2015.js | 21 ++++++++++----- ...syncGenerators.functionDeclarations.es5.js | 21 ++++++++++----- ...ncGenerators.functionExpressions.es2015.js | 21 ++++++++++----- ...asyncGenerators.functionExpressions.es5.js | 21 ++++++++++----- ...cGenerators.objectLiteralMethods.es2015.js | 21 ++++++++++----- ...syncGenerators.objectLiteralMethods.es5.js | 21 ++++++++++----- .../reference/emitter.forAwait.es2015.js | 6 +++-- .../reference/emitter.forAwait.es5.js | 6 +++-- 11 files changed, 130 insertions(+), 65 deletions(-) diff --git a/src/compiler/transformers/esnext.ts b/src/compiler/transformers/esnext.ts index b0e8b527820..4f824f510a5 100644 --- a/src/compiler/transformers/esnext.ts +++ b/src/compiler/transformers/esnext.ts @@ -891,7 +891,8 @@ namespace ts { function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.js b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.js index ba4902102b1..aa7a61e5538 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.js +++ b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.js @@ -68,7 +68,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -88,7 +89,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -109,7 +111,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -135,7 +138,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -156,7 +160,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -182,7 +187,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -203,7 +209,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -224,7 +231,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -247,7 +255,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.js b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.js index 74a65673e5a..dede0ac2a7f 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.js +++ b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.js @@ -95,7 +95,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -148,7 +149,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -207,7 +209,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -271,7 +274,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -340,7 +344,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -421,7 +426,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -480,7 +486,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -533,7 +540,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -599,7 +607,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.js b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.js index 2b0d6db5353..b8d9fb6bb4d 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.js +++ b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.js @@ -37,7 +37,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -55,7 +56,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -74,7 +76,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -98,7 +101,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -117,7 +121,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -141,7 +146,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -160,7 +166,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.js b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.js index 42098455ed1..ea8a94b66d7 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.js +++ b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.js @@ -64,7 +64,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -112,7 +113,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -166,7 +168,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -225,7 +228,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -289,7 +293,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -365,7 +370,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -419,7 +425,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.js b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.js index 90f4b70e9bd..18af4869853 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.js +++ b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.js @@ -37,7 +37,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -55,7 +56,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -74,7 +76,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -98,7 +101,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -117,7 +121,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -141,7 +146,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -160,7 +166,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.js b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.js index a6265063fde..7f57e78700e 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.js +++ b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.js @@ -64,7 +64,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -112,7 +113,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -166,7 +168,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -225,7 +228,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -289,7 +293,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -365,7 +370,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -419,7 +425,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.js b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.js index 817b3904f02..a7d8d132d58 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.js +++ b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.js @@ -51,7 +51,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -71,7 +72,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -92,7 +94,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -118,7 +121,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -139,7 +143,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -165,7 +170,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -186,7 +192,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.js b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.js index a0839d8258d..2913877e9bc 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.js +++ b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.js @@ -78,7 +78,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -128,7 +129,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -184,7 +186,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -245,7 +248,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -311,7 +315,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -389,7 +394,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -445,7 +451,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.forAwait.es2015.js b/tests/baselines/reference/emitter.forAwait.es2015.js index a76c3e0b545..0e63d4af4db 100644 --- a/tests/baselines/reference/emitter.forAwait.es2015.js +++ b/tests/baselines/reference/emitter.forAwait.es2015.js @@ -102,7 +102,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -139,7 +140,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.forAwait.es5.js b/tests/baselines/reference/emitter.forAwait.es5.js index 14b70e933bb..edce30e7e9a 100644 --- a/tests/baselines/reference/emitter.forAwait.es5.js +++ b/tests/baselines/reference/emitter.forAwait.es5.js @@ -231,7 +231,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -319,7 +320,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : r.value[0] === "yield" ? settle(c[2], { value: r.value[1], done: false }) : Promise.resolve(r.value[1]).then(r.value[0] === "delegate" ? delegate : fulfill, reject); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } From 03b12e88afda403e8527358d73d46d2ee960cef6 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 17 Apr 2017 15:19:57 -0700 Subject: [PATCH 23/33] Type query can refer to block-scoped vars before declaration --- src/compiler/checker.ts | 231 +++++++++++----------------------------- src/compiler/core.ts | 22 ++++ 2 files changed, 86 insertions(+), 167 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index f11112811f5..73e9b8a7e5a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -727,7 +727,7 @@ namespace ts { if (declarationFile !== useFile) { if ((modulekind && (declarationFile.externalModuleIndicator || useFile.externalModuleIndicator)) || (!compilerOptions.outFile && !compilerOptions.out)) { - // nodes are in different files and order cannot be determines + // nodes are in different files and order cannot be determined return true; } // declaration is after usage @@ -745,7 +745,7 @@ namespace ts { // still might be illegal if declaration and usage are both binding elements (eg var [a = b, b = b] = [1, 2]) const errorBindingElement = getAncestor(usage, SyntaxKind.BindingElement) as BindingElement; if (errorBindingElement) { - return getAncestorBindingPattern(errorBindingElement) !== getAncestorBindingPattern(declaration) || + return findAncestor(errorBindingElement, isBindingElement) !== findAncestor(declaration, isBindingElement) || declaration.pos < errorBindingElement.pos; } // or it might be illegal if usage happens before parent variable is declared (eg var [a] = a) @@ -763,8 +763,10 @@ namespace ts { // 1. inside a function // 2. inside an instance property initializer, a reference to a non-instance property // 3. inside a static property initializer, a reference to a static method in the same class + // or if usage is in a type context: + // 1. inside a type query (typeof in type position) const container = getEnclosingBlockScopeContainer(declaration); - return isUsedInFunctionOrInstanceProperty(usage, declaration, container); + return isInTypeQuery(usage) || isUsedInFunctionOrInstanceProperty(usage, declaration, container); function isImmediatelyUsedInInitializerOfBlockScopedVariable(declaration: VariableDeclaration, usage: Node): boolean { const container = getEnclosingBlockScopeContainer(declaration); @@ -794,12 +796,7 @@ namespace ts { } function isUsedInFunctionOrInstanceProperty(usage: Node, declaration: Node, container?: Node): boolean { - let current = usage; - while (current) { - if (current === container) { - return false; - } - + return !!findAncestor(usage, current => { if (isFunctionLike(current)) { return true; } @@ -821,20 +818,7 @@ namespace ts { } } } - - current = current.parent; - } - return false; - } - - function getAncestorBindingPattern(node: Node): BindingPattern { - while (node) { - if (isBindingPattern(node)) { - return node; - } - node = node.parent; - } - return undefined; + }, n => n === container); } } @@ -1256,15 +1240,7 @@ namespace ts { * Return false if 'stopAt' node is reached or isFunctionLike(current) === true. */ function isSameScopeDescendentOf(initial: Node, parent: Node, stopAt: Node): boolean { - if (!parent) { - return false; - } - for (let current = initial; current && current !== stopAt && !isFunctionLike(current); current = current.parent) { - if (current === parent) { - return true; - } - } - return false; + return parent && !!findAncestor(initial, n => n === parent, n => n === stopAt || isFunctionLike(n)); } function getAnyImportSyntax(node: Node): AnyImportSyntax { @@ -1273,10 +1249,7 @@ namespace ts { return node; } - while (node && node.kind !== SyntaxKind.ImportDeclaration) { - node = node.parent; - } - return node; + return findAncestor(node, n => n.kind === SyntaxKind.ImportDeclaration) as ImportDeclaration; } } @@ -2137,11 +2110,8 @@ namespace ts { return { accessibility: SymbolAccessibility.Accessible }; function getExternalModuleContainer(declaration: Node) { - for (; declaration; declaration = declaration.parent) { - if (hasExternalModuleSymbol(declaration)) { - return getSymbolOfNode(declaration); - } - } + const node = findAncestor(declaration, hasExternalModuleSymbol); + return node && getSymbolOfNode(node); } } @@ -2885,10 +2855,7 @@ namespace ts { function getTypeAliasForTypeLiteral(type: Type): Symbol { if (type.symbol && type.symbol.flags & SymbolFlags.TypeLiteral) { - let node = type.symbol.declarations[0].parent; - while (node.kind === SyntaxKind.ParenthesizedType) { - node = node.parent; - } + const node = findAncestor(type.symbol.declarations[0].parent, n => n.kind !== SyntaxKind.ParenthesizedType); if (node.kind === SyntaxKind.TypeAliasDeclaration) { return getSymbolOfNode(node); } @@ -3831,8 +3798,7 @@ namespace ts { } function getDeclarationContainer(node: Node): Node { - node = getRootDeclaration(node); - while (node) { + node = findAncestor(getRootDeclaration(node), node => { switch (node.kind) { case SyntaxKind.VariableDeclaration: case SyntaxKind.VariableDeclarationList: @@ -3840,13 +3806,12 @@ namespace ts { case SyntaxKind.NamedImports: case SyntaxKind.NamespaceImport: case SyntaxKind.ImportClause: - node = node.parent; - break; - + return false; default: - return node.parent; + return true; } - } + }); + return node && node.parent; } function getTypeOfPrototypeProperty(prototype: Symbol): Type { @@ -7918,8 +7883,7 @@ namespace ts { // Starting with the parent of the symbol's declaration, check if the mapper maps any of // the type parameters introduced by enclosing declarations. We just pick the first // declaration since multiple declarations will all have the same parent anyway. - let node: Node = symbol.declarations[0]; - while (node) { + return !!findAncestor(symbol.declarations[0], node => { switch (node.kind) { case SyntaxKind.FunctionType: case SyntaxKind.ConstructorType: @@ -7966,13 +7930,9 @@ namespace ts { } } break; - case SyntaxKind.ModuleDeclaration: - case SyntaxKind.SourceFile: - return false; } - node = node.parent; - } - return false; + }, + node => node.kind === SyntaxKind.ModuleDeclaration || node.kind === SyntaxKind.SourceFile); } function isTopLevelTypeAlias(symbol: Symbol) { @@ -10416,19 +10376,10 @@ namespace ts { // TypeScript 1.0 spec (April 2014): 3.6.3 // A type query consists of the keyword typeof followed by an expression. // The expression is restricted to a single identifier or a sequence of identifiers separated by periods - while (node) { - switch (node.kind) { - case SyntaxKind.TypeQuery: - return true; - case SyntaxKind.Identifier: - case SyntaxKind.QualifiedName: - node = node.parent; - continue; - default: - return false; - } - } - Debug.fail("should not get here"); + return !!findAncestor( + node, + n => n.kind === SyntaxKind.TypeQuery, + n => n.kind !== SyntaxKind.TypeQuery && n.kind !== SyntaxKind.Identifier && n.kind !== SyntaxKind.QualifiedName); } // Return the flow cache key for a "dotted name" (i.e. a sequence of identifiers @@ -11651,15 +11602,11 @@ namespace ts { } function getControlFlowContainer(node: Node): Node { - while (true) { - node = node.parent; - if (isFunctionLike(node) && !getImmediatelyInvokedFunctionExpression(node) || - node.kind === SyntaxKind.ModuleBlock || - node.kind === SyntaxKind.SourceFile || - node.kind === SyntaxKind.PropertyDeclaration) { - return node; - } - } + return findAncestor(node.parent, node => + isFunctionLike(node) && !getImmediatelyInvokedFunctionExpression(node) || + node.kind === SyntaxKind.ModuleBlock || + node.kind === SyntaxKind.SourceFile || + node.kind === SyntaxKind.PropertyDeclaration); } // Check if a parameter is assigned anywhere within its declaring function. @@ -11676,15 +11623,7 @@ namespace ts { } function hasParentWithAssignmentsMarked(node: Node) { - while (true) { - node = node.parent; - if (!node) { - return false; - } - if (isFunctionLike(node) && getNodeLinks(node).flags & NodeCheckFlags.AssignmentsMarked) { - return true; - } - } + return !!findAncestor(node.parent, node => isFunctionLike(node) && getNodeLinks(node).flags & NodeCheckFlags.AssignmentsMarked); } function markParameterAssignments(node: Node) { @@ -11856,15 +11795,7 @@ namespace ts { } function isInsideFunction(node: Node, threshold: Node): boolean { - let current = node; - while (current && current !== threshold) { - if (isFunctionLike(current)) { - return true; - } - current = current.parent; - } - - return false; + return !!findAncestor(node, isFunctionLike, n => n === threshold); } function checkNestedBlockScopedBinding(node: Identifier, symbol: Symbol): void { @@ -11916,8 +11847,8 @@ namespace ts { } function isAssignedInBodyOfForStatement(node: Identifier, container: ForStatement): boolean { - let current: Node = node; // skip parenthesized nodes + let current: Node = node; while (current.parent.kind === SyntaxKind.ParenthesizedExpression) { current = current.parent; } @@ -11938,15 +11869,7 @@ namespace ts { // at this point we know that node is the target of assignment // now check that modification happens inside the statement part of the ForStatement - while (current !== container) { - if (current === container.statement) { - return true; - } - else { - current = current.parent; - } - } - return false; + return !!findAncestor(current, n => n === container.statement, n => n === container); } function captureLexicalThis(node: Node, container: Node): void { @@ -12128,12 +12051,7 @@ namespace ts { } function isInConstructorArgumentInitializer(node: Node, constructorDecl: Node): boolean { - for (let n = node; n && n !== constructorDecl; n = n.parent) { - if (n.kind === SyntaxKind.Parameter) { - return true; - } - } - return false; + return !!findAncestor(node, n => n.kind === SyntaxKind.Parameter, n => n === constructorDecl); } function checkSuperExpression(node: Node): Type { @@ -12159,10 +12077,7 @@ namespace ts { // class B { // [super.foo()]() {} // } - let current = node; - while (current && current !== container && current.kind !== SyntaxKind.ComputedPropertyName) { - current = current.parent; - } + const current = findAncestor(node, n => n.kind === SyntaxKind.ComputedPropertyName, n => n === container); if (current && current.kind === SyntaxKind.ComputedPropertyName) { error(node, Diagnostics.super_cannot_be_referenced_in_a_computed_property_name); } @@ -12766,13 +12681,8 @@ namespace ts { } function getContextualMapper(node: Node) { - while (node) { - if (node.contextualMapper) { - return node.contextualMapper; - } - node = node.parent; - } - return identityMapper; + node = findAncestor(node, n => n.contextualMapper); + return node ? node.contextualMapper : identityMapper; } // If the given type is an object or union type, if that type has a single signature, and if @@ -19010,8 +18920,7 @@ namespace ts { // this function will run after checking the source file so 'CaptureThis' is correct for all nodes function checkIfThisIsCapturedInEnclosingScope(node: Node): void { - let current = node; - while (current) { + findAncestor(node, current => { if (getNodeCheckFlags(current) & NodeCheckFlags.CaptureThis) { const isDeclaration = node.kind !== SyntaxKind.Identifier; if (isDeclaration) { @@ -19020,15 +18929,13 @@ namespace ts { else { error(node, Diagnostics.Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference); } - return; + return true; } - current = current.parent; - } + }); } function checkIfNewTargetIsCapturedInEnclosingScope(node: Node): void { - let current = node; - while (current) { + findAncestor(node, current => { if (getNodeCheckFlags(current) & NodeCheckFlags.CaptureNewTarget) { const isDeclaration = node.kind !== SyntaxKind.Identifier; if (isDeclaration) { @@ -19037,10 +18944,9 @@ namespace ts { else { error(node, Diagnostics.Expression_resolves_to_variable_declaration_newTarget_that_compiler_uses_to_capture_new_target_meta_property_reference); } - return; + return true; } - current = current.parent; - } + }); } function checkCollisionWithCapturedSuperVariable(node: Node, name: Identifier) { @@ -19224,19 +19130,17 @@ namespace ts { return; } // - parameter is wrapped in function-like entity - let current = n; - while (current !== node.initializer) { - if (isFunctionLike(current.parent)) { - return; - } - // computed property names/initializers in instance property declaration of class like entities - // are executed in constructor and thus deferred - if (current.parent.kind === SyntaxKind.PropertyDeclaration && - !(hasModifier(current.parent, ModifierFlags.Static)) && - isClassLike(current.parent.parent)) { - return; - } - current = current.parent; + if (findAncestor( + n, + current => + isFunctionLike(current.parent) || + // computed property names/initializers in instance property declaration of class like entities + // are executed in constructor and thus deferred + (current.parent.kind === SyntaxKind.PropertyDeclaration && + !(hasModifier(current.parent, ModifierFlags.Static)) && + isClassLike(current.parent.parent)), + n => n === node.initializer)) { + return; } // fall through to report error } @@ -20034,18 +19938,15 @@ namespace ts { function checkLabeledStatement(node: LabeledStatement) { // Grammar checking if (!checkGrammarStatementInAmbientContext(node)) { - let current = node.parent; - while (current) { - if (isFunctionLike(current)) { - break; - } - if (current.kind === SyntaxKind.LabeledStatement && (current).label.text === node.label.text) { - const sourceFile = getSourceFileOfNode(node); - grammarErrorOnNode(node.label, Diagnostics.Duplicate_label_0, getTextOfNodeFromSourceText(sourceFile.text, node.label)); - break; - } - current = current.parent; - } + findAncestor(node.parent, + current => { + if (current.kind === SyntaxKind.LabeledStatement && (current).label.text === node.label.text) { + const sourceFile = getSourceFileOfNode(node); + grammarErrorOnNode(node.label, Diagnostics.Duplicate_label_0, getTextOfNodeFromSourceText(sourceFile.text, node.label)); + return true; + } + }, + isFunctionLike); } // ensure that label is unique @@ -22298,11 +22199,7 @@ namespace ts { const symbolIsUmdExport = symbolFile !== referenceFile; return symbolIsUmdExport ? undefined : symbolFile; } - for (let n = node.parent; n; n = n.parent) { - if (isModuleOrEnumDeclaration(n) && getSymbolOfNode(n) === parentSymbol) { - return n; - } - } + return findAncestor(node.parent, n => isModuleOrEnumDeclaration(n) && getSymbolOfNode(n) === parentSymbol) as ModuleDeclaration | EnumDeclaration; } } } diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 5296a25d6cf..603c6a5a65e 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -225,6 +225,28 @@ namespace ts { return undefined; } + /** + * Iterates through the parent chain of a node and performs the callback on each parent until the callback + * returns a truthy value, then returns that value. + * If no such value is found, it applies the callback until the parent pointer is undefined or 'done' returns true + * At that point findAncestor returns undefined. + */ + export function findAncestor(node: Node, callback: (element: Node) => T | undefined, done?: (element: Node) => boolean): Node { + if (node) { + while (node) { + if (done && done(node)) { + break; + } + if (callback(node)) { + return node; + } + node = node.parent; + } + } + return undefined; + } + + export function zipWith(arrayA: T[], arrayB: U[], callback: (a: T, b: U, index: number) => void): void { Debug.assert(arrayA.length === arrayB.length); for (let i = 0; i < arrayA.length; i++) { From 42ac23a5857ee0c71503a2d62d0b9bc71e23e720 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 17 Apr 2017 15:20:36 -0700 Subject: [PATCH 24/33] Test: typeof can refer to block-scoped var before declaration --- .../reference/typeofUsedBeforeBlockScoped.js | 20 +++++++++++ .../typeofUsedBeforeBlockScoped.symbols | 33 +++++++++++++++++ .../typeofUsedBeforeBlockScoped.types | 36 +++++++++++++++++++ .../compiler/typeofUsedBeforeBlockScoped.ts | 8 +++++ 4 files changed, 97 insertions(+) create mode 100644 tests/baselines/reference/typeofUsedBeforeBlockScoped.js create mode 100644 tests/baselines/reference/typeofUsedBeforeBlockScoped.symbols create mode 100644 tests/baselines/reference/typeofUsedBeforeBlockScoped.types create mode 100644 tests/cases/compiler/typeofUsedBeforeBlockScoped.ts diff --git a/tests/baselines/reference/typeofUsedBeforeBlockScoped.js b/tests/baselines/reference/typeofUsedBeforeBlockScoped.js new file mode 100644 index 00000000000..d897158f145 --- /dev/null +++ b/tests/baselines/reference/typeofUsedBeforeBlockScoped.js @@ -0,0 +1,20 @@ +//// [typeofUsedBeforeBlockScoped.ts] +// TODO: Change name of file to typeofUsedBeforeBlockScoped.ts +type T = typeof C & typeof C.s & typeof o & typeof o.n; +class C { + static s = 2; +} +type W = typeof o.n; +let o2: typeof o; +let o = { n: 12 }; + + +//// [typeofUsedBeforeBlockScoped.js] +var C = (function () { + function C() { + } + return C; +}()); +C.s = 2; +var o2; +var o = { n: 12 }; diff --git a/tests/baselines/reference/typeofUsedBeforeBlockScoped.symbols b/tests/baselines/reference/typeofUsedBeforeBlockScoped.symbols new file mode 100644 index 00000000000..dc2e26bfee0 --- /dev/null +++ b/tests/baselines/reference/typeofUsedBeforeBlockScoped.symbols @@ -0,0 +1,33 @@ +=== tests/cases/compiler/typeofUsedBeforeBlockScoped.ts === +// TODO: Change name of file to typeofUsedBeforeBlockScoped.ts +type T = typeof C & typeof C.s & typeof o & typeof o.n; +>T : Symbol(T, Decl(typeofUsedBeforeBlockScoped.ts, 0, 0)) +>C : Symbol(C, Decl(typeofUsedBeforeBlockScoped.ts, 1, 55)) +>C.s : Symbol(C.s, Decl(typeofUsedBeforeBlockScoped.ts, 2, 9)) +>C : Symbol(C, Decl(typeofUsedBeforeBlockScoped.ts, 1, 55)) +>s : Symbol(C.s, Decl(typeofUsedBeforeBlockScoped.ts, 2, 9)) +>o : Symbol(o, Decl(typeofUsedBeforeBlockScoped.ts, 7, 3)) +>o.n : Symbol(n, Decl(typeofUsedBeforeBlockScoped.ts, 7, 9)) +>o : Symbol(o, Decl(typeofUsedBeforeBlockScoped.ts, 7, 3)) +>n : Symbol(n, Decl(typeofUsedBeforeBlockScoped.ts, 7, 9)) + +class C { +>C : Symbol(C, Decl(typeofUsedBeforeBlockScoped.ts, 1, 55)) + + static s = 2; +>s : Symbol(C.s, Decl(typeofUsedBeforeBlockScoped.ts, 2, 9)) +} +type W = typeof o.n; +>W : Symbol(W, Decl(typeofUsedBeforeBlockScoped.ts, 4, 1)) +>o.n : Symbol(n, Decl(typeofUsedBeforeBlockScoped.ts, 7, 9)) +>o : Symbol(o, Decl(typeofUsedBeforeBlockScoped.ts, 7, 3)) +>n : Symbol(n, Decl(typeofUsedBeforeBlockScoped.ts, 7, 9)) + +let o2: typeof o; +>o2 : Symbol(o2, Decl(typeofUsedBeforeBlockScoped.ts, 6, 3)) +>o : Symbol(o, Decl(typeofUsedBeforeBlockScoped.ts, 7, 3)) + +let o = { n: 12 }; +>o : Symbol(o, Decl(typeofUsedBeforeBlockScoped.ts, 7, 3)) +>n : Symbol(n, Decl(typeofUsedBeforeBlockScoped.ts, 7, 9)) + diff --git a/tests/baselines/reference/typeofUsedBeforeBlockScoped.types b/tests/baselines/reference/typeofUsedBeforeBlockScoped.types new file mode 100644 index 00000000000..87cff61425c --- /dev/null +++ b/tests/baselines/reference/typeofUsedBeforeBlockScoped.types @@ -0,0 +1,36 @@ +=== tests/cases/compiler/typeofUsedBeforeBlockScoped.ts === +// TODO: Change name of file to typeofUsedBeforeBlockScoped.ts +type T = typeof C & typeof C.s & typeof o & typeof o.n; +>T : T +>C : typeof C +>C.s : number +>C : typeof C +>s : number +>o : { n: number; } +>o.n : number +>o : { n: number; } +>n : number + +class C { +>C : C + + static s = 2; +>s : number +>2 : 2 +} +type W = typeof o.n; +>W : number +>o.n : number +>o : { n: number; } +>n : number + +let o2: typeof o; +>o2 : { n: number; } +>o : { n: number; } + +let o = { n: 12 }; +>o : { n: number; } +>{ n: 12 } : { n: number; } +>n : number +>12 : 12 + diff --git a/tests/cases/compiler/typeofUsedBeforeBlockScoped.ts b/tests/cases/compiler/typeofUsedBeforeBlockScoped.ts new file mode 100644 index 00000000000..6ba887d195a --- /dev/null +++ b/tests/cases/compiler/typeofUsedBeforeBlockScoped.ts @@ -0,0 +1,8 @@ +// TODO: Change name of file to typeofUsedBeforeBlockScoped.ts +type T = typeof C & typeof C.s & typeof o & typeof o.n; +class C { + static s = 2; +} +type W = typeof o.n; +let o2: typeof o; +let o = { n: 12 }; From aaf861af96a6222883853c2942e5ec72549dc155 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 17 Apr 2017 15:25:36 -0700 Subject: [PATCH 25/33] Remove TODO from test now that it's done --- .../reference/typeofUsedBeforeBlockScoped.js | 1 - .../typeofUsedBeforeBlockScoped.symbols | 37 +++++++++---------- .../typeofUsedBeforeBlockScoped.types | 1 - .../compiler/typeofUsedBeforeBlockScoped.ts | 1 - 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/tests/baselines/reference/typeofUsedBeforeBlockScoped.js b/tests/baselines/reference/typeofUsedBeforeBlockScoped.js index d897158f145..eebf4beae67 100644 --- a/tests/baselines/reference/typeofUsedBeforeBlockScoped.js +++ b/tests/baselines/reference/typeofUsedBeforeBlockScoped.js @@ -1,5 +1,4 @@ //// [typeofUsedBeforeBlockScoped.ts] -// TODO: Change name of file to typeofUsedBeforeBlockScoped.ts type T = typeof C & typeof C.s & typeof o & typeof o.n; class C { static s = 2; diff --git a/tests/baselines/reference/typeofUsedBeforeBlockScoped.symbols b/tests/baselines/reference/typeofUsedBeforeBlockScoped.symbols index dc2e26bfee0..5cf09a4d4d5 100644 --- a/tests/baselines/reference/typeofUsedBeforeBlockScoped.symbols +++ b/tests/baselines/reference/typeofUsedBeforeBlockScoped.symbols @@ -1,33 +1,32 @@ === tests/cases/compiler/typeofUsedBeforeBlockScoped.ts === -// TODO: Change name of file to typeofUsedBeforeBlockScoped.ts type T = typeof C & typeof C.s & typeof o & typeof o.n; >T : Symbol(T, Decl(typeofUsedBeforeBlockScoped.ts, 0, 0)) ->C : Symbol(C, Decl(typeofUsedBeforeBlockScoped.ts, 1, 55)) ->C.s : Symbol(C.s, Decl(typeofUsedBeforeBlockScoped.ts, 2, 9)) ->C : Symbol(C, Decl(typeofUsedBeforeBlockScoped.ts, 1, 55)) ->s : Symbol(C.s, Decl(typeofUsedBeforeBlockScoped.ts, 2, 9)) ->o : Symbol(o, Decl(typeofUsedBeforeBlockScoped.ts, 7, 3)) ->o.n : Symbol(n, Decl(typeofUsedBeforeBlockScoped.ts, 7, 9)) ->o : Symbol(o, Decl(typeofUsedBeforeBlockScoped.ts, 7, 3)) ->n : Symbol(n, Decl(typeofUsedBeforeBlockScoped.ts, 7, 9)) +>C : Symbol(C, Decl(typeofUsedBeforeBlockScoped.ts, 0, 55)) +>C.s : Symbol(C.s, Decl(typeofUsedBeforeBlockScoped.ts, 1, 9)) +>C : Symbol(C, Decl(typeofUsedBeforeBlockScoped.ts, 0, 55)) +>s : Symbol(C.s, Decl(typeofUsedBeforeBlockScoped.ts, 1, 9)) +>o : Symbol(o, Decl(typeofUsedBeforeBlockScoped.ts, 6, 3)) +>o.n : Symbol(n, Decl(typeofUsedBeforeBlockScoped.ts, 6, 9)) +>o : Symbol(o, Decl(typeofUsedBeforeBlockScoped.ts, 6, 3)) +>n : Symbol(n, Decl(typeofUsedBeforeBlockScoped.ts, 6, 9)) class C { ->C : Symbol(C, Decl(typeofUsedBeforeBlockScoped.ts, 1, 55)) +>C : Symbol(C, Decl(typeofUsedBeforeBlockScoped.ts, 0, 55)) static s = 2; ->s : Symbol(C.s, Decl(typeofUsedBeforeBlockScoped.ts, 2, 9)) +>s : Symbol(C.s, Decl(typeofUsedBeforeBlockScoped.ts, 1, 9)) } type W = typeof o.n; ->W : Symbol(W, Decl(typeofUsedBeforeBlockScoped.ts, 4, 1)) ->o.n : Symbol(n, Decl(typeofUsedBeforeBlockScoped.ts, 7, 9)) ->o : Symbol(o, Decl(typeofUsedBeforeBlockScoped.ts, 7, 3)) ->n : Symbol(n, Decl(typeofUsedBeforeBlockScoped.ts, 7, 9)) +>W : Symbol(W, Decl(typeofUsedBeforeBlockScoped.ts, 3, 1)) +>o.n : Symbol(n, Decl(typeofUsedBeforeBlockScoped.ts, 6, 9)) +>o : Symbol(o, Decl(typeofUsedBeforeBlockScoped.ts, 6, 3)) +>n : Symbol(n, Decl(typeofUsedBeforeBlockScoped.ts, 6, 9)) let o2: typeof o; ->o2 : Symbol(o2, Decl(typeofUsedBeforeBlockScoped.ts, 6, 3)) ->o : Symbol(o, Decl(typeofUsedBeforeBlockScoped.ts, 7, 3)) +>o2 : Symbol(o2, Decl(typeofUsedBeforeBlockScoped.ts, 5, 3)) +>o : Symbol(o, Decl(typeofUsedBeforeBlockScoped.ts, 6, 3)) let o = { n: 12 }; ->o : Symbol(o, Decl(typeofUsedBeforeBlockScoped.ts, 7, 3)) ->n : Symbol(n, Decl(typeofUsedBeforeBlockScoped.ts, 7, 9)) +>o : Symbol(o, Decl(typeofUsedBeforeBlockScoped.ts, 6, 3)) +>n : Symbol(n, Decl(typeofUsedBeforeBlockScoped.ts, 6, 9)) diff --git a/tests/baselines/reference/typeofUsedBeforeBlockScoped.types b/tests/baselines/reference/typeofUsedBeforeBlockScoped.types index 87cff61425c..ec8e30bb135 100644 --- a/tests/baselines/reference/typeofUsedBeforeBlockScoped.types +++ b/tests/baselines/reference/typeofUsedBeforeBlockScoped.types @@ -1,5 +1,4 @@ === tests/cases/compiler/typeofUsedBeforeBlockScoped.ts === -// TODO: Change name of file to typeofUsedBeforeBlockScoped.ts type T = typeof C & typeof C.s & typeof o & typeof o.n; >T : T >C : typeof C diff --git a/tests/cases/compiler/typeofUsedBeforeBlockScoped.ts b/tests/cases/compiler/typeofUsedBeforeBlockScoped.ts index 6ba887d195a..3ab1534875b 100644 --- a/tests/cases/compiler/typeofUsedBeforeBlockScoped.ts +++ b/tests/cases/compiler/typeofUsedBeforeBlockScoped.ts @@ -1,4 +1,3 @@ -// TODO: Change name of file to typeofUsedBeforeBlockScoped.ts type T = typeof C & typeof C.s & typeof o & typeof o.n; class C { static s = 2; From b7c416cdeb093a6dfbc00ed807d839d849e6c9de Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 17 Apr 2017 16:26:49 -0700 Subject: [PATCH 26/33] Check if container has locals before looking up properties --- src/compiler/binder.ts | 2 +- ...opertyInitalizationInObjectLiteral.symbols | 15 ++++++++++++ ...PropertyInitalizationInObjectLiteral.types | 24 +++++++++++++++++++ ...assPropertyInitalizationInObjectLiteral.ts | 10 ++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/jsFileClassPropertyInitalizationInObjectLiteral.symbols create mode 100644 tests/baselines/reference/jsFileClassPropertyInitalizationInObjectLiteral.types create mode 100644 tests/cases/compiler/jsFileClassPropertyInitalizationInObjectLiteral.ts diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index b2ad2151bb6..ec29edfe217 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -2401,7 +2401,7 @@ namespace ts { } function lookupSymbolForName(name: string) { - return (container.symbol && container.symbol.exports && container.symbol.exports.get(name)) || container.locals.get(name); + return (container.symbol && container.symbol.exports && container.symbol.exports.get(name)) || (container.locals && container.locals.get(name)); } function bindPropertyAssignment(functionName: string, propertyAccessExpression: PropertyAccessExpression, isPrototypeProperty: boolean) { diff --git a/tests/baselines/reference/jsFileClassPropertyInitalizationInObjectLiteral.symbols b/tests/baselines/reference/jsFileClassPropertyInitalizationInObjectLiteral.symbols new file mode 100644 index 00000000000..6cb2e235ce2 --- /dev/null +++ b/tests/baselines/reference/jsFileClassPropertyInitalizationInObjectLiteral.symbols @@ -0,0 +1,15 @@ +=== tests/cases/compiler/foo.js === +module.exports = function () { +>module : Symbol(export=, Decl(foo.js, 0, 0)) +>exports : Symbol(export=, Decl(foo.js, 0, 0)) + + class A { } +>A : Symbol(A, Decl(foo.js, 0, 30)) + + return { + c: A.b = 1, +>c : Symbol(c, Decl(foo.js, 2, 10)) +>A : Symbol(A, Decl(foo.js, 0, 30)) + } +}; + diff --git a/tests/baselines/reference/jsFileClassPropertyInitalizationInObjectLiteral.types b/tests/baselines/reference/jsFileClassPropertyInitalizationInObjectLiteral.types new file mode 100644 index 00000000000..fc1fad7f861 --- /dev/null +++ b/tests/baselines/reference/jsFileClassPropertyInitalizationInObjectLiteral.types @@ -0,0 +1,24 @@ +=== tests/cases/compiler/foo.js === +module.exports = function () { +>module.exports = function () { class A { } return { c: A.b = 1, }} : () => { [x: string]: any; c: number; } +>module.exports : any +>module : any +>exports : any +>function () { class A { } return { c: A.b = 1, }} : () => { [x: string]: any; c: number; } + + class A { } +>A : A + + return { +>{ c: A.b = 1, } : { [x: string]: any; c: number; } + + c: A.b = 1, +>c : number +>A.b = 1 : 1 +>A.b : any +>A : typeof A +>b : any +>1 : 1 + } +}; + diff --git a/tests/cases/compiler/jsFileClassPropertyInitalizationInObjectLiteral.ts b/tests/cases/compiler/jsFileClassPropertyInitalizationInObjectLiteral.ts new file mode 100644 index 00000000000..d8908740fd4 --- /dev/null +++ b/tests/cases/compiler/jsFileClassPropertyInitalizationInObjectLiteral.ts @@ -0,0 +1,10 @@ +// @allowJs: true +// @noEmit: true + +// @filename: foo.js +module.exports = function () { + class A { } + return { + c: A.b = 1, + } +}; From 5dca7ccb1df6f38896c3d6858c36c84cd70f0917 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Mon, 17 Apr 2017 16:37:48 -0700 Subject: [PATCH 27/33] Fix yield* as well --- src/compiler/checker.ts | 52 ++-- src/compiler/diagnosticMessages.json | 14 +- .../asyncFunctionDeclaration15_es5.errors.txt | 8 +- .../asyncFunctionDeclaration15_es6.errors.txt | 8 +- .../types.asyncGenerators.esnext.1.symbols | 217 ++++++++++--- .../types.asyncGenerators.esnext.1.types | 288 +++++++++++++++--- .../types.asyncGenerators.esnext.2.errors.txt | 52 ++-- .../types.asyncGenerators.esnext.1.ts | 98 ++++-- .../types.asyncGenerators.esnext.2.ts | 3 + 9 files changed, 582 insertions(+), 158 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index f11112811f5..d11a2b268b5 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15889,7 +15889,7 @@ namespace ts { // Promise/A+ compatible implementation will always assimilate any foreign promise, so the // return type of the body should be unwrapped to its awaited type, which we will wrap in // the native Promise type later in this function. - type = checkAwaitedType(type, /*errorNode*/ func); + type = checkAwaitedType(type, /*errorNode*/ func, Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); } } else { @@ -15963,6 +15963,11 @@ namespace ts { // A yield* expression effectively yields everything that its operand yields type = checkIteratedTypeOrElementType(type, yieldExpression.expression, /*allowStringInput*/ false, (functionFlags & FunctionFlags.Async) !== 0); } + if (functionFlags & FunctionFlags.Async) { + type = checkAwaitedType(type, expr, yieldExpression.asteriskToken + ? Diagnostics.Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member + : Diagnostics.Type_of_yield_operand_in_an_async_generator_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); + } if (!contains(aggregatedTypes, type)) { aggregatedTypes.push(type); } @@ -16012,7 +16017,7 @@ namespace ts { // Promise/A+ compatible implementation will always assimilate any foreign promise, so the // return type of the body should be unwrapped to its awaited type, which should be wrapped in // the native Promise type by the caller. - type = checkAwaitedType(type, func); + type = checkAwaitedType(type, func, Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); } if (type.flags & TypeFlags.Never) { hasReturnOfTypeNever = true; @@ -16189,7 +16194,7 @@ namespace ts { const exprType = checkExpression(node.body); if (returnOrPromisedType) { if ((functionFlags & FunctionFlags.AsyncOrAsyncGenerator) === FunctionFlags.Async) { // Async function - const awaitedType = checkAwaitedType(exprType, node.body); + const awaitedType = checkAwaitedType(exprType, node.body, Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); checkTypeAssignableTo(awaitedType, returnOrPromisedType, node.body); } else { // Normal function @@ -16305,7 +16310,7 @@ namespace ts { } const operandType = checkExpression(node.expression); - return checkAwaitedType(operandType, node); + return checkAwaitedType(operandType, node, Diagnostics.Type_of_await_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); } function checkPrefixUnaryExpression(node: PrefixUnaryExpression): Type { @@ -16952,10 +16957,22 @@ namespace ts { if (func.type) { const signatureElementType = getIteratedTypeOfGenerator(getTypeFromTypeNode(func.type), (functionFlags & FunctionFlags.Async) !== 0) || anyType; if (nodeIsYieldStar) { - checkTypeAssignableTo(expressionElementType, signatureElementType, node.expression, /*headMessage*/ undefined); + checkTypeAssignableTo( + functionFlags & FunctionFlags.Async + ? getAwaitedType(expressionElementType, node.expression, Diagnostics.Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member) + : expressionElementType, + signatureElementType, + node.expression, + /*headMessage*/ undefined); } else { - checkTypeAssignableTo(expressionType, signatureElementType, node.expression, /*headMessage*/ undefined); + checkTypeAssignableTo( + functionFlags & FunctionFlags.Async + ? getAwaitedType(expressionType, node.expression, Diagnostics.Type_of_yield_operand_in_an_async_generator_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member) + : expressionType, + signatureElementType, + node.expression, + /*headMessage*/ undefined); } } } @@ -18290,9 +18307,9 @@ namespace ts { } } - function getAwaitedTypeOfPromise(type: Type, errorNode?: Node): Type | undefined { + function getAwaitedTypeOfPromise(type: Type, errorNode?: Node, diagnosticMessage?: DiagnosticMessage): Type | undefined { const promisedType = getPromisedTypeOfPromise(type, errorNode); - return promisedType && getAwaitedType(promisedType, errorNode); + return promisedType && getAwaitedType(promisedType, errorNode, diagnosticMessage); } /** @@ -18360,11 +18377,11 @@ namespace ts { * Promise-like type; otherwise, it is the type of the expression. This is used to reflect * The runtime behavior of the `await` keyword. */ - function checkAwaitedType(type: Type, errorNode: Node): Type { - return getAwaitedType(type, errorNode) || unknownType; + function checkAwaitedType(type: Type, errorNode: Node, diagnosticMessage: DiagnosticMessage): Type { + return getAwaitedType(type, errorNode, diagnosticMessage) || unknownType; } - function getAwaitedType(type: Type, errorNode?: Node): Type | undefined { + function getAwaitedType(type: Type, errorNode?: Node, diagnosticMessage?: DiagnosticMessage): Type | undefined { const typeAsAwaitable = type; if (typeAsAwaitable.awaitedTypeOfType) { return typeAsAwaitable.awaitedTypeOfType; @@ -18377,7 +18394,7 @@ namespace ts { if (type.flags & TypeFlags.Union) { let types: Type[]; for (const constituentType of (type).types) { - types = append(types, getAwaitedType(constituentType, errorNode)); + types = append(types, getAwaitedType(constituentType, errorNode, diagnosticMessage)); } if (!types) { @@ -18431,7 +18448,7 @@ namespace ts { // Keep track of the type we're about to unwrap to avoid bad recursive promise types. // See the comments above for more information. awaitedTypeStack.push(type.id); - const awaitedType = getAwaitedType(promisedType, errorNode); + const awaitedType = getAwaitedType(promisedType, errorNode, diagnosticMessage); awaitedTypeStack.pop(); if (!awaitedType) { @@ -18459,7 +18476,8 @@ namespace ts { const thenFunction = getTypeOfPropertyOfType(type, "then"); if (thenFunction && getSignaturesOfType(thenFunction, SignatureKind.Call).length > 0) { if (errorNode) { - error(errorNode, Diagnostics.Type_used_as_operand_to_await_or_the_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); + Debug.assert(!!diagnosticMessage); + error(errorNode, diagnosticMessage); } return undefined; } @@ -18570,7 +18588,7 @@ namespace ts { } // Get and return the awaited type of the return type. - return checkAwaitedType(returnType, node); + return checkAwaitedType(returnType, node, Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); } /** Check a decorator */ @@ -19854,7 +19872,7 @@ namespace ts { // For an async iterator, we must get the awaited type of the return type. if (isAsyncIterator) { - nextResult = getAwaitedTypeOfPromise(nextResult, errorNode); + nextResult = getAwaitedTypeOfPromise(nextResult, errorNode, Diagnostics.The_type_returned_by_the_next_method_of_an_async_iterator_must_be_a_promise_for_a_type_with_a_value_property); if (isTypeAny(nextResult)) { return undefined; } @@ -19945,7 +19963,7 @@ namespace ts { else if (func.type || isGetAccessorWithAnnotatedSetAccessor(func)) { if (functionFlags & FunctionFlags.Async) { // Async function const promisedType = getPromisedTypeOfPromise(returnType); - const awaitedType = checkAwaitedType(exprType, node); + const awaitedType = checkAwaitedType(exprType, node, Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); if (promisedType) { // If the function has a return type, but promisedType is // undefined, an error will be reported in checkAsyncFunctionReturnType diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index eb3e476a6f2..a1200b6a072 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -175,7 +175,7 @@ "category": "Error", "code": 1057 }, - "Type used as operand to 'await' or the return type of an async function must either be a valid promise or must not contain a callable 'then' member.": { + "The return type of an async function must either be a valid promise or must not contain a callable 'then' member.": { "category": "Error", "code": 1058 }, @@ -867,6 +867,18 @@ "category": "Error", "code": 1319 }, + "Type of 'await' operand must either be a valid promise or must not contain a callable 'then' member.": { + "category": "Error", + "code": 1320 + }, + "Type of 'yield' operand in an async generator must either be a valid promise or must not contain a callable 'then' member.": { + "category": "Error", + "code": 1321 + }, + "Type of iterated elements of a 'yield*' operand must either be a valid promise or must not contain a callable 'then' member.": { + "category": "Error", + "code": 1322 + }, "Duplicate identifier '{0}'.": { "category": "Error", "code": 2300 diff --git a/tests/baselines/reference/asyncFunctionDeclaration15_es5.errors.txt b/tests/baselines/reference/asyncFunctionDeclaration15_es5.errors.txt index f8029687fb1..42940c0e412 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration15_es5.errors.txt +++ b/tests/baselines/reference/asyncFunctionDeclaration15_es5.errors.txt @@ -8,8 +8,8 @@ tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration1 Types of property 'then' are incompatible. Type '() => void' is not assignable to type '(onfulfilled?: (value: any) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike) => PromiseLike'. Type 'void' is not assignable to type 'PromiseLike'. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration15_es5.ts(17,16): error TS1058: Type used as operand to 'await' or the return type of an async function must either be a valid promise or must not contain a callable 'then' member. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration15_es5.ts(23,25): error TS1058: Type used as operand to 'await' or the return type of an async function must either be a valid promise or must not contain a callable 'then' member. +tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration15_es5.ts(17,16): error TS1058: The return type of an async function must either be a valid promise or must not contain a callable 'then' member. +tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration15_es5.ts(23,25): error TS1320: Type of 'await' operand must either be a valid promise or must not contain a callable 'then' member. ==== tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration15_es5.ts (8 errors) ==== @@ -47,7 +47,7 @@ tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration1 async function fn12() { return obj; } // valid: Promise<{ then: string; }> async function fn13() { return thenable; } // error ~~~~ -!!! error TS1058: Type used as operand to 'await' or the return type of an async function must either be a valid promise or must not contain a callable 'then' member. +!!! error TS1058: The return type of an async function must either be a valid promise or must not contain a callable 'then' member. async function fn14() { await 1; } // valid: Promise async function fn15() { await null; } // valid: Promise async function fn16() { await undefined; } // valid: Promise @@ -55,5 +55,5 @@ tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration1 async function fn18() { await obj; } // valid: Promise async function fn19() { await thenable; } // error ~~~~~~~~~~~~~~ -!!! error TS1058: Type used as operand to 'await' or the return type of an async function must either be a valid promise or must not contain a callable 'then' member. +!!! error TS1320: Type of 'await' operand must either be a valid promise or must not contain a callable 'then' member. \ No newline at end of file diff --git a/tests/baselines/reference/asyncFunctionDeclaration15_es6.errors.txt b/tests/baselines/reference/asyncFunctionDeclaration15_es6.errors.txt index 60f57f3dfbf..d7f27281d6d 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration15_es6.errors.txt +++ b/tests/baselines/reference/asyncFunctionDeclaration15_es6.errors.txt @@ -3,8 +3,8 @@ tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration1 tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts(8,23): error TS1064: The return type of an async function or method must be the global Promise type. tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts(9,23): error TS1064: The return type of an async function or method must be the global Promise type. tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts(10,23): error TS1064: The return type of an async function or method must be the global Promise type. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts(17,16): error TS1058: Type used as operand to 'await' or the return type of an async function must either be a valid promise or must not contain a callable 'then' member. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts(23,25): error TS1058: Type used as operand to 'await' or the return type of an async function must either be a valid promise or must not contain a callable 'then' member. +tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts(17,16): error TS1058: The return type of an async function must either be a valid promise or must not contain a callable 'then' member. +tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts(23,25): error TS1320: Type of 'await' operand must either be a valid promise or must not contain a callable 'then' member. ==== tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration15_es6.ts (7 errors) ==== @@ -36,7 +36,7 @@ tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration1 async function fn12() { return obj; } // valid: Promise<{ then: string; }> async function fn13() { return thenable; } // error ~~~~ -!!! error TS1058: Type used as operand to 'await' or the return type of an async function must either be a valid promise or must not contain a callable 'then' member. +!!! error TS1058: The return type of an async function must either be a valid promise or must not contain a callable 'then' member. async function fn14() { await 1; } // valid: Promise async function fn15() { await null; } // valid: Promise async function fn16() { await undefined; } // valid: Promise @@ -44,5 +44,5 @@ tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration1 async function fn18() { await obj; } // valid: Promise async function fn19() { await thenable; } // error ~~~~~~~~~~~~~~ -!!! error TS1058: Type used as operand to 'await' or the return type of an async function must either be a valid promise or must not contain a callable 'then' member. +!!! error TS1320: Type of 'await' operand must either be a valid promise or must not contain a callable 'then' member. \ No newline at end of file diff --git a/tests/baselines/reference/types.asyncGenerators.esnext.1.symbols b/tests/baselines/reference/types.asyncGenerators.esnext.1.symbols index 0514b4e1424..1db808e4aed 100644 --- a/tests/baselines/reference/types.asyncGenerators.esnext.1.symbols +++ b/tests/baselines/reference/types.asyncGenerators.esnext.1.symbols @@ -15,137 +15,276 @@ async function * inferReturnType3() { async function * inferReturnType4() { >inferReturnType4 : Symbol(inferReturnType4, Decl(types.asyncGenerators.esnext.1.ts, 7, 1)) - yield* [1, 2]; + yield Promise.resolve(1); +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) } async function * inferReturnType5() { >inferReturnType5 : Symbol(inferReturnType5, Decl(types.asyncGenerators.esnext.1.ts, 10, 1)) + yield 1; + yield Promise.resolve(2); +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +} +async function * inferReturnType6() { +>inferReturnType6 : Symbol(inferReturnType6, Decl(types.asyncGenerators.esnext.1.ts, 14, 1)) + + yield* [1, 2]; +} +async function * inferReturnType7() { +>inferReturnType7 : Symbol(inferReturnType7, Decl(types.asyncGenerators.esnext.1.ts, 17, 1)) + + yield* [Promise.resolve(1)]; +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +} +async function * inferReturnType8() { +>inferReturnType8 : Symbol(inferReturnType8, Decl(types.asyncGenerators.esnext.1.ts, 20, 1)) + yield* (async function * () { yield 1; })(); } const assignability1: () => AsyncIterableIterator = async function * () { ->assignability1 : Symbol(assignability1, Decl(types.asyncGenerators.esnext.1.ts, 14, 5)) +>assignability1 : Symbol(assignability1, Decl(types.asyncGenerators.esnext.1.ts, 24, 5)) >AsyncIterableIterator : Symbol(AsyncIterableIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) yield 1; }; const assignability2: () => AsyncIterableIterator = async function * () { ->assignability2 : Symbol(assignability2, Decl(types.asyncGenerators.esnext.1.ts, 17, 5)) +>assignability2 : Symbol(assignability2, Decl(types.asyncGenerators.esnext.1.ts, 27, 5)) >AsyncIterableIterator : Symbol(AsyncIterableIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) - yield* [1, 2]; + yield Promise.resolve(1); +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) + }; const assignability3: () => AsyncIterableIterator = async function * () { ->assignability3 : Symbol(assignability3, Decl(types.asyncGenerators.esnext.1.ts, 20, 5)) +>assignability3 : Symbol(assignability3, Decl(types.asyncGenerators.esnext.1.ts, 30, 5)) +>AsyncIterableIterator : Symbol(AsyncIterableIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) + + yield* [1, 2]; +}; +const assignability4: () => AsyncIterableIterator = async function * () { +>assignability4 : Symbol(assignability4, Decl(types.asyncGenerators.esnext.1.ts, 33, 5)) +>AsyncIterableIterator : Symbol(AsyncIterableIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) + + yield* [Promise.resolve(1)]; +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) + +}; +const assignability5: () => AsyncIterableIterator = async function * () { +>assignability5 : Symbol(assignability5, Decl(types.asyncGenerators.esnext.1.ts, 36, 5)) >AsyncIterableIterator : Symbol(AsyncIterableIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) yield* (async function * () { yield 1; })(); }; -const assignability4: () => AsyncIterable = async function * () { ->assignability4 : Symbol(assignability4, Decl(types.asyncGenerators.esnext.1.ts, 23, 5)) +const assignability6: () => AsyncIterable = async function * () { +>assignability6 : Symbol(assignability6, Decl(types.asyncGenerators.esnext.1.ts, 39, 5)) >AsyncIterable : Symbol(AsyncIterable, Decl(lib.esnext.asynciterable.d.ts, --, --)) yield 1; }; -const assignability5: () => AsyncIterable = async function * () { ->assignability5 : Symbol(assignability5, Decl(types.asyncGenerators.esnext.1.ts, 26, 5)) +const assignability7: () => AsyncIterable = async function * () { +>assignability7 : Symbol(assignability7, Decl(types.asyncGenerators.esnext.1.ts, 42, 5)) +>AsyncIterable : Symbol(AsyncIterable, Decl(lib.esnext.asynciterable.d.ts, --, --)) + + yield Promise.resolve(1); +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) + +}; +const assignability8: () => AsyncIterable = async function * () { +>assignability8 : Symbol(assignability8, Decl(types.asyncGenerators.esnext.1.ts, 45, 5)) >AsyncIterable : Symbol(AsyncIterable, Decl(lib.esnext.asynciterable.d.ts, --, --)) yield* [1, 2]; }; -const assignability6: () => AsyncIterable = async function * () { ->assignability6 : Symbol(assignability6, Decl(types.asyncGenerators.esnext.1.ts, 29, 5)) +const assignability9: () => AsyncIterable = async function * () { +>assignability9 : Symbol(assignability9, Decl(types.asyncGenerators.esnext.1.ts, 48, 5)) +>AsyncIterable : Symbol(AsyncIterable, Decl(lib.esnext.asynciterable.d.ts, --, --)) + + yield* [Promise.resolve(1)]; +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) + +}; +const assignability10: () => AsyncIterable = async function * () { +>assignability10 : Symbol(assignability10, Decl(types.asyncGenerators.esnext.1.ts, 51, 5)) >AsyncIterable : Symbol(AsyncIterable, Decl(lib.esnext.asynciterable.d.ts, --, --)) yield* (async function * () { yield 1; })(); }; -const assignability7: () => AsyncIterator = async function * () { ->assignability7 : Symbol(assignability7, Decl(types.asyncGenerators.esnext.1.ts, 32, 5)) +const assignability11: () => AsyncIterator = async function * () { +>assignability11 : Symbol(assignability11, Decl(types.asyncGenerators.esnext.1.ts, 54, 5)) >AsyncIterator : Symbol(AsyncIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) yield 1; }; -const assignability8: () => AsyncIterator = async function * () { ->assignability8 : Symbol(assignability8, Decl(types.asyncGenerators.esnext.1.ts, 35, 5)) +const assignability12: () => AsyncIterator = async function * () { +>assignability12 : Symbol(assignability12, Decl(types.asyncGenerators.esnext.1.ts, 57, 5)) +>AsyncIterator : Symbol(AsyncIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) + + yield Promise.resolve(1); +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) + +}; +const assignability13: () => AsyncIterator = async function * () { +>assignability13 : Symbol(assignability13, Decl(types.asyncGenerators.esnext.1.ts, 60, 5)) >AsyncIterator : Symbol(AsyncIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) yield* [1, 2]; }; -const assignability9: () => AsyncIterator = async function * () { ->assignability9 : Symbol(assignability9, Decl(types.asyncGenerators.esnext.1.ts, 38, 5)) +const assignability14: () => AsyncIterator = async function * () { +>assignability14 : Symbol(assignability14, Decl(types.asyncGenerators.esnext.1.ts, 63, 5)) +>AsyncIterator : Symbol(AsyncIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) + + yield* [Promise.resolve(1)]; +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) + +}; +const assignability15: () => AsyncIterator = async function * () { +>assignability15 : Symbol(assignability15, Decl(types.asyncGenerators.esnext.1.ts, 66, 5)) >AsyncIterator : Symbol(AsyncIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) yield* (async function * () { yield 1; })(); }; async function * explicitReturnType1(): AsyncIterableIterator { ->explicitReturnType1 : Symbol(explicitReturnType1, Decl(types.asyncGenerators.esnext.1.ts, 40, 2)) +>explicitReturnType1 : Symbol(explicitReturnType1, Decl(types.asyncGenerators.esnext.1.ts, 68, 2)) >AsyncIterableIterator : Symbol(AsyncIterableIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) yield 1; } async function * explicitReturnType2(): AsyncIterableIterator { ->explicitReturnType2 : Symbol(explicitReturnType2, Decl(types.asyncGenerators.esnext.1.ts, 43, 1)) +>explicitReturnType2 : Symbol(explicitReturnType2, Decl(types.asyncGenerators.esnext.1.ts, 71, 1)) >AsyncIterableIterator : Symbol(AsyncIterableIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) + yield Promise.resolve(1); +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +} +async function * explicitReturnType3(): AsyncIterableIterator { +>explicitReturnType3 : Symbol(explicitReturnType3, Decl(types.asyncGenerators.esnext.1.ts, 74, 1)) +>AsyncIterableIterator : Symbol(AsyncIterableIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) + yield* [1, 2]; } -async function * explicitReturnType3(): AsyncIterableIterator { ->explicitReturnType3 : Symbol(explicitReturnType3, Decl(types.asyncGenerators.esnext.1.ts, 46, 1)) +async function * explicitReturnType4(): AsyncIterableIterator { +>explicitReturnType4 : Symbol(explicitReturnType4, Decl(types.asyncGenerators.esnext.1.ts, 77, 1)) +>AsyncIterableIterator : Symbol(AsyncIterableIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) + + yield* [Promise.resolve(1)]; +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +} +async function * explicitReturnType5(): AsyncIterableIterator { +>explicitReturnType5 : Symbol(explicitReturnType5, Decl(types.asyncGenerators.esnext.1.ts, 80, 1)) >AsyncIterableIterator : Symbol(AsyncIterableIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) yield* (async function * () { yield 1; })(); } -async function * explicitReturnType4(): AsyncIterable { ->explicitReturnType4 : Symbol(explicitReturnType4, Decl(types.asyncGenerators.esnext.1.ts, 49, 1)) +async function * explicitReturnType6(): AsyncIterable { +>explicitReturnType6 : Symbol(explicitReturnType6, Decl(types.asyncGenerators.esnext.1.ts, 83, 1)) >AsyncIterable : Symbol(AsyncIterable, Decl(lib.esnext.asynciterable.d.ts, --, --)) yield 1; +} +async function * explicitReturnType7(): AsyncIterable { +>explicitReturnType7 : Symbol(explicitReturnType7, Decl(types.asyncGenerators.esnext.1.ts, 86, 1)) +>AsyncIterable : Symbol(AsyncIterable, Decl(lib.esnext.asynciterable.d.ts, --, --)) + + yield Promise.resolve(1); +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) } -async function * explicitReturnType5(): AsyncIterable { ->explicitReturnType5 : Symbol(explicitReturnType5, Decl(types.asyncGenerators.esnext.1.ts, 52, 1)) +async function * explicitReturnType8(): AsyncIterable { +>explicitReturnType8 : Symbol(explicitReturnType8, Decl(types.asyncGenerators.esnext.1.ts, 89, 1)) >AsyncIterable : Symbol(AsyncIterable, Decl(lib.esnext.asynciterable.d.ts, --, --)) yield* [1, 2]; +} +async function * explicitReturnType9(): AsyncIterable { +>explicitReturnType9 : Symbol(explicitReturnType9, Decl(types.asyncGenerators.esnext.1.ts, 92, 1)) +>AsyncIterable : Symbol(AsyncIterable, Decl(lib.esnext.asynciterable.d.ts, --, --)) + + yield* [Promise.resolve(1)]; +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) } -async function * explicitReturnType6(): AsyncIterable { ->explicitReturnType6 : Symbol(explicitReturnType6, Decl(types.asyncGenerators.esnext.1.ts, 55, 1)) +async function * explicitReturnType10(): AsyncIterable { +>explicitReturnType10 : Symbol(explicitReturnType10, Decl(types.asyncGenerators.esnext.1.ts, 95, 1)) >AsyncIterable : Symbol(AsyncIterable, Decl(lib.esnext.asynciterable.d.ts, --, --)) yield* (async function * () { yield 1; })(); } -async function * explicitReturnType7(): AsyncIterator { ->explicitReturnType7 : Symbol(explicitReturnType7, Decl(types.asyncGenerators.esnext.1.ts, 58, 1)) +async function * explicitReturnType11(): AsyncIterator { +>explicitReturnType11 : Symbol(explicitReturnType11, Decl(types.asyncGenerators.esnext.1.ts, 98, 1)) >AsyncIterator : Symbol(AsyncIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) yield 1; } -async function * explicitReturnType8(): AsyncIterator { ->explicitReturnType8 : Symbol(explicitReturnType8, Decl(types.asyncGenerators.esnext.1.ts, 61, 1)) +async function * explicitReturnType12(): AsyncIterator { +>explicitReturnType12 : Symbol(explicitReturnType12, Decl(types.asyncGenerators.esnext.1.ts, 101, 1)) >AsyncIterator : Symbol(AsyncIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) + yield Promise.resolve(1); +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +} +async function * explicitReturnType13(): AsyncIterator { +>explicitReturnType13 : Symbol(explicitReturnType13, Decl(types.asyncGenerators.esnext.1.ts, 104, 1)) +>AsyncIterator : Symbol(AsyncIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) + yield* [1, 2]; +} +async function * explicitReturnType14(): AsyncIterator { +>explicitReturnType14 : Symbol(explicitReturnType14, Decl(types.asyncGenerators.esnext.1.ts, 107, 1)) +>AsyncIterator : Symbol(AsyncIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) + + yield* [Promise.resolve(1)]; +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) } -async function * explicitReturnType9(): AsyncIterator { ->explicitReturnType9 : Symbol(explicitReturnType9, Decl(types.asyncGenerators.esnext.1.ts, 64, 1)) +async function * explicitReturnType15(): AsyncIterator { +>explicitReturnType15 : Symbol(explicitReturnType15, Decl(types.asyncGenerators.esnext.1.ts, 110, 1)) >AsyncIterator : Symbol(AsyncIterator, Decl(lib.esnext.asynciterable.d.ts, --, --)) yield* (async function * () { yield 1; })(); } -async function * explicitReturnType10(): {} { ->explicitReturnType10 : Symbol(explicitReturnType10, Decl(types.asyncGenerators.esnext.1.ts, 67, 1)) +async function * explicitReturnType16(): {} { +>explicitReturnType16 : Symbol(explicitReturnType16, Decl(types.asyncGenerators.esnext.1.ts, 113, 1)) yield 1; } async function * awaitedType1() { ->awaitedType1 : Symbol(awaitedType1, Decl(types.asyncGenerators.esnext.1.ts, 70, 1)) +>awaitedType1 : Symbol(awaitedType1, Decl(types.asyncGenerators.esnext.1.ts, 116, 1)) const x = await 1; ->x : Symbol(x, Decl(types.asyncGenerators.esnext.1.ts, 72, 9)) +>x : Symbol(x, Decl(types.asyncGenerators.esnext.1.ts, 118, 9)) } async function * awaitedType2() { ->awaitedType2 : Symbol(awaitedType2, Decl(types.asyncGenerators.esnext.1.ts, 73, 1)) +>awaitedType2 : Symbol(awaitedType2, Decl(types.asyncGenerators.esnext.1.ts, 119, 1)) const x = await Promise.resolve(1); ->x : Symbol(x, Decl(types.asyncGenerators.esnext.1.ts, 75, 9)) +>x : Symbol(x, Decl(types.asyncGenerators.esnext.1.ts, 121, 9)) >Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) >Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) >resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) diff --git a/tests/baselines/reference/types.asyncGenerators.esnext.1.types b/tests/baselines/reference/types.asyncGenerators.esnext.1.types index a788f2d349f..1a72da228e7 100644 --- a/tests/baselines/reference/types.asyncGenerators.esnext.1.types +++ b/tests/baselines/reference/types.asyncGenerators.esnext.1.types @@ -18,14 +18,52 @@ async function * inferReturnType3() { async function * inferReturnType4() { >inferReturnType4 : () => AsyncIterableIterator + yield Promise.resolve(1); +>yield Promise.resolve(1) : any +>Promise.resolve(1) : Promise +>Promise.resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>Promise : PromiseConstructor +>resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>1 : 1 +} +async function * inferReturnType5() { +>inferReturnType5 : () => AsyncIterableIterator + + yield 1; +>yield 1 : any +>1 : 1 + + yield Promise.resolve(2); +>yield Promise.resolve(2) : any +>Promise.resolve(2) : Promise +>Promise.resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>Promise : PromiseConstructor +>resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>2 : 2 +} +async function * inferReturnType6() { +>inferReturnType6 : () => AsyncIterableIterator + yield* [1, 2]; >yield* [1, 2] : any >[1, 2] : number[] >1 : 1 >2 : 2 } -async function * inferReturnType5() { ->inferReturnType5 : () => AsyncIterableIterator<1> +async function * inferReturnType7() { +>inferReturnType7 : () => AsyncIterableIterator + + yield* [Promise.resolve(1)]; +>yield* [Promise.resolve(1)] : any +>[Promise.resolve(1)] : Promise[] +>Promise.resolve(1) : Promise +>Promise.resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>Promise : PromiseConstructor +>resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>1 : 1 +} +async function * inferReturnType8() { +>inferReturnType8 : () => AsyncIterableIterator<1> yield* (async function * () { yield 1; })(); >yield* (async function * () { yield 1; })() : any @@ -48,6 +86,20 @@ const assignability1: () => AsyncIterableIterator = async function * () const assignability2: () => AsyncIterableIterator = async function * () { >assignability2 : () => AsyncIterableIterator >AsyncIterableIterator : AsyncIterableIterator +>async function * () { yield Promise.resolve(1);} : () => AsyncIterableIterator + + yield Promise.resolve(1); +>yield Promise.resolve(1) : any +>Promise.resolve(1) : Promise +>Promise.resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>Promise : PromiseConstructor +>resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>1 : 1 + +}; +const assignability3: () => AsyncIterableIterator = async function * () { +>assignability3 : () => AsyncIterableIterator +>AsyncIterableIterator : AsyncIterableIterator >async function * () { yield* [1, 2];} : () => AsyncIterableIterator yield* [1, 2]; @@ -57,8 +109,23 @@ const assignability2: () => AsyncIterableIterator = async function * () >2 : 2 }; -const assignability3: () => AsyncIterableIterator = async function * () { ->assignability3 : () => AsyncIterableIterator +const assignability4: () => AsyncIterableIterator = async function * () { +>assignability4 : () => AsyncIterableIterator +>AsyncIterableIterator : AsyncIterableIterator +>async function * () { yield* [Promise.resolve(1)];} : () => AsyncIterableIterator + + yield* [Promise.resolve(1)]; +>yield* [Promise.resolve(1)] : any +>[Promise.resolve(1)] : Promise[] +>Promise.resolve(1) : Promise +>Promise.resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>Promise : PromiseConstructor +>resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>1 : 1 + +}; +const assignability5: () => AsyncIterableIterator = async function * () { +>assignability5 : () => AsyncIterableIterator >AsyncIterableIterator : AsyncIterableIterator >async function * () { yield* (async function * () { yield 1; })();} : () => AsyncIterableIterator<1> @@ -71,8 +138,8 @@ const assignability3: () => AsyncIterableIterator = async function * () >1 : 1 }; -const assignability4: () => AsyncIterable = async function * () { ->assignability4 : () => AsyncIterable +const assignability6: () => AsyncIterable = async function * () { +>assignability6 : () => AsyncIterable >AsyncIterable : AsyncIterable >async function * () { yield 1;} : () => AsyncIterableIterator<1> @@ -81,8 +148,22 @@ const assignability4: () => AsyncIterable = async function * () { >1 : 1 }; -const assignability5: () => AsyncIterable = async function * () { ->assignability5 : () => AsyncIterable +const assignability7: () => AsyncIterable = async function * () { +>assignability7 : () => AsyncIterable +>AsyncIterable : AsyncIterable +>async function * () { yield Promise.resolve(1);} : () => AsyncIterableIterator + + yield Promise.resolve(1); +>yield Promise.resolve(1) : any +>Promise.resolve(1) : Promise +>Promise.resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>Promise : PromiseConstructor +>resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>1 : 1 + +}; +const assignability8: () => AsyncIterable = async function * () { +>assignability8 : () => AsyncIterable >AsyncIterable : AsyncIterable >async function * () { yield* [1, 2];} : () => AsyncIterableIterator @@ -93,8 +174,23 @@ const assignability5: () => AsyncIterable = async function * () { >2 : 2 }; -const assignability6: () => AsyncIterable = async function * () { ->assignability6 : () => AsyncIterable +const assignability9: () => AsyncIterable = async function * () { +>assignability9 : () => AsyncIterable +>AsyncIterable : AsyncIterable +>async function * () { yield* [Promise.resolve(1)];} : () => AsyncIterableIterator + + yield* [Promise.resolve(1)]; +>yield* [Promise.resolve(1)] : any +>[Promise.resolve(1)] : Promise[] +>Promise.resolve(1) : Promise +>Promise.resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>Promise : PromiseConstructor +>resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>1 : 1 + +}; +const assignability10: () => AsyncIterable = async function * () { +>assignability10 : () => AsyncIterable >AsyncIterable : AsyncIterable >async function * () { yield* (async function * () { yield 1; })();} : () => AsyncIterableIterator<1> @@ -107,8 +203,8 @@ const assignability6: () => AsyncIterable = async function * () { >1 : 1 }; -const assignability7: () => AsyncIterator = async function * () { ->assignability7 : () => AsyncIterator +const assignability11: () => AsyncIterator = async function * () { +>assignability11 : () => AsyncIterator >AsyncIterator : AsyncIterator >async function * () { yield 1;} : () => AsyncIterableIterator<1> @@ -117,8 +213,22 @@ const assignability7: () => AsyncIterator = async function * () { >1 : 1 }; -const assignability8: () => AsyncIterator = async function * () { ->assignability8 : () => AsyncIterator +const assignability12: () => AsyncIterator = async function * () { +>assignability12 : () => AsyncIterator +>AsyncIterator : AsyncIterator +>async function * () { yield Promise.resolve(1);} : () => AsyncIterableIterator + + yield Promise.resolve(1); +>yield Promise.resolve(1) : any +>Promise.resolve(1) : Promise +>Promise.resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>Promise : PromiseConstructor +>resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>1 : 1 + +}; +const assignability13: () => AsyncIterator = async function * () { +>assignability13 : () => AsyncIterator >AsyncIterator : AsyncIterator >async function * () { yield* [1, 2];} : () => AsyncIterableIterator @@ -129,8 +239,23 @@ const assignability8: () => AsyncIterator = async function * () { >2 : 2 }; -const assignability9: () => AsyncIterator = async function * () { ->assignability9 : () => AsyncIterator +const assignability14: () => AsyncIterator = async function * () { +>assignability14 : () => AsyncIterator +>AsyncIterator : AsyncIterator +>async function * () { yield* [Promise.resolve(1)];} : () => AsyncIterableIterator + + yield* [Promise.resolve(1)]; +>yield* [Promise.resolve(1)] : any +>[Promise.resolve(1)] : Promise[] +>Promise.resolve(1) : Promise +>Promise.resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>Promise : PromiseConstructor +>resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>1 : 1 + +}; +const assignability15: () => AsyncIterator = async function * () { +>assignability15 : () => AsyncIterator >AsyncIterator : AsyncIterator >async function * () { yield* (async function * () { yield 1; })();} : () => AsyncIterableIterator<1> @@ -153,6 +278,18 @@ async function * explicitReturnType1(): AsyncIterableIterator { } async function * explicitReturnType2(): AsyncIterableIterator { >explicitReturnType2 : () => AsyncIterableIterator +>AsyncIterableIterator : AsyncIterableIterator + + yield Promise.resolve(1); +>yield Promise.resolve(1) : any +>Promise.resolve(1) : Promise +>Promise.resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>Promise : PromiseConstructor +>resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>1 : 1 +} +async function * explicitReturnType3(): AsyncIterableIterator { +>explicitReturnType3 : () => AsyncIterableIterator >AsyncIterableIterator : AsyncIterableIterator yield* [1, 2]; @@ -161,8 +298,21 @@ async function * explicitReturnType2(): AsyncIterableIterator { >1 : 1 >2 : 2 } -async function * explicitReturnType3(): AsyncIterableIterator { ->explicitReturnType3 : () => AsyncIterableIterator +async function * explicitReturnType4(): AsyncIterableIterator { +>explicitReturnType4 : () => AsyncIterableIterator +>AsyncIterableIterator : AsyncIterableIterator + + yield* [Promise.resolve(1)]; +>yield* [Promise.resolve(1)] : any +>[Promise.resolve(1)] : Promise[] +>Promise.resolve(1) : Promise +>Promise.resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>Promise : PromiseConstructor +>resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>1 : 1 +} +async function * explicitReturnType5(): AsyncIterableIterator { +>explicitReturnType5 : () => AsyncIterableIterator >AsyncIterableIterator : AsyncIterableIterator yield* (async function * () { yield 1; })(); @@ -173,26 +323,51 @@ async function * explicitReturnType3(): AsyncIterableIterator { >yield 1 : any >1 : 1 } -async function * explicitReturnType4(): AsyncIterable { ->explicitReturnType4 : () => AsyncIterable ->AsyncIterable : AsyncIterable - - yield 1; ->yield 1 : any ->1 : 1 -} -async function * explicitReturnType5(): AsyncIterable { ->explicitReturnType5 : () => AsyncIterable ->AsyncIterable : AsyncIterable - - yield* [1, 2]; ->yield* [1, 2] : any ->[1, 2] : number[] ->1 : 1 ->2 : 2 -} async function * explicitReturnType6(): AsyncIterable { >explicitReturnType6 : () => AsyncIterable +>AsyncIterable : AsyncIterable + + yield 1; +>yield 1 : any +>1 : 1 +} +async function * explicitReturnType7(): AsyncIterable { +>explicitReturnType7 : () => AsyncIterable +>AsyncIterable : AsyncIterable + + yield Promise.resolve(1); +>yield Promise.resolve(1) : any +>Promise.resolve(1) : Promise +>Promise.resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>Promise : PromiseConstructor +>resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>1 : 1 +} +async function * explicitReturnType8(): AsyncIterable { +>explicitReturnType8 : () => AsyncIterable +>AsyncIterable : AsyncIterable + + yield* [1, 2]; +>yield* [1, 2] : any +>[1, 2] : number[] +>1 : 1 +>2 : 2 +} +async function * explicitReturnType9(): AsyncIterable { +>explicitReturnType9 : () => AsyncIterable +>AsyncIterable : AsyncIterable + + yield* [Promise.resolve(1)]; +>yield* [Promise.resolve(1)] : any +>[Promise.resolve(1)] : Promise[] +>Promise.resolve(1) : Promise +>Promise.resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>Promise : PromiseConstructor +>resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>1 : 1 +} +async function * explicitReturnType10(): AsyncIterable { +>explicitReturnType10 : () => AsyncIterable >AsyncIterable : AsyncIterable yield* (async function * () { yield 1; })(); @@ -203,16 +378,28 @@ async function * explicitReturnType6(): AsyncIterable { >yield 1 : any >1 : 1 } -async function * explicitReturnType7(): AsyncIterator { ->explicitReturnType7 : () => AsyncIterator +async function * explicitReturnType11(): AsyncIterator { +>explicitReturnType11 : () => AsyncIterator >AsyncIterator : AsyncIterator yield 1; >yield 1 : any >1 : 1 } -async function * explicitReturnType8(): AsyncIterator { ->explicitReturnType8 : () => AsyncIterator +async function * explicitReturnType12(): AsyncIterator { +>explicitReturnType12 : () => AsyncIterator +>AsyncIterator : AsyncIterator + + yield Promise.resolve(1); +>yield Promise.resolve(1) : any +>Promise.resolve(1) : Promise +>Promise.resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>Promise : PromiseConstructor +>resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>1 : 1 +} +async function * explicitReturnType13(): AsyncIterator { +>explicitReturnType13 : () => AsyncIterator >AsyncIterator : AsyncIterator yield* [1, 2]; @@ -221,8 +408,21 @@ async function * explicitReturnType8(): AsyncIterator { >1 : 1 >2 : 2 } -async function * explicitReturnType9(): AsyncIterator { ->explicitReturnType9 : () => AsyncIterator +async function * explicitReturnType14(): AsyncIterator { +>explicitReturnType14 : () => AsyncIterator +>AsyncIterator : AsyncIterator + + yield* [Promise.resolve(1)]; +>yield* [Promise.resolve(1)] : any +>[Promise.resolve(1)] : Promise[] +>Promise.resolve(1) : Promise +>Promise.resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>Promise : PromiseConstructor +>resolve : { (value: T | PromiseLike): Promise; (): Promise; } +>1 : 1 +} +async function * explicitReturnType15(): AsyncIterator { +>explicitReturnType15 : () => AsyncIterator >AsyncIterator : AsyncIterator yield* (async function * () { yield 1; })(); @@ -233,8 +433,8 @@ async function * explicitReturnType9(): AsyncIterator { >yield 1 : any >1 : 1 } -async function * explicitReturnType10(): {} { ->explicitReturnType10 : () => {} +async function * explicitReturnType16(): {} { +>explicitReturnType16 : () => {} yield 1; >yield 1 : any diff --git a/tests/baselines/reference/types.asyncGenerators.esnext.2.errors.txt b/tests/baselines/reference/types.asyncGenerators.esnext.2.errors.txt index 92733c18640..64d7980578c 100644 --- a/tests/baselines/reference/types.asyncGenerators.esnext.2.errors.txt +++ b/tests/baselines/reference/types.asyncGenerators.esnext.2.errors.txt @@ -1,13 +1,14 @@ tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(2,12): error TS2504: Type must have a '[Symbol.asyncIterator]()' method that returns an async iterator. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(7,7): error TS2322: Type '() => AsyncIterableIterator<"a">' is not assignable to type '() => AsyncIterableIterator'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(8,12): error TS2504: Type must have a '[Symbol.asyncIterator]()' method that returns an async iterator. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(10,7): error TS2322: Type '() => AsyncIterableIterator<"a">' is not assignable to type '() => AsyncIterableIterator'. Type 'AsyncIterableIterator<"a">' is not assignable to type 'AsyncIterableIterator'. Type '"a"' is not assignable to type 'number'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(10,7): error TS2322: Type '() => AsyncIterableIterator' is not assignable to type '() => AsyncIterableIterator'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(13,7): error TS2322: Type '() => AsyncIterableIterator' is not assignable to type '() => AsyncIterableIterator'. Type 'AsyncIterableIterator' is not assignable to type 'AsyncIterableIterator'. Type 'string' is not assignable to type 'number'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(13,7): error TS2322: Type '() => AsyncIterableIterator<"a">' is not assignable to type '() => AsyncIterableIterator'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(16,7): error TS2322: Type '() => AsyncIterableIterator<"a">' is not assignable to type '() => AsyncIterableIterator'. Type 'AsyncIterableIterator<"a">' is not assignable to type 'AsyncIterableIterator'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(16,7): error TS2322: Type '() => AsyncIterableIterator<"a">' is not assignable to type '() => AsyncIterable'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(19,7): error TS2322: Type '() => AsyncIterableIterator<"a">' is not assignable to type '() => AsyncIterable'. Type 'AsyncIterableIterator<"a">' is not assignable to type 'AsyncIterable'. Types of property '[Symbol.asyncIterator]' are incompatible. Type '() => AsyncIterableIterator<"a">' is not assignable to type '() => AsyncIterator'. @@ -17,7 +18,7 @@ tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts( Type 'Promise>' is not assignable to type 'Promise>'. Type 'IteratorResult<"a">' is not assignable to type 'IteratorResult'. Type '"a"' is not assignable to type 'number'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(19,7): error TS2322: Type '() => AsyncIterableIterator' is not assignable to type '() => AsyncIterable'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(22,7): error TS2322: Type '() => AsyncIterableIterator' is not assignable to type '() => AsyncIterable'. Type 'AsyncIterableIterator' is not assignable to type 'AsyncIterable'. Types of property '[Symbol.asyncIterator]' are incompatible. Type '() => AsyncIterableIterator' is not assignable to type '() => AsyncIterator'. @@ -27,36 +28,36 @@ tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts( Type 'Promise>' is not assignable to type 'Promise>'. Type 'IteratorResult' is not assignable to type 'IteratorResult'. Type 'string' is not assignable to type 'number'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(22,7): error TS2322: Type '() => AsyncIterableIterator<"a">' is not assignable to type '() => AsyncIterable'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(25,7): error TS2322: Type '() => AsyncIterableIterator<"a">' is not assignable to type '() => AsyncIterable'. Type 'AsyncIterableIterator<"a">' is not assignable to type 'AsyncIterable'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(25,7): error TS2322: Type '() => AsyncIterableIterator<"a">' is not assignable to type '() => AsyncIterator'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(28,7): error TS2322: Type '() => AsyncIterableIterator<"a">' is not assignable to type '() => AsyncIterator'. Type 'AsyncIterableIterator<"a">' is not assignable to type 'AsyncIterator'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(28,7): error TS2322: Type '() => AsyncIterableIterator' is not assignable to type '() => AsyncIterator'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(31,7): error TS2322: Type '() => AsyncIterableIterator' is not assignable to type '() => AsyncIterator'. Type 'AsyncIterableIterator' is not assignable to type 'AsyncIterator'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(31,7): error TS2322: Type '() => AsyncIterableIterator<"a">' is not assignable to type '() => AsyncIterator'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(34,7): error TS2322: Type '() => AsyncIterableIterator<"a">' is not assignable to type '() => AsyncIterator'. Type 'AsyncIterableIterator<"a">' is not assignable to type 'AsyncIterator'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(35,11): error TS2322: Type '"a"' is not assignable to type 'number'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(38,12): error TS2322: Type 'string' is not assignable to type 'number'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(41,12): error TS2322: Type '"a"' is not assignable to type 'number'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(44,11): error TS2322: Type '"a"' is not assignable to type 'number'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(47,12): error TS2322: Type 'string' is not assignable to type 'number'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(50,12): error TS2322: Type '"a"' is not assignable to type 'number'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(53,11): error TS2322: Type '"a"' is not assignable to type 'number'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(56,12): error TS2322: Type 'string' is not assignable to type 'number'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(59,12): error TS2322: Type '"a"' is not assignable to type 'number'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(61,42): error TS2322: Type 'AsyncIterableIterator' is not assignable to type 'IterableIterator'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(38,11): error TS2322: Type '"a"' is not assignable to type 'number'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(41,12): error TS2322: Type 'string' is not assignable to type 'number'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(44,12): error TS2322: Type '"a"' is not assignable to type 'number'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(47,11): error TS2322: Type '"a"' is not assignable to type 'number'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(50,12): error TS2322: Type 'string' is not assignable to type 'number'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(53,12): error TS2322: Type '"a"' is not assignable to type 'number'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(56,11): error TS2322: Type '"a"' is not assignable to type 'number'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(59,12): error TS2322: Type 'string' is not assignable to type 'number'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(62,12): error TS2322: Type '"a"' is not assignable to type 'number'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(64,42): error TS2322: Type 'AsyncIterableIterator' is not assignable to type 'IterableIterator'. Property '[Symbol.iterator]' is missing in type 'AsyncIterableIterator'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(64,42): error TS2322: Type 'AsyncIterableIterator' is not assignable to type 'Iterable'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(67,42): error TS2322: Type 'AsyncIterableIterator' is not assignable to type 'Iterable'. Property '[Symbol.iterator]' is missing in type 'AsyncIterableIterator'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(67,42): error TS2322: Type 'AsyncIterableIterator' is not assignable to type 'Iterator'. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(70,42): error TS2322: Type 'AsyncIterableIterator' is not assignable to type 'Iterator'. Types of property 'next' are incompatible. Type '(value?: any) => Promise>' is not assignable to type '(value?: any) => IteratorResult'. Type 'Promise>' is not assignable to type 'IteratorResult'. Property 'done' is missing in type 'Promise>'. -tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(71,12): error TS2504: Type must have a '[Symbol.asyncIterator]()' method that returns an async iterator. +tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts(74,12): error TS2504: Type must have a '[Symbol.asyncIterator]()' method that returns an async iterator. -==== tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts (23 errors) ==== +==== tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts (24 errors) ==== async function * inferReturnType1() { yield* {}; ~~ @@ -65,6 +66,11 @@ tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts( async function * inferReturnType2() { yield* inferReturnType2(); } + async function * inferReturnType3() { + yield* Promise.resolve([1, 2]); + ~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2504: Type must have a '[Symbol.asyncIterator]()' method that returns an async iterator. + } const assignability1: () => AsyncIterableIterator = async function * () { ~~~~~~~~~~~~~~ !!! error TS2322: Type '() => AsyncIterableIterator<"a">' is not assignable to type '() => AsyncIterableIterator'. diff --git a/tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.1.ts b/tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.1.ts index 3ff45500c26..1d7ebd17807 100644 --- a/tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.1.ts +++ b/tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.1.ts @@ -10,66 +10,112 @@ async function * inferReturnType3() { yield 1; } async function * inferReturnType4() { - yield* [1, 2]; + yield Promise.resolve(1); } async function * inferReturnType5() { + yield 1; + yield Promise.resolve(2); +} +async function * inferReturnType6() { + yield* [1, 2]; +} +async function * inferReturnType7() { + yield* [Promise.resolve(1)]; +} +async function * inferReturnType8() { yield* (async function * () { yield 1; })(); } const assignability1: () => AsyncIterableIterator = async function * () { yield 1; }; const assignability2: () => AsyncIterableIterator = async function * () { - yield* [1, 2]; + yield Promise.resolve(1); }; const assignability3: () => AsyncIterableIterator = async function * () { - yield* (async function * () { yield 1; })(); -}; -const assignability4: () => AsyncIterable = async function * () { - yield 1; -}; -const assignability5: () => AsyncIterable = async function * () { yield* [1, 2]; }; +const assignability4: () => AsyncIterableIterator = async function * () { + yield* [Promise.resolve(1)]; +}; +const assignability5: () => AsyncIterableIterator = async function * () { + yield* (async function * () { yield 1; })(); +}; const assignability6: () => AsyncIterable = async function * () { - yield* (async function * () { yield 1; })(); -}; -const assignability7: () => AsyncIterator = async function * () { yield 1; }; -const assignability8: () => AsyncIterator = async function * () { +const assignability7: () => AsyncIterable = async function * () { + yield Promise.resolve(1); +}; +const assignability8: () => AsyncIterable = async function * () { yield* [1, 2]; }; -const assignability9: () => AsyncIterator = async function * () { +const assignability9: () => AsyncIterable = async function * () { + yield* [Promise.resolve(1)]; +}; +const assignability10: () => AsyncIterable = async function * () { + yield* (async function * () { yield 1; })(); +}; +const assignability11: () => AsyncIterator = async function * () { + yield 1; +}; +const assignability12: () => AsyncIterator = async function * () { + yield Promise.resolve(1); +}; +const assignability13: () => AsyncIterator = async function * () { + yield* [1, 2]; +}; +const assignability14: () => AsyncIterator = async function * () { + yield* [Promise.resolve(1)]; +}; +const assignability15: () => AsyncIterator = async function * () { yield* (async function * () { yield 1; })(); }; async function * explicitReturnType1(): AsyncIterableIterator { yield 1; } async function * explicitReturnType2(): AsyncIterableIterator { - yield* [1, 2]; + yield Promise.resolve(1); } async function * explicitReturnType3(): AsyncIterableIterator { - yield* (async function * () { yield 1; })(); -} -async function * explicitReturnType4(): AsyncIterable { - yield 1; -} -async function * explicitReturnType5(): AsyncIterable { yield* [1, 2]; } +async function * explicitReturnType4(): AsyncIterableIterator { + yield* [Promise.resolve(1)]; +} +async function * explicitReturnType5(): AsyncIterableIterator { + yield* (async function * () { yield 1; })(); +} async function * explicitReturnType6(): AsyncIterable { - yield* (async function * () { yield 1; })(); -} -async function * explicitReturnType7(): AsyncIterator { yield 1; } -async function * explicitReturnType8(): AsyncIterator { +async function * explicitReturnType7(): AsyncIterable { + yield Promise.resolve(1); +} +async function * explicitReturnType8(): AsyncIterable { yield* [1, 2]; } -async function * explicitReturnType9(): AsyncIterator { +async function * explicitReturnType9(): AsyncIterable { + yield* [Promise.resolve(1)]; +} +async function * explicitReturnType10(): AsyncIterable { yield* (async function * () { yield 1; })(); } -async function * explicitReturnType10(): {} { +async function * explicitReturnType11(): AsyncIterator { + yield 1; +} +async function * explicitReturnType12(): AsyncIterator { + yield Promise.resolve(1); +} +async function * explicitReturnType13(): AsyncIterator { + yield* [1, 2]; +} +async function * explicitReturnType14(): AsyncIterator { + yield* [Promise.resolve(1)]; +} +async function * explicitReturnType15(): AsyncIterator { + yield* (async function * () { yield 1; })(); +} +async function * explicitReturnType16(): {} { yield 1; } async function * awaitedType1() { diff --git a/tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts b/tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts index 848093de182..3252189b798 100644 --- a/tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts +++ b/tests/cases/conformance/types/asyncGenerators/types.asyncGenerators.esnext.2.ts @@ -7,6 +7,9 @@ async function * inferReturnType1() { async function * inferReturnType2() { yield* inferReturnType2(); } +async function * inferReturnType3() { + yield* Promise.resolve([1, 2]); +} const assignability1: () => AsyncIterableIterator = async function * () { yield "a"; }; From 64e2c29c6c6d4447f62ee9e1e11f5a1a766ad555 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Mon, 17 Apr 2017 17:31:54 -0700 Subject: [PATCH 28/33] Don't use 'yield' as an identifier --- src/compiler/transformers/esnext.ts | 4 +-- ...ter.asyncGenerators.classMethods.es2015.js | 36 +++++++++---------- ...mitter.asyncGenerators.classMethods.es5.js | 36 +++++++++---------- ...cGenerators.functionDeclarations.es2015.js | 28 +++++++-------- ...syncGenerators.functionDeclarations.es5.js | 28 +++++++-------- ...ncGenerators.functionExpressions.es2015.js | 28 +++++++-------- ...asyncGenerators.functionExpressions.es5.js | 28 +++++++-------- ...cGenerators.objectLiteralMethods.es2015.js | 28 +++++++-------- ...syncGenerators.objectLiteralMethods.es5.js | 28 +++++++-------- .../reference/emitter.forAwait.es2015.js | 8 ++--- .../reference/emitter.forAwait.es5.js | 8 ++--- 11 files changed, 130 insertions(+), 130 deletions(-) diff --git a/src/compiler/transformers/esnext.ts b/src/compiler/transformers/esnext.ts index 4f824f510a5..b43802c7a8f 100644 --- a/src/compiler/transformers/esnext.ts +++ b/src/compiler/transformers/esnext.ts @@ -891,8 +891,8 @@ namespace ts { function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.js b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.js index aa7a61e5538..fe501f3c6be 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.js +++ b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.js @@ -68,8 +68,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -89,8 +89,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -111,8 +111,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -138,8 +138,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -160,8 +160,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -187,8 +187,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -209,8 +209,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -231,8 +231,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -255,8 +255,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.js b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.js index dede0ac2a7f..a618c0787d2 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.js +++ b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.js @@ -95,8 +95,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -149,8 +149,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -209,8 +209,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -274,8 +274,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -344,8 +344,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -426,8 +426,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -486,8 +486,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -540,8 +540,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -607,8 +607,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.js b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.js index b8d9fb6bb4d..197a3d687c6 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.js +++ b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.js @@ -37,8 +37,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -56,8 +56,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -76,8 +76,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -101,8 +101,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -121,8 +121,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -146,8 +146,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -166,8 +166,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.js b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.js index ea8a94b66d7..0dc0c02592e 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.js +++ b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.js @@ -64,8 +64,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -113,8 +113,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -168,8 +168,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -228,8 +228,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -293,8 +293,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -370,8 +370,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -425,8 +425,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.js b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.js index 18af4869853..4e22d0c9922 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.js +++ b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.js @@ -37,8 +37,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -56,8 +56,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -76,8 +76,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -101,8 +101,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -121,8 +121,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -146,8 +146,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -166,8 +166,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.js b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.js index 7f57e78700e..986ba21fdd6 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.js +++ b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.js @@ -64,8 +64,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -113,8 +113,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -168,8 +168,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -228,8 +228,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -293,8 +293,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -370,8 +370,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -425,8 +425,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.js b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.js index a7d8d132d58..2a8fccdc53a 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.js +++ b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.js @@ -51,8 +51,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -72,8 +72,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -94,8 +94,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -121,8 +121,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -143,8 +143,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -170,8 +170,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -192,8 +192,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.js b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.js index 2913877e9bc..e0614ad763a 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.js +++ b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.js @@ -78,8 +78,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -129,8 +129,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -186,8 +186,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -248,8 +248,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -315,8 +315,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -394,8 +394,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -451,8 +451,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.forAwait.es2015.js b/tests/baselines/reference/emitter.forAwait.es2015.js index 0e63d4af4db..b60627291e2 100644 --- a/tests/baselines/reference/emitter.forAwait.es2015.js +++ b/tests/baselines/reference/emitter.forAwait.es2015.js @@ -102,8 +102,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -140,8 +140,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } diff --git a/tests/baselines/reference/emitter.forAwait.es5.js b/tests/baselines/reference/emitter.forAwait.es5.js index edce30e7e9a..a06d79b1dd5 100644 --- a/tests/baselines/reference/emitter.forAwait.es5.js +++ b/tests/baselines/reference/emitter.forAwait.es5.js @@ -231,8 +231,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } @@ -320,8 +320,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; } function next() { if (!c && q.length) resume((c = q.shift())[0], c[1]); } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(c[3], e); } } - function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } - function yield(value) { settle(c[2], { value: value, done: false }); } + function step(r) { r.done ? settle(c[2], r) : Promise.resolve(r.value[1]).then(r.value[0] === "yield" ? _yield : r.value[0] === "delegate" ? delegate : fulfill, reject); } + function _yield(value) { settle(c[2], { value: value, done: false }); } function delegate(r) { step(r.done ? r : { value: ["yield", r.value], done: false }); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } From 37214784b55258f8b1b7c52f3f5ccca0c7d5612f Mon Sep 17 00:00:00 2001 From: Basarat Ali Syed Date: Tue, 18 Apr 2017 10:51:08 +1000 Subject: [PATCH 29/33] export interfaces for exported members --- src/services/findAllReferences.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 98e601ebb06..acf95d227c3 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -7,7 +7,7 @@ namespace ts.FindAllReferences { references: Entry[]; } - type Definition = + export type Definition = | { type: "symbol"; symbol: Symbol; node: Node } | { type: "label"; node: Identifier } | { type: "keyword"; node: ts.Node } @@ -20,7 +20,7 @@ namespace ts.FindAllReferences { node: Node; isInString?: true; } - interface SpanEntry { + export interface SpanEntry { type: "span"; fileName: string; textSpan: TextSpan; From 50e1f415f332f0eee57c1a381bcbe7d5081d7dd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halasi=20Tam=C3=A1s?= Date: Tue, 18 Apr 2017 12:05:43 +0200 Subject: [PATCH 30/33] Fix downloads badge (0/month) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d21e558360c..053d036411e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![Build Status](https://travis-ci.org/Microsoft/TypeScript.svg?branch=master)](https://travis-ci.org/Microsoft/TypeScript) [![npm version](https://badge.fury.io/js/typescript.svg)](https://www.npmjs.com/package/typescript) -[![Downloads](https://img.shields.io/npm/dm/TypeScript.svg)](https://www.npmjs.com/package/typescript) +[![Downloads](https://img.shields.io/npm/dm/typescript.svg)](https://www.npmjs.com/package/typescript) # TypeScript From fabf5d8d533aedc17da6d6247c2857e301f22f8e Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Tue, 18 Apr 2017 11:17:07 -0700 Subject: [PATCH 31/33] findAncestor:single callback returns boolean|"quit" Previously there was a 'found' callback and a 'quit' callback. --- src/compiler/checker.ts | 53 ++++++++++++++++++++++++----------------- src/compiler/core.ts | 23 ++++++++---------- 2 files changed, 41 insertions(+), 35 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 1863a3104d3..d2b13b0835c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -803,6 +803,9 @@ namespace ts { function isUsedInFunctionOrInstanceProperty(usage: Node, declaration: Node, container?: Node): boolean { return !!findAncestor(usage, current => { + if (current === container) { + return "quit"; + } if (isFunctionLike(current)) { return true; } @@ -824,7 +827,7 @@ namespace ts { } } } - }, n => n === container); + }); } } @@ -1246,7 +1249,7 @@ namespace ts { * Return false if 'stopAt' node is reached or isFunctionLike(current) === true. */ function isSameScopeDescendentOf(initial: Node, parent: Node, stopAt: Node): boolean { - return parent && !!findAncestor(initial, n => n === parent, n => n === stopAt || isFunctionLike(n)); + return parent && !!findAncestor(initial, n => n === stopAt || isFunctionLike(n) ? "quit" : n === parent); } function getAnyImportSyntax(node: Node): AnyImportSyntax { @@ -7890,6 +7893,9 @@ namespace ts { // the type parameters introduced by enclosing declarations. We just pick the first // declaration since multiple declarations will all have the same parent anyway. return !!findAncestor(symbol.declarations[0], node => { + if (node.kind === SyntaxKind.ModuleDeclaration || node.kind === SyntaxKind.SourceFile) { + return "quit"; + } switch (node.kind) { case SyntaxKind.FunctionType: case SyntaxKind.ConstructorType: @@ -7937,8 +7943,7 @@ namespace ts { } break; } - }, - node => node.kind === SyntaxKind.ModuleDeclaration || node.kind === SyntaxKind.SourceFile); + }); } function isTopLevelTypeAlias(symbol: Symbol) { @@ -10384,8 +10389,7 @@ namespace ts { // The expression is restricted to a single identifier or a sequence of identifiers separated by periods return !!findAncestor( node, - n => n.kind === SyntaxKind.TypeQuery, - n => n.kind !== SyntaxKind.TypeQuery && n.kind !== SyntaxKind.Identifier && n.kind !== SyntaxKind.QualifiedName); + n => n.kind === SyntaxKind.TypeQuery ? true : n.kind === SyntaxKind.Identifier || n.kind === SyntaxKind.QualifiedName ? false : "quit"); } // Return the flow cache key for a "dotted name" (i.e. a sequence of identifiers @@ -11629,7 +11633,7 @@ namespace ts { } function hasParentWithAssignmentsMarked(node: Node) { - return !!findAncestor(node.parent, node => isFunctionLike(node) && getNodeLinks(node).flags & NodeCheckFlags.AssignmentsMarked); + return !!findAncestor(node.parent, node => isFunctionLike(node) && !!(getNodeLinks(node).flags & NodeCheckFlags.AssignmentsMarked)); } function markParameterAssignments(node: Node) { @@ -11801,7 +11805,7 @@ namespace ts { } function isInsideFunction(node: Node, threshold: Node): boolean { - return !!findAncestor(node, isFunctionLike, n => n === threshold); + return !!findAncestor(node, n => n === threshold ? "quit" : isFunctionLike(n)); } function checkNestedBlockScopedBinding(node: Identifier, symbol: Symbol): void { @@ -11875,7 +11879,7 @@ namespace ts { // at this point we know that node is the target of assignment // now check that modification happens inside the statement part of the ForStatement - return !!findAncestor(current, n => n === container.statement, n => n === container); + return !!findAncestor(current, n => n === container ? "quit" : n === container.statement); } function captureLexicalThis(node: Node, container: Node): void { @@ -12057,7 +12061,7 @@ namespace ts { } function isInConstructorArgumentInitializer(node: Node, constructorDecl: Node): boolean { - return !!findAncestor(node, n => n.kind === SyntaxKind.Parameter, n => n === constructorDecl); + return !!findAncestor(node, n => n === constructorDecl ? "quit" : n.kind === SyntaxKind.Parameter); } function checkSuperExpression(node: Node): Type { @@ -12083,7 +12087,7 @@ namespace ts { // class B { // [super.foo()]() {} // } - const current = findAncestor(node, n => n.kind === SyntaxKind.ComputedPropertyName, n => n === container); + const current = findAncestor(node, n => n === container ? "quit" : n.kind === SyntaxKind.ComputedPropertyName); if (current && current.kind === SyntaxKind.ComputedPropertyName) { error(node, Diagnostics.super_cannot_be_referenced_in_a_computed_property_name); } @@ -12687,7 +12691,7 @@ namespace ts { } function getContextualMapper(node: Node) { - node = findAncestor(node, n => n.contextualMapper); + node = findAncestor(node, n => !!n.contextualMapper); return node ? node.contextualMapper : identityMapper; } @@ -19138,14 +19142,17 @@ namespace ts { // - parameter is wrapped in function-like entity if (findAncestor( n, - current => - isFunctionLike(current.parent) || - // computed property names/initializers in instance property declaration of class like entities - // are executed in constructor and thus deferred - (current.parent.kind === SyntaxKind.PropertyDeclaration && - !(hasModifier(current.parent, ModifierFlags.Static)) && - isClassLike(current.parent.parent)), - n => n === node.initializer)) { + current => { + if (current === node.initializer) { + return "quit"; + } + return isFunctionLike(current.parent) || + // computed property names/initializers in instance property declaration of class like entities + // are executed in constructor and thus deferred + (current.parent.kind === SyntaxKind.PropertyDeclaration && + !(hasModifier(current.parent, ModifierFlags.Static)) && + isClassLike(current.parent.parent)); + })) { return; } // fall through to report error @@ -19946,13 +19953,15 @@ namespace ts { if (!checkGrammarStatementInAmbientContext(node)) { findAncestor(node.parent, current => { + if (isFunctionLike(current)) { + return "quit"; + } if (current.kind === SyntaxKind.LabeledStatement && (current).label.text === node.label.text) { const sourceFile = getSourceFileOfNode(node); grammarErrorOnNode(node.label, Diagnostics.Duplicate_label_0, getTextOfNodeFromSourceText(sourceFile.text, node.label)); return true; } - }, - isFunctionLike); + }); } // ensure that label is unique diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 603c6a5a65e..3c867024485 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -224,29 +224,26 @@ namespace ts { } return undefined; } - /** * Iterates through the parent chain of a node and performs the callback on each parent until the callback * returns a truthy value, then returns that value. - * If no such value is found, it applies the callback until the parent pointer is undefined or 'done' returns true + * If no such value is found, it applies the callback until the parent pointer is undefined or the callback returns "quit" * At that point findAncestor returns undefined. */ - export function findAncestor(node: Node, callback: (element: Node) => T | undefined, done?: (element: Node) => boolean): Node { - if (node) { - while (node) { - if (done && done(node)) { - break; - } - if (callback(node)) { - return node; - } - node = node.parent; + export function findAncestor(node: Node, callback: (element: Node) => boolean | "quit"): Node { + while (node) { + const result = callback(node); + if (result === "quit") { + return undefined; } + else if (result) { + return node; + } + node = node.parent; } return undefined; } - export function zipWith(arrayA: T[], arrayB: U[], callback: (a: T, b: U, index: number) => void): void { Debug.assert(arrayA.length === arrayB.length); for (let i = 0; i < arrayA.length; i++) { From adefdc79538d171435ddb8a37f5a543556803495 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Tue, 18 Apr 2017 14:56:11 -0700 Subject: [PATCH 32/33] Unknown properties are assignable to Object unions For the last week or so they have been treated as excess properties when assigning to a union type containing Object, but not when assigning directly to Object type. --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 353356c208b..c0e3c490831 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8708,7 +8708,7 @@ namespace ts { if (maybeTypeOfKind(target, TypeFlags.Object) && !(getObjectFlags(target) & ObjectFlags.ObjectLiteralPatternWithComputedProperties)) { const isComparingJsxAttributes = !!(source.flags & TypeFlags.JsxAttributes); if ((relation === assignableRelation || relation === comparableRelation) && - (target === globalObjectType || (!isComparingJsxAttributes && isEmptyObjectType(target)))) { + (isTypeSubsetOf(globalObjectType, target) || (!isComparingJsxAttributes && isEmptyObjectType(target)))) { return false; } for (const prop of getPropertiesOfObjectType(source)) { From 8ab22217c133abb805cd4df18b9e5848766e9582 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Tue, 18 Apr 2017 14:58:27 -0700 Subject: [PATCH 33/33] Test:Unknown properties are assignable to Object in union Add test and accept baselines --- ...unknownPropertiesAreAssignableToObjectUnion.js | 8 ++++++++ ...wnPropertiesAreAssignableToObjectUnion.symbols | 11 +++++++++++ ...nownPropertiesAreAssignableToObjectUnion.types | 15 +++++++++++++++ ...unknownPropertiesAreAssignableToObjectUnion.ts | 3 +++ 4 files changed, 37 insertions(+) create mode 100644 tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.js create mode 100644 tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.symbols create mode 100644 tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.types create mode 100644 tests/cases/compiler/unknownPropertiesAreAssignableToObjectUnion.ts diff --git a/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.js b/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.js new file mode 100644 index 00000000000..7140f13cb7b --- /dev/null +++ b/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.js @@ -0,0 +1,8 @@ +//// [unknownPropertiesAreAssignableToObjectUnion.ts] +const x: Object | string = { x: 0 }; +const y: Object | undefined = { x: 0 }; + + +//// [unknownPropertiesAreAssignableToObjectUnion.js] +var x = { x: 0 }; +var y = { x: 0 }; diff --git a/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.symbols b/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.symbols new file mode 100644 index 00000000000..f9c0b09c987 --- /dev/null +++ b/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.symbols @@ -0,0 +1,11 @@ +=== tests/cases/compiler/unknownPropertiesAreAssignableToObjectUnion.ts === +const x: Object | string = { x: 0 }; +>x : Symbol(x, Decl(unknownPropertiesAreAssignableToObjectUnion.ts, 0, 5)) +>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(unknownPropertiesAreAssignableToObjectUnion.ts, 0, 28)) + +const y: Object | undefined = { x: 0 }; +>y : Symbol(y, Decl(unknownPropertiesAreAssignableToObjectUnion.ts, 1, 5)) +>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(unknownPropertiesAreAssignableToObjectUnion.ts, 1, 31)) + diff --git a/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.types b/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.types new file mode 100644 index 00000000000..d242cb8805c --- /dev/null +++ b/tests/baselines/reference/unknownPropertiesAreAssignableToObjectUnion.types @@ -0,0 +1,15 @@ +=== tests/cases/compiler/unknownPropertiesAreAssignableToObjectUnion.ts === +const x: Object | string = { x: 0 }; +>x : string | Object +>Object : Object +>{ x: 0 } : { x: number; } +>x : number +>0 : 0 + +const y: Object | undefined = { x: 0 }; +>y : Object | undefined +>Object : Object +>{ x: 0 } : { x: number; } +>x : number +>0 : 0 + diff --git a/tests/cases/compiler/unknownPropertiesAreAssignableToObjectUnion.ts b/tests/cases/compiler/unknownPropertiesAreAssignableToObjectUnion.ts new file mode 100644 index 00000000000..eb4209509de --- /dev/null +++ b/tests/cases/compiler/unknownPropertiesAreAssignableToObjectUnion.ts @@ -0,0 +1,3 @@ +// @strictNullChecks: true +const x: Object | string = { x: 0 }; +const y: Object | undefined = { x: 0 };