From 245809a746828dc925335d71de70dcd538d89fc0 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Wed, 24 Jun 2020 00:41:20 +0000 Subject: [PATCH 1/2] Cherry-pick PR #39216 into release-4.0 Component commits: 6298d84460 Leverage syntax cursor as part of reparse --- src/compiler/binder.ts | 39 ++- src/compiler/checker.ts | 27 +- src/compiler/parser.ts | 315 +++++++++--------- src/compiler/utilities.ts | 19 +- src/compiler/visitorPublic.ts | 2 + .../FunctionDeclaration10_es6.errors.txt | 17 +- .../reference/FunctionDeclaration10_es6.js | 4 +- .../FunctionDeclaration10_es6.symbols | 1 + .../reference/FunctionDeclaration10_es6.types | 2 +- .../FunctionDeclaration12_es6.errors.txt | 12 +- .../reference/FunctionDeclaration12_es6.js | 3 +- .../FunctionDeclaration12_es6.symbols | 2 +- .../reference/FunctionDeclaration12_es6.types | 7 +- .../FunctionDeclaration5_es6.errors.txt | 12 +- .../reference/FunctionDeclaration5_es6.js | 4 +- .../FunctionDeclaration5_es6.symbols | 1 + .../reference/FunctionDeclaration5_es6.types | 2 +- .../asyncArrowFunction5_es2017.errors.txt | 22 +- .../reference/asyncArrowFunction5_es2017.js | 6 +- .../asyncArrowFunction5_es2017.symbols | 3 +- .../asyncArrowFunction5_es2017.types | 8 +- .../asyncArrowFunction5_es5.errors.txt | 22 +- .../reference/asyncArrowFunction5_es5.js | 10 +- .../reference/asyncArrowFunction5_es5.symbols | 3 +- .../reference/asyncArrowFunction5_es5.types | 8 +- .../asyncArrowFunction5_es6.errors.txt | 22 +- .../reference/asyncArrowFunction5_es6.js | 6 +- .../reference/asyncArrowFunction5_es6.symbols | 3 +- .../reference/asyncArrowFunction5_es6.types | 8 +- ...yncFunctionDeclaration10_es2017.errors.txt | 32 +- .../asyncFunctionDeclaration10_es2017.js | 5 +- .../asyncFunctionDeclaration10_es2017.symbols | 1 + .../asyncFunctionDeclaration10_es2017.types | 8 +- .../asyncFunctionDeclaration10_es5.errors.txt | 32 +- .../asyncFunctionDeclaration10_es5.js | 12 +- .../asyncFunctionDeclaration10_es5.symbols | 1 + .../asyncFunctionDeclaration10_es5.types | 8 +- .../asyncFunctionDeclaration10_es6.errors.txt | 32 +- .../asyncFunctionDeclaration10_es6.js | 7 +- .../asyncFunctionDeclaration10_es6.symbols | 1 + .../asyncFunctionDeclaration10_es6.types | 8 +- ...yncFunctionDeclaration12_es2017.errors.txt | 15 +- .../asyncFunctionDeclaration12_es2017.js | 3 +- .../asyncFunctionDeclaration12_es2017.symbols | 2 +- .../asyncFunctionDeclaration12_es2017.types | 7 +- .../asyncFunctionDeclaration12_es5.errors.txt | 15 +- .../asyncFunctionDeclaration12_es5.js | 5 +- .../asyncFunctionDeclaration12_es5.symbols | 2 +- .../asyncFunctionDeclaration12_es5.types | 7 +- .../asyncFunctionDeclaration12_es6.errors.txt | 15 +- .../asyncFunctionDeclaration12_es6.js | 5 +- .../asyncFunctionDeclaration12_es6.symbols | 2 +- .../asyncFunctionDeclaration12_es6.types | 7 +- ...syncFunctionDeclaration5_es2017.errors.txt | 27 +- .../asyncFunctionDeclaration5_es2017.js | 5 +- .../asyncFunctionDeclaration5_es2017.symbols | 1 + .../asyncFunctionDeclaration5_es2017.types | 8 +- .../asyncFunctionDeclaration5_es5.errors.txt | 27 +- .../asyncFunctionDeclaration5_es5.js | 12 +- .../asyncFunctionDeclaration5_es5.symbols | 1 + .../asyncFunctionDeclaration5_es5.types | 8 +- .../asyncFunctionDeclaration5_es6.errors.txt | 27 +- .../asyncFunctionDeclaration5_es6.js | 7 +- .../asyncFunctionDeclaration5_es6.symbols | 1 + .../asyncFunctionDeclaration5_es6.types | 8 +- ...cGenerators.classMethods.es2018.errors.txt | 72 +--- ...syncGenerators.classMethods.es2018.symbols | 8 +- ....asyncGenerators.classMethods.es2018.types | 32 +- ...ors.functionDeclarations.es2018.errors.txt | 57 +--- ...rators.functionDeclarations.es2018.symbols | 10 +- ...nerators.functionDeclarations.es2018.types | 37 +- ...tors.functionExpressions.es2018.errors.txt | 104 ++---- ...erators.functionExpressions.es2018.symbols | 18 +- ...enerators.functionExpressions.es2018.types | 54 ++- ...ors.objectLiteralMethods.es2018.errors.txt | 78 +---- ...rators.objectLiteralMethods.es2018.symbols | 6 +- ...nerators.objectLiteralMethods.es2018.types | 48 ++- ....1(module=esnext,target=es2015).errors.txt | 13 + ...velAwait.1(module=esnext,target=es2015).js | 20 ++ ...ait.1(module=esnext,target=es2015).symbols | 15 + ...Await.1(module=esnext,target=es2015).types | 23 ++ ...velAwait.1(module=esnext,target=es2017).js | 20 ++ ...ait.1(module=esnext,target=es2017).symbols | 15 + ...Await.1(module=esnext,target=es2017).types | 23 ++ ....1(module=system,target=es2015).errors.txt | 13 + ...velAwait.1(module=system,target=es2015).js | 22 +- ...ait.1(module=system,target=es2015).symbols | 15 + ...Await.1(module=system,target=es2015).types | 23 ++ ...velAwait.1(module=system,target=es2017).js | 22 +- ...ait.1(module=system,target=es2017).symbols | 15 + ...Await.1(module=system,target=es2017).types | 23 ++ .../topLevelAwaitErrors.1.errors.txt | 14 +- .../reference/topLevelAwaitErrors.1.js | 6 +- .../reference/topLevelAwaitErrors.1.types | 8 +- .../externalModules/topLevelAwait.1.ts | 13 + 95 files changed, 815 insertions(+), 966 deletions(-) diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 7549759138967..ad35852c22865 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -2109,20 +2109,39 @@ namespace ts { } // The binder visits every node in the syntax tree so it is a convenient place to perform a single localized - // check for reserved words used as identifiers in strict mode code. - function checkStrictModeIdentifier(node: Identifier) { - if (inStrictMode && - node.originalKeywordKind! >= SyntaxKind.FirstFutureReservedWord && - node.originalKeywordKind! <= SyntaxKind.LastFutureReservedWord && - !isIdentifierName(node) && + // check for reserved words used as identifiers in strict mode code, as well as `yield` or `await` in + // [Yield] or [Await] contexts, respectively. + function checkContextualIdentifier(node: Identifier) { + // Report error only if there are no parse errors in file + if (!file.parseDiagnostics.length && !(node.flags & NodeFlags.Ambient) && - !(node.flags & NodeFlags.JSDoc)) { + !(node.flags & NodeFlags.JSDoc) && + !isIdentifierName(node)) { - // Report error only if there are no parse errors in file - if (!file.parseDiagnostics.length) { + // strict mode identifiers + if (inStrictMode && + node.originalKeywordKind! >= SyntaxKind.FirstFutureReservedWord && + node.originalKeywordKind! <= SyntaxKind.LastFutureReservedWord) { file.bindDiagnostics.push(createDiagnosticForNode(node, getStrictModeIdentifierMessage(node), declarationNameToString(node))); } + else if (node.originalKeywordKind === SyntaxKind.AwaitKeyword) { + if (isExternalModule(file) && isInTopLevelContext(node)) { + file.bindDiagnostics.push(createDiagnosticForNode(node, + Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, + declarationNameToString(node))); + } + else if (node.flags & NodeFlags.AwaitContext) { + file.bindDiagnostics.push(createDiagnosticForNode(node, + Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, + declarationNameToString(node))); + } + } + else if (node.originalKeywordKind === SyntaxKind.YieldKeyword && node.flags & NodeFlags.YieldContext) { + file.bindDiagnostics.push(createDiagnosticForNode(node, + Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, + declarationNameToString(node))); + } } } @@ -2423,7 +2442,7 @@ namespace ts { if (currentFlow && (isExpression(node) || parent.kind === SyntaxKind.ShorthandPropertyAssignment)) { node.flowNode = currentFlow; } - return checkStrictModeIdentifier(node); + return checkContextualIdentifier(node); case SyntaxKind.SuperKeyword: node.flowNode = currentFlow; break; diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 61fa4d1c69e2f..ba234e4981bef 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -28557,11 +28557,6 @@ namespace ts { return undefinedWideningType; } - function isInTopLevelContext(node: Node) { - const container = getThisContainer(node, /*includeArrowFunctions*/ true); - return isSourceFile(container); - } - function checkAwaitExpression(node: AwaitExpression): Type { // Grammar checking if (produceDiagnostics) { @@ -35168,7 +35163,6 @@ namespace ts { } function checkImportBinding(node: ImportEqualsDeclaration | ImportClause | NamespaceImport | ImportSpecifier) { - checkGrammarAwaitIdentifier(node.name); checkCollisionWithRequireExportsInGeneratedCode(node, node.name!); checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name!); checkAliasSymbol(node); @@ -37934,22 +37928,11 @@ namespace ts { return false; } - function checkGrammarAwaitIdentifier(name: Identifier | undefined): boolean { - if (name && isIdentifier(name) && name.originalKeywordKind === SyntaxKind.AwaitKeyword && isInTopLevelContext(name.parent)) { - const file = getSourceFileOfNode(name); - if (!file.isDeclarationFile && isExternalModule(file)) { - return grammarErrorOnNode(name, Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, idText(name)); - } - } - return false; - } - function checkGrammarFunctionLikeDeclaration(node: FunctionLikeDeclaration | MethodSignature): boolean { // Prevent cascading error by short-circuit const file = getSourceFileOfNode(node); return checkGrammarDecoratorsAndModifiers(node) || checkGrammarTypeParameterList(node.typeParameters, file) || - (isFunctionDeclaration(node) && checkGrammarAwaitIdentifier(node.name)) || checkGrammarParameterList(node.parameters) || checkGrammarArrowFunction(node, file) || (isFunctionLikeDeclaration(node) && checkGrammarForUseStrictSimpleParameterList(node)); @@ -37957,8 +37940,7 @@ namespace ts { function checkGrammarClassLikeDeclaration(node: ClassLikeDeclaration): boolean { const file = getSourceFileOfNode(node); - return (isClassDeclaration(node) && checkGrammarAwaitIdentifier(node.name)) || - checkGrammarClassDeclarationHeritageClauses(node) || + return checkGrammarClassDeclarationHeritageClauses(node) || checkGrammarTypeParameterList(node.typeParameters, file); } @@ -38601,10 +38583,6 @@ namespace ts { } } - if (isIdentifier(node.name) && checkGrammarAwaitIdentifier(node.name)) { - return true; - } - if (node.dotDotDotToken && node.initializer) { // Error on equals token which immediately precedes the initializer return grammarErrorAtPos(node, node.initializer.pos - 1, 1, Diagnostics.A_rest_element_cannot_have_an_initializer); @@ -38668,9 +38646,6 @@ namespace ts { } } } - if (isIdentifier(node.name) && checkGrammarAwaitIdentifier(node.name)) { - return true; - } if (node.exclamationToken && (node.parent.parent.kind !== SyntaxKind.VariableStatement || !node.type || node.initializer || node.flags & NodeFlags.Ambient)) { return grammarErrorOnNode(node.exclamationToken, Diagnostics.Definite_assignment_assertions_can_only_be_used_along_with_a_type_annotation); diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 2cf85a563f5b2..ff50656a68ca5 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -710,33 +710,6 @@ namespace ts { const factory = createNodeFactory(NodeFactoryFlags.NoParenthesizerRules | NodeFactoryFlags.NoNodeConverters | NodeFactoryFlags.NoOriginalNode, baseNodeFactory); - const reparseContext: TransformationContext = { - get factory() { return factory; }, - enableEmitNotification: notImplemented, - enableSubstitution: notImplemented, - endLexicalEnvironment: returnUndefined, - getCompilerOptions: notImplemented, - getEmitHost: notImplemented, - getEmitResolver: notImplemented, - getEmitHelperFactory: notImplemented, - setLexicalEnvironmentFlags: noop, - getLexicalEnvironmentFlags: () => 0, - hoistFunctionDeclaration: notImplemented, - hoistVariableDeclaration: notImplemented, - addInitializationStatement: notImplemented, - isEmitNotificationEnabled: notImplemented, - isSubstitutionEnabled: notImplemented, - onEmitNode: notImplemented, - onSubstituteNode: notImplemented, - readEmitHelpers: notImplemented, - requestEmitHelper: notImplemented, - resumeLexicalEnvironment: noop, - startLexicalEnvironment: noop, - suspendLexicalEnvironment: noop, - addDiagnostic: notImplemented, - }; - - let fileName: string; let sourceFlags: NodeFlags; let sourceText: string; @@ -805,6 +778,9 @@ namespace ts { // descent parsing and unwinding. let contextFlags: NodeFlags; + // Indicates whether we are currently parsing top-level statements. + let topLevel = true; + // Whether or not we've had a parse error since creating the last AST node. If we have // encountered an error, it will be stored on the next AST node we create. Parse errors // can be broken down into three categories: @@ -958,6 +934,7 @@ namespace ts { identifierCount = 0; nodeCount = 0; sourceFlags = 0; + topLevel = true; switch (scriptKind) { case ScriptKind.JS: @@ -998,6 +975,7 @@ namespace ts { parsingContext = 0; identifiers = undefined!; notParenthesizedArrow = undefined!; + topLevel = true; } function parseSourceFileWorker(languageVersion: ScriptTarget, setParentNodes: boolean, scriptKind: ScriptKind): SourceFile { @@ -1058,130 +1036,112 @@ namespace ts { } function reparseTopLevelAwait(sourceFile: SourceFile) { - return visitEachChild(sourceFile, visitor, reparseContext); - - function visitor(node: Node): VisitResult { - if (!(node.transformFlags & TransformFlags.ContainsPossibleTopLevelAwait)) { - return node; - } - // We explicitly visit each non-Expression node that has an immediate Expression child so that - // we can reparse the Expression in an Await context - switch (node.kind) { - case SyntaxKind.Decorator: return reparseDecorator(node as Decorator); - case SyntaxKind.ComputedPropertyName: return reparseComputedPropertyName(node as ComputedPropertyName); - case SyntaxKind.ExpressionWithTypeArguments: return reparseExpressionWithTypeArguments(node as ExpressionWithTypeArguments); - case SyntaxKind.ExpressionStatement: return reparseExpressionStatement(node as ExpressionStatement); - case SyntaxKind.IfStatement: return reparseIfStatement(node as IfStatement); - case SyntaxKind.SwitchStatement: return reparseSwitchStatement(node as SwitchStatement); - case SyntaxKind.WithStatement: return reparseWithStatement(node as WithStatement); - case SyntaxKind.DoStatement: return reparseDoStatement(node as DoStatement); - case SyntaxKind.WhileStatement: return reparseWhileStatement(node as WhileStatement); - case SyntaxKind.ForStatement: return reparseForStatement(node as ForStatement); - case SyntaxKind.ForInStatement: return reparseForInStatement(node as ForInStatement); - case SyntaxKind.ForOfStatement: return reparseForOfStatement(node as ForOfStatement); - case SyntaxKind.ReturnStatement: return reparseReturnStatement(node as ReturnStatement); - case SyntaxKind.ThrowStatement: return reparseThrowStatement(node as ThrowStatement); - case SyntaxKind.ExportAssignment: return reparseExportAssignment(node as ExportAssignment); - case SyntaxKind.VariableDeclaration: return reparseVariableDeclaration(node as VariableDeclaration); - case SyntaxKind.BindingElement: return reparseBindingElement(node as BindingElement); - default: return visitEachChild(node, visitor, reparseContext); - } - } - - function reparse(node: T, parse: () => T): T | Expression; - function reparse(node: T | undefined, parse: () => T): T | Expression | undefined; - function reparse(node: T | undefined, parse: () => T) { - if (node && node.transformFlags & TransformFlags.ContainsPossibleTopLevelAwait) { - if (isExpression(node)) { - return speculationHelper(() => { - scanner.setTextPos(node.pos); - const savedContextFlags = contextFlags; - contextFlags = node.flags & NodeFlags.ContextFlags; - nextToken(); - const result = doInAwaitContext(parse); - contextFlags = savedContextFlags; - return result; - }, SpeculationKind.Reparse); - } - return visitEachChild(node, visitor, reparseContext); - } - return node; - } - - function update(updated: T, original: T) { - if (updated !== original) { - setNodeFlags(updated, updated.flags | NodeFlags.AwaitContext); - } - return updated; - } - - function reparseExpressionStatement(node: ExpressionStatement) { - return update(factory.updateExpressionStatement(node, reparse(node.expression, parseExpression)), node); - } + const savedSyntaxCursor = syntaxCursor; + const baseSyntaxCursor = IncrementalParser.createSyntaxCursor(sourceFile); + syntaxCursor = { currentNode }; - function reparseReturnStatement(node: ReturnStatement) { - return update(factory.updateReturnStatement(node, reparse(node.expression, parseExpression)), node); - } + const statements: Statement[] = []; + const savedParseDiagnostics = parseDiagnostics; - function reparseThrowStatement(node: ThrowStatement) { - return update(factory.updateThrowStatement(node, reparse(node.expression, parseExpression)), node); - } - - function reparseIfStatement(node: IfStatement) { - return update(factory.updateIfStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.thenStatement, visitor), ts.visitNode(node.elseStatement, visitor)), node); - } + parseDiagnostics = []; - function reparseSwitchStatement(node: SwitchStatement) { - return update(factory.updateSwitchStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.caseBlock, visitor)), node); - } + let pos = 0; + let start = findNextStatementWithAwait(sourceFile.statements, 0); + while (start !== -1) { + // append all statements between pos and start + const prevStatement = sourceFile.statements[pos]; + const nextStatement = sourceFile.statements[start]; + addRange(statements, sourceFile.statements, pos, start); + pos = findNextStatementWithoutAwait(sourceFile.statements, start); + + // append all diagnostics associated with the copied range + const diagnosticStart = findIndex(savedParseDiagnostics, diagnostic => diagnostic.start >= prevStatement.pos); + const diagnosticEnd = diagnosticStart >= 0 ? findIndex(savedParseDiagnostics, diagnostic => diagnostic.start >= nextStatement.pos, diagnosticStart) : -1; + if (diagnosticStart >= 0) { + addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart, diagnosticEnd >= 0 ? diagnosticEnd : undefined); + } + + // reparse all statements between start and pos. We skip existing diagnostics for the same range and allow the parser to generate new ones. + speculationHelper(() => { + const savedContextFlags = contextFlags; + contextFlags |= NodeFlags.AwaitContext; + scanner.setTextPos(nextStatement.pos); + nextToken(); - function reparseWithStatement(node: WithStatement) { - return update(factory.updateWithStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } + while (token() !== SyntaxKind.EndOfFileToken) { + const startPos = scanner.getStartPos(); + const statement = parseListElement(ParsingContext.SourceElements, parseStatement); + statements.push(statement); + if (startPos === scanner.getStartPos()) { + nextToken(); + } - function reparseDoStatement(node: DoStatement) { - return update(factory.updateDoStatement(node, ts.visitNode(node.statement, visitor), reparse(node.expression, parseExpression)), node); - } + if (pos >= 0) { + const nonAwaitStatement = sourceFile.statements[pos]; + if (statement.end === nonAwaitStatement.pos) { + // done reparsing this section + break; + } + if (statement.end > nonAwaitStatement.pos) { + // we ate into the next statement, so we must reparse it. + pos = findNextStatementWithoutAwait(sourceFile.statements, pos + 1); + } + } + } - function reparseWhileStatement(node: WhileStatement) { - return update(factory.updateWhileStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } + contextFlags = savedContextFlags; + }, SpeculationKind.Reparse); - function reparseForStatement(node: ForStatement) { - return update(factory.updateForStatement(node, reparse(node.initializer, parseExpression), reparse(node.condition, parseExpression), reparse(node.incrementor, parseExpression), ts.visitNode(node, visitor)), node); + // find the next statement containing an `await` + start = pos >= 0 ? findNextStatementWithAwait(sourceFile.statements, pos) : -1; } - function reparseForInStatement(node: ForInStatement) { - return update(factory.updateForInStatement(node, reparse(node.initializer, parseExpression), reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } + // append all statements between pos and the end of the list + if (pos >= 0) { + const prevStatement = sourceFile.statements[pos]; + addRange(statements, sourceFile.statements, pos); - function reparseForOfStatement(node: ForOfStatement) { - return update(factory.updateForOfStatement(node, node.awaitModifier, reparse(node.initializer, parseExpression), reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); + // append all diagnostics associated with the copied range + const diagnosticStart = findIndex(savedParseDiagnostics, diagnostic => diagnostic.start >= prevStatement.pos); + if (diagnosticStart >= 0) { + addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart); + } } - function reparseExportAssignment(node: ExportAssignment) { - return update(factory.updateExportAssignment(node, ts.visitNodes(node.decorators, visitor), node.modifiers, reparse(node.expression, parseExpression)), node); - } + syntaxCursor = savedSyntaxCursor; + return factory.updateSourceFile(sourceFile, setTextRange(factory.createNodeArray(statements), sourceFile.statements)); - function reparseExpressionWithTypeArguments(node: ExpressionWithTypeArguments) { - return update(factory.updateExpressionWithTypeArguments(node, reparse(node.expression, parseLeftHandSideExpressionOrHigher), node.typeArguments), node); + function containsPossibleTopLevelAwait(node: Node) { + return !(node.flags & NodeFlags.AwaitContext) + && !!(node.transformFlags & TransformFlags.ContainsPossibleTopLevelAwait); } - function reparseDecorator(node: Decorator) { - return update(factory.updateDecorator(node, reparse(node.expression, parseLeftHandSideExpressionOrHigher)), node); + function findNextStatementWithAwait(statements: NodeArray, start: number) { + for (let i = start; i < statements.length; i++) { + if (containsPossibleTopLevelAwait(statements[i])) { + return i; + } + } + return -1; } - function reparseComputedPropertyName(node: ComputedPropertyName) { - return update(factory.updateComputedPropertyName(node, reparse(node.expression, parseExpression)), node); + function findNextStatementWithoutAwait(statements: NodeArray, start: number) { + for (let i = start; i < statements.length; i++) { + if (!containsPossibleTopLevelAwait(statements[i])) { + return i; + } + } + return -1; } - function reparseVariableDeclaration(node: VariableDeclaration) { - return update(factory.updateVariableDeclaration(node, ts.visitNode(node.name, visitor), node.exclamationToken, node.type, reparse(node.initializer, parseExpression)), node); + function currentNode(position: number) { + const node = baseSyntaxCursor.currentNode(position); + if (topLevel && node && containsPossibleTopLevelAwait(node)) { + node.intersectsChange = true; + } + return node; } - function reparseBindingElement(node: BindingElement) { - return update(factory.updateBindingElement(node, node.dotDotDotToken, ts.visitNode(node.propertyName, visitor), ts.visitNode(node.name, visitor), reparse(node.initializer, parseExpression)), node); - } } export function fixupParentReferences(rootNode: Node) { @@ -1487,6 +1447,13 @@ namespace ts { return speculationHelper(callback, SpeculationKind.TryParse); } + function isBindingIdentifier(): boolean { + if (token() === SyntaxKind.Identifier) { + return true; + } + return token() > SyntaxKind.LastReservedWord; + } + // Ignore strict mode flag because we will report an error in type checker instead. function isIdentifier(): boolean { if (token() === SyntaxKind.Identifier) { @@ -1693,6 +1660,10 @@ namespace ts { return createMissingNode(SyntaxKind.Identifier, reportAtCurrentPosition, diagnosticMessage || defaultMessage, msgArg); } + function parseBindingIdentifier(privateIdentifierDiagnosticMessage?: DiagnosticMessage) { + return createIdentifier(isBindingIdentifier(), /*diagnosticMessage*/ undefined, privateIdentifierDiagnosticMessage); + } + function parseIdentifier(diagnosticMessage?: DiagnosticMessage, privateIdentifierDiagnosticMessage?: DiagnosticMessage): Identifier { return createIdentifier(isIdentifier(), diagnosticMessage, privateIdentifierDiagnosticMessage); } @@ -1888,9 +1859,9 @@ namespace ts { return isIdentifier() && !isHeritageClauseExtendsOrImplementsKeyword(); } case ParsingContext.VariableDeclarations: - return isIdentifierOrPrivateIdentifierOrPattern(); + return isBindingIdentifierOrPrivateIdentifierOrPattern(); case ParsingContext.ArrayBindingElements: - return token() === SyntaxKind.CommaToken || token() === SyntaxKind.DotDotDotToken || isIdentifierOrPrivateIdentifierOrPattern(); + return token() === SyntaxKind.CommaToken || token() === SyntaxKind.DotDotDotToken || isBindingIdentifierOrPrivateIdentifierOrPattern(); case ParsingContext.TypeParameters: return isIdentifier(); case ParsingContext.ArrayLiteralMembers: @@ -2893,7 +2864,7 @@ namespace ts { function isStartOfParameter(isJSDocParameter: boolean): boolean { return token() === SyntaxKind.DotDotDotToken || - isIdentifierOrPrivateIdentifierOrPattern() || + isBindingIdentifierOrPrivateIdentifierOrPattern() || isModifierKind(token()) || token() === SyntaxKind.AtToken || isStartOfType(/*inStartOfParameter*/ !isJSDocParameter); @@ -2917,7 +2888,15 @@ namespace ts { return name; } + function parseParameterInOuterAwaitContext() { + return parseParameterWorker(/*inOuterAwaitContext*/ true); + } + function parseParameter(): ParameterDeclaration { + return parseParameterWorker(/*inOuterAwaitContext*/ false); + } + + function parseParameterWorker(inOuterAwaitContext: boolean): ParameterDeclaration { const pos = getNodePos(); const hasJSDoc = hasPrecedingJSDocComment(); if (token() === SyntaxKind.ThisKeyword) { @@ -2935,12 +2914,17 @@ namespace ts { // FormalParameter [Yield,Await]: // BindingElement[?Yield,?Await] - let modifiers; - return withJSDoc( + + // Decorators are parsed in the outer [Await] context, the rest of the parameter is parsed in the function's [Await] context. + const decorators = inOuterAwaitContext ? doInAwaitContext(parseDecorators) : parseDecorators(); + const savedTopLevel = topLevel; + topLevel = false; + const modifiers = parseModifiers(); + const node = withJSDoc( finishNode( factory.createParameterDeclaration( - parseDecorators(), - modifiers = parseModifiers(), + decorators, + modifiers, parseOptionalToken(SyntaxKind.DotDotDotToken), parseNameOfParameter(modifiers), parseOptionalToken(SyntaxKind.QuestionToken), @@ -2951,6 +2935,8 @@ namespace ts { ), hasJSDoc ); + topLevel = savedTopLevel; + return node; } function parseReturnType(returnToken: SyntaxKind.EqualsGreaterThanToken, isType: boolean): TypeNode; @@ -3000,7 +2986,7 @@ namespace ts { const parameters = flags & SignatureFlags.JSDoc ? parseDelimitedList(ParsingContext.JSDocParameters, parseJSDocParameter) : - parseDelimitedList(ParsingContext.Parameters, parseParameter); + parseDelimitedList(ParsingContext.Parameters, savedAwaitContext ? parseParameterInOuterAwaitContext : parseParameter); setYieldContext(savedYieldContext); setAwaitContext(savedAwaitContext); @@ -4268,9 +4254,13 @@ namespace ts { return parseFunctionBlock(SignatureFlags.IgnoreMissingOpenBrace | (isAsync ? SignatureFlags.Await : SignatureFlags.None)); } - return isAsync + const savedTopLevel = topLevel; + topLevel = false; + const node = isAsync ? doInAwaitContext(parseAssignmentExpressionOrHigher) : doOutsideOfAwaitContext(parseAssignmentExpressionOrHigher); + topLevel = savedTopLevel; + return node; } function parseConditionalExpressionRest(leftOperand: Expression, pos: number): Expression { @@ -5390,10 +5380,10 @@ namespace ts { const isGenerator = asteriskToken ? SignatureFlags.Yield : SignatureFlags.None; const isAsync = some(modifiers, isAsyncModifier) ? SignatureFlags.Await : SignatureFlags.None; const name = - isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalIdentifier) : - isGenerator ? doInYieldContext(parseOptionalIdentifier) : - isAsync ? doInAwaitContext(parseOptionalIdentifier) : - parseOptionalIdentifier(); + isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalBindingIdentifier) : + isGenerator ? doInYieldContext(parseOptionalBindingIdentifier) : + isAsync ? doInAwaitContext(parseOptionalBindingIdentifier) : + parseOptionalBindingIdentifier(); const typeParameters = parseTypeParameters(); const parameters = parseParameters(isGenerator | isAsync); @@ -5408,8 +5398,8 @@ namespace ts { return withJSDoc(finishNode(node, pos), hasJSDoc); } - function parseOptionalIdentifier(): Identifier | undefined { - return isIdentifier() ? parseIdentifier() : undefined; + function parseOptionalBindingIdentifier(): Identifier | undefined { + return isBindingIdentifier() ? parseBindingIdentifier() : undefined; } function parseNewExpressionOrNewDotTarget(): NewExpression | MetaProperty { @@ -5476,6 +5466,9 @@ namespace ts { const savedAwaitContext = inAwaitContext(); setAwaitContext(!!(flags & SignatureFlags.Await)); + const savedTopLevel = topLevel; + topLevel = false; + // We may be in a [Decorator] context when parsing a function expression or // arrow function. The body of the function is not in [Decorator] context. const saveDecoratorContext = inDecoratorContext(); @@ -5489,6 +5482,7 @@ namespace ts { setDecoratorContext(/*val*/ true); } + topLevel = savedTopLevel; setYieldContext(savedYieldContext); setAwaitContext(savedAwaitContext); @@ -6108,7 +6102,7 @@ namespace ts { function parseObjectBindingElement(): BindingElement { const pos = getNodePos(); const dotDotDotToken = parseOptionalToken(SyntaxKind.DotDotDotToken); - const tokenIsIdentifier = isIdentifier(); + const tokenIsIdentifier = isBindingIdentifier(); let propertyName: PropertyName | undefined = parsePropertyName(); let name: BindingName; if (tokenIsIdentifier && token() !== SyntaxKind.ColonToken) { @@ -6139,11 +6133,11 @@ namespace ts { return finishNode(factory.createArrayBindingPattern(elements), pos); } - function isIdentifierOrPrivateIdentifierOrPattern() { + function isBindingIdentifierOrPrivateIdentifierOrPattern() { return token() === SyntaxKind.OpenBraceToken || token() === SyntaxKind.OpenBracketToken || token() === SyntaxKind.PrivateIdentifier - || isIdentifier(); + || isBindingIdentifier(); } function parseIdentifierOrPattern(privateIdentifierDiagnosticMessage?: DiagnosticMessage): Identifier | BindingPattern { @@ -6153,7 +6147,7 @@ namespace ts { if (token() === SyntaxKind.OpenBraceToken) { return parseObjectBindingPattern(); } - return parseIdentifier(/*diagnosticMessage*/ undefined, privateIdentifierDiagnosticMessage); + return parseBindingIdentifier(privateIdentifierDiagnosticMessage); } function parseVariableDeclarationAllowExclamation() { @@ -6238,7 +6232,7 @@ namespace ts { parseExpected(SyntaxKind.FunctionKeyword); const asteriskToken = parseOptionalToken(SyntaxKind.AsteriskToken); // We don't parse the name here in await context, instead we will report a grammar error in the checker. - const name = modifierFlags & ModifierFlags.Default ? parseOptionalIdentifier() : parseIdentifier(); + const name = modifierFlags & ModifierFlags.Default ? parseOptionalBindingIdentifier() : parseBindingIdentifier(); const isGenerator = asteriskToken ? SignatureFlags.Yield : SignatureFlags.None; const isAsync = modifierFlags & ModifierFlags.Async ? SignatureFlags.Await : SignatureFlags.None; const typeParameters = parseTypeParameters(); @@ -6429,12 +6423,25 @@ namespace ts { return false; } + function parseDecoratorExpression() { + if (inAwaitContext() && token() === SyntaxKind.AwaitKeyword) { + // `@await` is is disallowed in an [Await] context, but can cause parsing to go off the rails + // This simply parses the missing identifier and moves on. + const pos = getNodePos(); + const awaitExpression = parseIdentifier(Diagnostics.Expression_expected); + nextToken(); + const memberExpression = parseMemberExpressionRest(pos, awaitExpression, /*allowOptionalChain*/ true); + return parseCallExpressionRest(pos, memberExpression); + } + return parseLeftHandSideExpressionOrHigher(); + } + function tryParseDecorator(): Decorator | undefined { const pos = getNodePos(); if (!parseOptional(SyntaxKind.AtToken)) { return undefined; } - const expression = doInDecoratorContext(parseLeftHandSideExpressionOrHigher); + const expression = doInDecoratorContext(parseDecoratorExpression); return finishNode(factory.createDecorator(expression), pos); } @@ -6593,8 +6600,8 @@ namespace ts { // - class expression with omitted name, 'implements' starts heritage clause // - class with name 'implements' // 'isImplementsClause' helps to disambiguate between these two cases - return isIdentifier() && !isImplementsClause() - ? parseIdentifier() + return isBindingIdentifier() && !isImplementsClause() + ? createIdentifier(isBindingIdentifier()) : undefined; } @@ -8538,7 +8545,7 @@ namespace ts { currentNode(position: number): IncrementalNode; } - function createSyntaxCursor(sourceFile: SourceFile): SyntaxCursor { + export function createSyntaxCursor(sourceFile: SourceFile): SyntaxCursor { let currentArray: NodeArray = sourceFile.statements; let currentArrayIndex = 0; diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index b147e79348733..e50dbd7224236 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -1525,6 +1525,15 @@ namespace ts { } } + export function isInTopLevelContext(node: Node) { + // The name of a class or function declaration is a BindingIdentifier in its surrounding scope. + if (isIdentifier(node) && (isClassDeclaration(node.parent) || isFunctionDeclaration(node.parent)) && node.parent.name === node) { + node = node.parent; + } + const container = getThisContainer(node, /*includeArrowFunctions*/ true); + return isSourceFile(container); + } + export function getNewTargetContainer(node: Node) { const container = getThisContainer(node, /*includeArrowFunctions*/ false); if (container) { @@ -2786,7 +2795,7 @@ namespace ts { // Return true if the given identifier is classified as an IdentifierName export function isIdentifierName(node: Identifier): boolean { - let parent = node.parent; + const parent = node.parent; switch (parent.kind) { case SyntaxKind.PropertyDeclaration: case SyntaxKind.PropertySignature: @@ -2801,13 +2810,7 @@ namespace ts { return (parent).name === node; case SyntaxKind.QualifiedName: // Name on right hand side of dot in a type query or type reference - if ((parent).right === node) { - while (parent.kind === SyntaxKind.QualifiedName) { - parent = parent.parent; - } - return parent.kind === SyntaxKind.TypeQuery || parent.kind === SyntaxKind.TypeReference; - } - return false; + return (parent).right === node; case SyntaxKind.BindingElement: case SyntaxKind.ImportSpecifier: // Property name in binding element or import specifier diff --git a/src/compiler/visitorPublic.ts b/src/compiler/visitorPublic.ts index b975b1d0e2bde..b2ec665ce8962 100644 --- a/src/compiler/visitorPublic.ts +++ b/src/compiler/visitorPublic.ts @@ -321,6 +321,8 @@ namespace ts { * @param context A lexical environment context for the visitor. */ export function visitEachChild(node: T, visitor: Visitor, context: TransformationContext): T; + /* @internal */ + export function visitEachChild(node: T, visitor: Visitor, context: TransformationContext, nodesVisitor?: NodesVisitor, tokenVisitor?: Visitor, nodeVisitor?: NodeVisitor): T; // eslint-disable-line @typescript-eslint/unified-signatures /** * Visits each child of a Node using the supplied visitor, possibly returning a new Node of the same kind in its place. * diff --git a/tests/baselines/reference/FunctionDeclaration10_es6.errors.txt b/tests/baselines/reference/FunctionDeclaration10_es6.errors.txt index 6efd10dce099f..9f1e12a48ac65 100644 --- a/tests/baselines/reference/FunctionDeclaration10_es6.errors.txt +++ b/tests/baselines/reference/FunctionDeclaration10_es6.errors.txt @@ -1,20 +1,11 @@ -tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration10_es6.ts(1,16): error TS2371: A parameter initializer is only allowed in a function or constructor implementation. +tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration10_es6.ts(1,20): error TS2523: 'yield' expressions cannot be used in a parameter initializer. tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration10_es6.ts(1,26): error TS1005: ',' expected. -tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration10_es6.ts(1,29): error TS1138: Parameter declaration expected. -tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration10_es6.ts(1,29): error TS2304: Cannot find name 'yield'. -tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration10_es6.ts(1,34): error TS1005: ';' expected. -==== tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration10_es6.ts (5 errors) ==== +==== tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration10_es6.ts (2 errors) ==== function * foo(a = yield => yield) { - ~~~~~~~~~ -!!! error TS2371: A parameter initializer is only allowed in a function or constructor implementation. + ~~~~~ +!!! error TS2523: 'yield' expressions cannot be used in a parameter initializer. ~~ !!! error TS1005: ',' expected. - ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~~~~~ -!!! error TS2304: Cannot find name 'yield'. - ~ -!!! error TS1005: ';' expected. } \ No newline at end of file diff --git a/tests/baselines/reference/FunctionDeclaration10_es6.js b/tests/baselines/reference/FunctionDeclaration10_es6.js index aca7c00e58c0a..73eb9bedcdbb8 100644 --- a/tests/baselines/reference/FunctionDeclaration10_es6.js +++ b/tests/baselines/reference/FunctionDeclaration10_es6.js @@ -3,7 +3,5 @@ function * foo(a = yield => yield) { } //// [FunctionDeclaration10_es6.js] -function* foo(a = yield) { } -yield; -{ +function* foo(a = yield, yield) { } diff --git a/tests/baselines/reference/FunctionDeclaration10_es6.symbols b/tests/baselines/reference/FunctionDeclaration10_es6.symbols index 2b1ccb2a6368a..3b6631df8b8d3 100644 --- a/tests/baselines/reference/FunctionDeclaration10_es6.symbols +++ b/tests/baselines/reference/FunctionDeclaration10_es6.symbols @@ -2,4 +2,5 @@ function * foo(a = yield => yield) { >foo : Symbol(foo, Decl(FunctionDeclaration10_es6.ts, 0, 0)) >a : Symbol(a, Decl(FunctionDeclaration10_es6.ts, 0, 15)) +>yield : Symbol(yield, Decl(FunctionDeclaration10_es6.ts, 0, 27)) } diff --git a/tests/baselines/reference/FunctionDeclaration10_es6.types b/tests/baselines/reference/FunctionDeclaration10_es6.types index 2bd25f5a63084..e30b5be2d76ac 100644 --- a/tests/baselines/reference/FunctionDeclaration10_es6.types +++ b/tests/baselines/reference/FunctionDeclaration10_es6.types @@ -1,6 +1,6 @@ === tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration10_es6.ts === function * foo(a = yield => yield) { ->foo : (a?: any) => any +>foo : (a: any, yield: any) => Generator >a : any >yield : any >yield : any diff --git a/tests/baselines/reference/FunctionDeclaration12_es6.errors.txt b/tests/baselines/reference/FunctionDeclaration12_es6.errors.txt index 425536f8781d5..aa3f0f7e39689 100644 --- a/tests/baselines/reference/FunctionDeclaration12_es6.errors.txt +++ b/tests/baselines/reference/FunctionDeclaration12_es6.errors.txt @@ -1,13 +1,7 @@ -tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration12_es6.ts(1,20): error TS1005: '(' expected. -tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration12_es6.ts(1,25): error TS1005: ',' expected. -tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration12_es6.ts(1,28): error TS1005: '=>' expected. +tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration12_es6.ts(1,20): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. -==== tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration12_es6.ts (3 errors) ==== +==== tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration12_es6.ts (1 errors) ==== var v = function * yield() { } ~~~~~ -!!! error TS1005: '(' expected. - ~ -!!! error TS1005: ',' expected. - ~ -!!! error TS1005: '=>' expected. \ No newline at end of file +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. \ No newline at end of file diff --git a/tests/baselines/reference/FunctionDeclaration12_es6.js b/tests/baselines/reference/FunctionDeclaration12_es6.js index d2f490ef5e8d5..c284e42620dd8 100644 --- a/tests/baselines/reference/FunctionDeclaration12_es6.js +++ b/tests/baselines/reference/FunctionDeclaration12_es6.js @@ -2,5 +2,4 @@ var v = function * yield() { } //// [FunctionDeclaration12_es6.js] -var v = function* () { }, yield; -() => { }; +var v = function* yield() { }; diff --git a/tests/baselines/reference/FunctionDeclaration12_es6.symbols b/tests/baselines/reference/FunctionDeclaration12_es6.symbols index d2bdccc179e42..2bb80a2cd5d89 100644 --- a/tests/baselines/reference/FunctionDeclaration12_es6.symbols +++ b/tests/baselines/reference/FunctionDeclaration12_es6.symbols @@ -1,5 +1,5 @@ === tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration12_es6.ts === var v = function * yield() { } >v : Symbol(v, Decl(FunctionDeclaration12_es6.ts, 0, 3)) ->yield : Symbol(yield, Decl(FunctionDeclaration12_es6.ts, 0, 18)) +>yield : Symbol(yield, Decl(FunctionDeclaration12_es6.ts, 0, 7)) diff --git a/tests/baselines/reference/FunctionDeclaration12_es6.types b/tests/baselines/reference/FunctionDeclaration12_es6.types index 336bde7a9472e..307b391bdb97c 100644 --- a/tests/baselines/reference/FunctionDeclaration12_es6.types +++ b/tests/baselines/reference/FunctionDeclaration12_es6.types @@ -1,7 +1,6 @@ === tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration12_es6.ts === var v = function * yield() { } ->v : () => any ->function * : () => any ->yield : any ->() { } : () => void +>v : () => Generator +>function * yield() { } : () => Generator +>yield : () => Generator diff --git a/tests/baselines/reference/FunctionDeclaration5_es6.errors.txt b/tests/baselines/reference/FunctionDeclaration5_es6.errors.txt index c68a6cb205791..1c13fcfd7d53b 100644 --- a/tests/baselines/reference/FunctionDeclaration5_es6.errors.txt +++ b/tests/baselines/reference/FunctionDeclaration5_es6.errors.txt @@ -1,14 +1,8 @@ -tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration5_es6.ts(1,14): error TS1138: Parameter declaration expected. -tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration5_es6.ts(1,14): error TS2304: Cannot find name 'yield'. -tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration5_es6.ts(1,19): error TS1005: ';' expected. +tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration5_es6.ts(1,14): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. -==== tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration5_es6.ts (3 errors) ==== +==== tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration5_es6.ts (1 errors) ==== function*foo(yield) { ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~~~~~ -!!! error TS2304: Cannot find name 'yield'. - ~ -!!! error TS1005: ';' expected. +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. } \ No newline at end of file diff --git a/tests/baselines/reference/FunctionDeclaration5_es6.js b/tests/baselines/reference/FunctionDeclaration5_es6.js index 645ee976ecd96..22f1ff7030d49 100644 --- a/tests/baselines/reference/FunctionDeclaration5_es6.js +++ b/tests/baselines/reference/FunctionDeclaration5_es6.js @@ -3,7 +3,5 @@ function*foo(yield) { } //// [FunctionDeclaration5_es6.js] -function* foo() { } -yield; -{ +function* foo(yield) { } diff --git a/tests/baselines/reference/FunctionDeclaration5_es6.symbols b/tests/baselines/reference/FunctionDeclaration5_es6.symbols index 67732f518e5c4..33e9f437fdf85 100644 --- a/tests/baselines/reference/FunctionDeclaration5_es6.symbols +++ b/tests/baselines/reference/FunctionDeclaration5_es6.symbols @@ -1,4 +1,5 @@ === tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration5_es6.ts === function*foo(yield) { >foo : Symbol(foo, Decl(FunctionDeclaration5_es6.ts, 0, 0)) +>yield : Symbol(yield, Decl(FunctionDeclaration5_es6.ts, 0, 13)) } diff --git a/tests/baselines/reference/FunctionDeclaration5_es6.types b/tests/baselines/reference/FunctionDeclaration5_es6.types index 9478988e7eaa7..beaee0c50d52a 100644 --- a/tests/baselines/reference/FunctionDeclaration5_es6.types +++ b/tests/baselines/reference/FunctionDeclaration5_es6.types @@ -1,5 +1,5 @@ === tests/cases/conformance/es6/functionDeclarations/FunctionDeclaration5_es6.ts === function*foo(yield) { ->foo : () => any +>foo : (yield: any) => Generator >yield : any } diff --git a/tests/baselines/reference/asyncArrowFunction5_es2017.errors.txt b/tests/baselines/reference/asyncArrowFunction5_es2017.errors.txt index ae57468b89407..670669495cbbe 100644 --- a/tests/baselines/reference/asyncArrowFunction5_es2017.errors.txt +++ b/tests/baselines/reference/asyncArrowFunction5_es2017.errors.txt @@ -1,24 +1,8 @@ -tests/cases/conformance/async/es2017/asyncArrowFunction/asyncArrowFunction5_es2017.ts(1,11): error TS2304: Cannot find name 'async'. -tests/cases/conformance/async/es2017/asyncArrowFunction/asyncArrowFunction5_es2017.ts(1,18): error TS2304: Cannot find name 'await'. -tests/cases/conformance/async/es2017/asyncArrowFunction/asyncArrowFunction5_es2017.ts(1,24): error TS1005: ',' expected. -tests/cases/conformance/async/es2017/asyncArrowFunction/asyncArrowFunction5_es2017.ts(1,26): error TS2403: Subsequent variable declarations must have the same type. Variable 'Promise' must be of type 'PromiseConstructor', but here has type 'any'. -tests/cases/conformance/async/es2017/asyncArrowFunction/asyncArrowFunction5_es2017.ts(1,33): error TS1005: ',' expected. -tests/cases/conformance/async/es2017/asyncArrowFunction/asyncArrowFunction5_es2017.ts(1,40): error TS1109: Expression expected. +tests/cases/conformance/async/es2017/asyncArrowFunction/asyncArrowFunction5_es2017.ts(1,18): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. -==== tests/cases/conformance/async/es2017/asyncArrowFunction/asyncArrowFunction5_es2017.ts (6 errors) ==== +==== tests/cases/conformance/async/es2017/asyncArrowFunction/asyncArrowFunction5_es2017.ts (1 errors) ==== var foo = async (await): Promise => { - ~~~~~ -!!! error TS2304: Cannot find name 'async'. ~~~~~ -!!! error TS2304: Cannot find name 'await'. - ~ -!!! error TS1005: ',' expected. - ~~~~~~~ -!!! error TS2403: Subsequent variable declarations must have the same type. Variable 'Promise' must be of type 'PromiseConstructor', but here has type 'any'. -!!! related TS6203 /.ts/lib.es2015.promise.d.ts:150:13: 'Promise' was also declared here. - ~ -!!! error TS1005: ',' expected. - ~~ -!!! error TS1109: Expression expected. +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. } \ No newline at end of file diff --git a/tests/baselines/reference/asyncArrowFunction5_es2017.js b/tests/baselines/reference/asyncArrowFunction5_es2017.js index c3ce23ad103a4..04beb16cd74d7 100644 --- a/tests/baselines/reference/asyncArrowFunction5_es2017.js +++ b/tests/baselines/reference/asyncArrowFunction5_es2017.js @@ -3,7 +3,5 @@ var foo = async (await): Promise => { } //// [asyncArrowFunction5_es2017.js] -var foo = async(await), Promise; -; -{ -} +var foo = async (await) => { +}; diff --git a/tests/baselines/reference/asyncArrowFunction5_es2017.symbols b/tests/baselines/reference/asyncArrowFunction5_es2017.symbols index af04f643524e9..b7d25bf2c3cff 100644 --- a/tests/baselines/reference/asyncArrowFunction5_es2017.symbols +++ b/tests/baselines/reference/asyncArrowFunction5_es2017.symbols @@ -1,5 +1,6 @@ === tests/cases/conformance/async/es2017/asyncArrowFunction/asyncArrowFunction5_es2017.ts === var foo = async (await): Promise => { >foo : Symbol(foo, Decl(asyncArrowFunction5_es2017.ts, 0, 3)) ->Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(asyncArrowFunction5_es2017.ts, 0, 24)) +>await : Symbol(await, Decl(asyncArrowFunction5_es2017.ts, 0, 17)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) } diff --git a/tests/baselines/reference/asyncArrowFunction5_es2017.types b/tests/baselines/reference/asyncArrowFunction5_es2017.types index 95cebf9afba37..0e5eb0875594a 100644 --- a/tests/baselines/reference/asyncArrowFunction5_es2017.types +++ b/tests/baselines/reference/asyncArrowFunction5_es2017.types @@ -1,10 +1,6 @@ === tests/cases/conformance/async/es2017/asyncArrowFunction/asyncArrowFunction5_es2017.ts === var foo = async (await): Promise => { ->foo : any ->async (await) : any ->async : any +>foo : (await: any) => Promise +>async (await): Promise => {} : (await: any) => Promise >await : any ->Promise : PromiseConstructor -> : void -> : any } diff --git a/tests/baselines/reference/asyncArrowFunction5_es5.errors.txt b/tests/baselines/reference/asyncArrowFunction5_es5.errors.txt index ff87906ead394..46dae75c2cea4 100644 --- a/tests/baselines/reference/asyncArrowFunction5_es5.errors.txt +++ b/tests/baselines/reference/asyncArrowFunction5_es5.errors.txt @@ -1,24 +1,8 @@ -tests/cases/conformance/async/es5/asyncArrowFunction/asyncArrowFunction5_es5.ts(1,11): error TS2304: Cannot find name 'async'. -tests/cases/conformance/async/es5/asyncArrowFunction/asyncArrowFunction5_es5.ts(1,18): error TS2304: Cannot find name 'await'. -tests/cases/conformance/async/es5/asyncArrowFunction/asyncArrowFunction5_es5.ts(1,24): error TS1005: ',' expected. -tests/cases/conformance/async/es5/asyncArrowFunction/asyncArrowFunction5_es5.ts(1,26): error TS2403: Subsequent variable declarations must have the same type. Variable 'Promise' must be of type 'PromiseConstructor', but here has type 'any'. -tests/cases/conformance/async/es5/asyncArrowFunction/asyncArrowFunction5_es5.ts(1,33): error TS1005: ',' expected. -tests/cases/conformance/async/es5/asyncArrowFunction/asyncArrowFunction5_es5.ts(1,40): error TS1109: Expression expected. +tests/cases/conformance/async/es5/asyncArrowFunction/asyncArrowFunction5_es5.ts(1,18): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. -==== tests/cases/conformance/async/es5/asyncArrowFunction/asyncArrowFunction5_es5.ts (6 errors) ==== +==== tests/cases/conformance/async/es5/asyncArrowFunction/asyncArrowFunction5_es5.ts (1 errors) ==== var foo = async (await): Promise => { - ~~~~~ -!!! error TS2304: Cannot find name 'async'. ~~~~~ -!!! error TS2304: Cannot find name 'await'. - ~ -!!! error TS1005: ',' expected. - ~~~~~~~ -!!! error TS2403: Subsequent variable declarations must have the same type. Variable 'Promise' must be of type 'PromiseConstructor', but here has type 'any'. -!!! related TS6203 /.ts/lib.es2015.promise.d.ts:150:13: 'Promise' was also declared here. - ~ -!!! error TS1005: ',' expected. - ~~ -!!! error TS1109: Expression expected. +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. } \ No newline at end of file diff --git a/tests/baselines/reference/asyncArrowFunction5_es5.js b/tests/baselines/reference/asyncArrowFunction5_es5.js index ac1e880155177..073331f4bbc0e 100644 --- a/tests/baselines/reference/asyncArrowFunction5_es5.js +++ b/tests/baselines/reference/asyncArrowFunction5_es5.js @@ -3,7 +3,9 @@ var foo = async (await): Promise => { } //// [asyncArrowFunction5_es5.js] -var foo = async(await), Promise; -; -{ -} +var _this = this; +var foo = function (await) { return __awaiter(_this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/]; + }); +}); }; diff --git a/tests/baselines/reference/asyncArrowFunction5_es5.symbols b/tests/baselines/reference/asyncArrowFunction5_es5.symbols index b1b10c12afefc..757a80c283c3a 100644 --- a/tests/baselines/reference/asyncArrowFunction5_es5.symbols +++ b/tests/baselines/reference/asyncArrowFunction5_es5.symbols @@ -1,5 +1,6 @@ === tests/cases/conformance/async/es5/asyncArrowFunction/asyncArrowFunction5_es5.ts === var foo = async (await): Promise => { >foo : Symbol(foo, Decl(asyncArrowFunction5_es5.ts, 0, 3)) ->Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(asyncArrowFunction5_es5.ts, 0, 24)) +>await : Symbol(await, Decl(asyncArrowFunction5_es5.ts, 0, 17)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) } diff --git a/tests/baselines/reference/asyncArrowFunction5_es5.types b/tests/baselines/reference/asyncArrowFunction5_es5.types index 93385915415f3..c4bb0f1e21694 100644 --- a/tests/baselines/reference/asyncArrowFunction5_es5.types +++ b/tests/baselines/reference/asyncArrowFunction5_es5.types @@ -1,10 +1,6 @@ === tests/cases/conformance/async/es5/asyncArrowFunction/asyncArrowFunction5_es5.ts === var foo = async (await): Promise => { ->foo : any ->async (await) : any ->async : any +>foo : (await: any) => Promise +>async (await): Promise => {} : (await: any) => Promise >await : any ->Promise : PromiseConstructor -> : void -> : any } diff --git a/tests/baselines/reference/asyncArrowFunction5_es6.errors.txt b/tests/baselines/reference/asyncArrowFunction5_es6.errors.txt index b10782f083767..f46b7cf418d3a 100644 --- a/tests/baselines/reference/asyncArrowFunction5_es6.errors.txt +++ b/tests/baselines/reference/asyncArrowFunction5_es6.errors.txt @@ -1,24 +1,8 @@ -tests/cases/conformance/async/es6/asyncArrowFunction/asyncArrowFunction5_es6.ts(1,11): error TS2304: Cannot find name 'async'. -tests/cases/conformance/async/es6/asyncArrowFunction/asyncArrowFunction5_es6.ts(1,18): error TS2304: Cannot find name 'await'. -tests/cases/conformance/async/es6/asyncArrowFunction/asyncArrowFunction5_es6.ts(1,24): error TS1005: ',' expected. -tests/cases/conformance/async/es6/asyncArrowFunction/asyncArrowFunction5_es6.ts(1,26): error TS2403: Subsequent variable declarations must have the same type. Variable 'Promise' must be of type 'PromiseConstructor', but here has type 'any'. -tests/cases/conformance/async/es6/asyncArrowFunction/asyncArrowFunction5_es6.ts(1,33): error TS1005: ',' expected. -tests/cases/conformance/async/es6/asyncArrowFunction/asyncArrowFunction5_es6.ts(1,40): error TS1109: Expression expected. +tests/cases/conformance/async/es6/asyncArrowFunction/asyncArrowFunction5_es6.ts(1,18): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. -==== tests/cases/conformance/async/es6/asyncArrowFunction/asyncArrowFunction5_es6.ts (6 errors) ==== +==== tests/cases/conformance/async/es6/asyncArrowFunction/asyncArrowFunction5_es6.ts (1 errors) ==== var foo = async (await): Promise => { - ~~~~~ -!!! error TS2304: Cannot find name 'async'. ~~~~~ -!!! error TS2304: Cannot find name 'await'. - ~ -!!! error TS1005: ',' expected. - ~~~~~~~ -!!! error TS2403: Subsequent variable declarations must have the same type. Variable 'Promise' must be of type 'PromiseConstructor', but here has type 'any'. -!!! related TS6203 /.ts/lib.es2015.promise.d.ts:150:13: 'Promise' was also declared here. - ~ -!!! error TS1005: ',' expected. - ~~ -!!! error TS1109: Expression expected. +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. } \ No newline at end of file diff --git a/tests/baselines/reference/asyncArrowFunction5_es6.js b/tests/baselines/reference/asyncArrowFunction5_es6.js index 170962c6fd514..b9b30a0e49841 100644 --- a/tests/baselines/reference/asyncArrowFunction5_es6.js +++ b/tests/baselines/reference/asyncArrowFunction5_es6.js @@ -3,7 +3,5 @@ var foo = async (await): Promise => { } //// [asyncArrowFunction5_es6.js] -var foo = async(await), Promise; -; -{ -} +var foo = (await) => __awaiter(this, void 0, void 0, function* () { +}); diff --git a/tests/baselines/reference/asyncArrowFunction5_es6.symbols b/tests/baselines/reference/asyncArrowFunction5_es6.symbols index 4a5790195bda5..944fc8453ee9a 100644 --- a/tests/baselines/reference/asyncArrowFunction5_es6.symbols +++ b/tests/baselines/reference/asyncArrowFunction5_es6.symbols @@ -1,5 +1,6 @@ === tests/cases/conformance/async/es6/asyncArrowFunction/asyncArrowFunction5_es6.ts === var foo = async (await): Promise => { >foo : Symbol(foo, Decl(asyncArrowFunction5_es6.ts, 0, 3)) ->Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(asyncArrowFunction5_es6.ts, 0, 24)) +>await : Symbol(await, Decl(asyncArrowFunction5_es6.ts, 0, 17)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) } diff --git a/tests/baselines/reference/asyncArrowFunction5_es6.types b/tests/baselines/reference/asyncArrowFunction5_es6.types index 1fffb0b1dbd59..bc38b89b6ad74 100644 --- a/tests/baselines/reference/asyncArrowFunction5_es6.types +++ b/tests/baselines/reference/asyncArrowFunction5_es6.types @@ -1,10 +1,6 @@ === tests/cases/conformance/async/es6/asyncArrowFunction/asyncArrowFunction5_es6.ts === var foo = async (await): Promise => { ->foo : any ->async (await) : any ->async : any +>foo : (await: any) => Promise +>async (await): Promise => {} : (await: any) => Promise >await : any ->Promise : PromiseConstructor -> : void -> : any } diff --git a/tests/baselines/reference/asyncFunctionDeclaration10_es2017.errors.txt b/tests/baselines/reference/asyncFunctionDeclaration10_es2017.errors.txt index 12f9974484bbc..c6877cc6b6a93 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration10_es2017.errors.txt +++ b/tests/baselines/reference/asyncFunctionDeclaration10_es2017.errors.txt @@ -1,33 +1,11 @@ -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration10_es2017.ts(1,20): error TS2371: A parameter initializer is only allowed in a function or constructor implementation. +tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration10_es2017.ts(1,24): error TS2524: 'await' expressions cannot be used in a parameter initializer. tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration10_es2017.ts(1,30): error TS1109: Expression expected. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration10_es2017.ts(1,33): error TS1138: Parameter declaration expected. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration10_es2017.ts(1,33): error TS2304: Cannot find name 'await'. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration10_es2017.ts(1,38): error TS1005: ';' expected. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration10_es2017.ts(1,39): error TS1128: Declaration or statement expected. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration10_es2017.ts(1,41): error TS2365: Operator '>' cannot be applied to types 'boolean' and '{}'. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration10_es2017.ts(1,49): error TS2532: Object is possibly 'undefined'. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration10_es2017.ts(1,53): error TS1109: Expression expected. -==== tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration10_es2017.ts (9 errors) ==== +==== tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration10_es2017.ts (2 errors) ==== async function foo(a = await => await): Promise { - ~~~~~~~~~ -!!! error TS2371: A parameter initializer is only allowed in a function or constructor implementation. + ~~~~~ +!!! error TS2524: 'await' expressions cannot be used in a parameter initializer. ~~ !!! error TS1109: Expression expected. - ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~~~~~ -!!! error TS2304: Cannot find name 'await'. - ~ -!!! error TS1005: ';' expected. - ~ -!!! error TS1128: Declaration or statement expected. - ~~~~~~~~~~~~~~~ - ~~~~ -!!! error TS2532: Object is possibly 'undefined'. - ~ -!!! error TS1109: Expression expected. - } - ~ -!!! error TS2365: Operator '>' cannot be applied to types 'boolean' and '{}'. \ No newline at end of file + } \ No newline at end of file diff --git a/tests/baselines/reference/asyncFunctionDeclaration10_es2017.js b/tests/baselines/reference/asyncFunctionDeclaration10_es2017.js index f8a22204311e5..b27f4aedb6685 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration10_es2017.js +++ b/tests/baselines/reference/asyncFunctionDeclaration10_es2017.js @@ -3,6 +3,5 @@ async function foo(a = await => await): Promise { } //// [asyncFunctionDeclaration10_es2017.js] -async function foo(a = await ) { } -await; -Promise < void > {}; +async function foo(a = await , await) { +} diff --git a/tests/baselines/reference/asyncFunctionDeclaration10_es2017.symbols b/tests/baselines/reference/asyncFunctionDeclaration10_es2017.symbols index de526b968ef74..0705621581feb 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration10_es2017.symbols +++ b/tests/baselines/reference/asyncFunctionDeclaration10_es2017.symbols @@ -2,5 +2,6 @@ async function foo(a = await => await): Promise { >foo : Symbol(foo, Decl(asyncFunctionDeclaration10_es2017.ts, 0, 0)) >a : Symbol(a, Decl(asyncFunctionDeclaration10_es2017.ts, 0, 19)) +>await : Symbol(await, Decl(asyncFunctionDeclaration10_es2017.ts, 0, 31)) >Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) } diff --git a/tests/baselines/reference/asyncFunctionDeclaration10_es2017.types b/tests/baselines/reference/asyncFunctionDeclaration10_es2017.types index 906a0966c0a0f..30fdfa6456fc1 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration10_es2017.types +++ b/tests/baselines/reference/asyncFunctionDeclaration10_es2017.types @@ -1,14 +1,8 @@ === tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration10_es2017.ts === async function foo(a = await => await): Promise { ->foo : (a?: any) => any +>foo : (a: any, await: any) => Promise >a : any >await : any > : any >await : any ->Promise {} : boolean ->PromisePromise : PromiseConstructor ->void : undefined -> : any ->{} : {} } diff --git a/tests/baselines/reference/asyncFunctionDeclaration10_es5.errors.txt b/tests/baselines/reference/asyncFunctionDeclaration10_es5.errors.txt index 155119784ba9e..93e3e75ad47fb 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration10_es5.errors.txt +++ b/tests/baselines/reference/asyncFunctionDeclaration10_es5.errors.txt @@ -1,33 +1,11 @@ -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration10_es5.ts(1,20): error TS2371: A parameter initializer is only allowed in a function or constructor implementation. +tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration10_es5.ts(1,24): error TS2524: 'await' expressions cannot be used in a parameter initializer. tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration10_es5.ts(1,30): error TS1109: Expression expected. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration10_es5.ts(1,33): error TS1138: Parameter declaration expected. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration10_es5.ts(1,33): error TS2304: Cannot find name 'await'. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration10_es5.ts(1,38): error TS1005: ';' expected. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration10_es5.ts(1,39): error TS1128: Declaration or statement expected. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration10_es5.ts(1,41): error TS2365: Operator '>' cannot be applied to types 'boolean' and '{}'. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration10_es5.ts(1,49): error TS2532: Object is possibly 'undefined'. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration10_es5.ts(1,53): error TS1109: Expression expected. -==== tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration10_es5.ts (9 errors) ==== +==== tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration10_es5.ts (2 errors) ==== async function foo(a = await => await): Promise { - ~~~~~~~~~ -!!! error TS2371: A parameter initializer is only allowed in a function or constructor implementation. + ~~~~~ +!!! error TS2524: 'await' expressions cannot be used in a parameter initializer. ~~ !!! error TS1109: Expression expected. - ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~~~~~ -!!! error TS2304: Cannot find name 'await'. - ~ -!!! error TS1005: ';' expected. - ~ -!!! error TS1128: Declaration or statement expected. - ~~~~~~~~~~~~~~~ - ~~~~ -!!! error TS2532: Object is possibly 'undefined'. - ~ -!!! error TS1109: Expression expected. - } - ~ -!!! error TS2365: Operator '>' cannot be applied to types 'boolean' and '{}'. \ No newline at end of file + } \ No newline at end of file diff --git a/tests/baselines/reference/asyncFunctionDeclaration10_es5.js b/tests/baselines/reference/asyncFunctionDeclaration10_es5.js index 758bdab5dc902..e42e761c6984e 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration10_es5.js +++ b/tests/baselines/reference/asyncFunctionDeclaration10_es5.js @@ -3,11 +3,11 @@ async function foo(a = await => await): Promise { } //// [asyncFunctionDeclaration10_es5.js] -function foo(a) { +function foo(a, await) { if (a === void 0) { a = yield ; } - return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { - return [2 /*return*/]; - }); }); + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/]; + }); + }); } -await; -Promise < void > {}; diff --git a/tests/baselines/reference/asyncFunctionDeclaration10_es5.symbols b/tests/baselines/reference/asyncFunctionDeclaration10_es5.symbols index cd989f81bce7f..909bed0ea52b1 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration10_es5.symbols +++ b/tests/baselines/reference/asyncFunctionDeclaration10_es5.symbols @@ -2,5 +2,6 @@ async function foo(a = await => await): Promise { >foo : Symbol(foo, Decl(asyncFunctionDeclaration10_es5.ts, 0, 0)) >a : Symbol(a, Decl(asyncFunctionDeclaration10_es5.ts, 0, 19)) +>await : Symbol(await, Decl(asyncFunctionDeclaration10_es5.ts, 0, 31)) >Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) } diff --git a/tests/baselines/reference/asyncFunctionDeclaration10_es5.types b/tests/baselines/reference/asyncFunctionDeclaration10_es5.types index 70a16d0fc52ea..d29b96391e4cf 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration10_es5.types +++ b/tests/baselines/reference/asyncFunctionDeclaration10_es5.types @@ -1,14 +1,8 @@ === tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration10_es5.ts === async function foo(a = await => await): Promise { ->foo : (a?: any) => any +>foo : (a: any, await: any) => Promise >a : any >await : any > : any >await : any ->Promise {} : boolean ->PromisePromise : PromiseConstructor ->void : undefined -> : any ->{} : {} } diff --git a/tests/baselines/reference/asyncFunctionDeclaration10_es6.errors.txt b/tests/baselines/reference/asyncFunctionDeclaration10_es6.errors.txt index 7f5266f931e30..09cbc3a7a2690 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration10_es6.errors.txt +++ b/tests/baselines/reference/asyncFunctionDeclaration10_es6.errors.txt @@ -1,33 +1,11 @@ -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration10_es6.ts(1,20): error TS2371: A parameter initializer is only allowed in a function or constructor implementation. +tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration10_es6.ts(1,24): error TS2524: 'await' expressions cannot be used in a parameter initializer. tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration10_es6.ts(1,30): error TS1109: Expression expected. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration10_es6.ts(1,33): error TS1138: Parameter declaration expected. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration10_es6.ts(1,33): error TS2304: Cannot find name 'await'. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration10_es6.ts(1,38): error TS1005: ';' expected. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration10_es6.ts(1,39): error TS1128: Declaration or statement expected. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration10_es6.ts(1,41): error TS2365: Operator '>' cannot be applied to types 'boolean' and '{}'. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration10_es6.ts(1,49): error TS2532: Object is possibly 'undefined'. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration10_es6.ts(1,53): error TS1109: Expression expected. -==== tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration10_es6.ts (9 errors) ==== +==== tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration10_es6.ts (2 errors) ==== async function foo(a = await => await): Promise { - ~~~~~~~~~ -!!! error TS2371: A parameter initializer is only allowed in a function or constructor implementation. + ~~~~~ +!!! error TS2524: 'await' expressions cannot be used in a parameter initializer. ~~ !!! error TS1109: Expression expected. - ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~~~~~ -!!! error TS2304: Cannot find name 'await'. - ~ -!!! error TS1005: ';' expected. - ~ -!!! error TS1128: Declaration or statement expected. - ~~~~~~~~~~~~~~~ - ~~~~ -!!! error TS2532: Object is possibly 'undefined'. - ~ -!!! error TS1109: Expression expected. - } - ~ -!!! error TS2365: Operator '>' cannot be applied to types 'boolean' and '{}'. \ No newline at end of file + } \ No newline at end of file diff --git a/tests/baselines/reference/asyncFunctionDeclaration10_es6.js b/tests/baselines/reference/asyncFunctionDeclaration10_es6.js index 1f175035bf085..c5fe16ea05e20 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration10_es6.js +++ b/tests/baselines/reference/asyncFunctionDeclaration10_es6.js @@ -3,8 +3,7 @@ async function foo(a = await => await): Promise { } //// [asyncFunctionDeclaration10_es6.js] -function foo(a = yield ) { - return __awaiter(this, void 0, void 0, function* () { }); +function foo(a = yield , await) { + return __awaiter(this, void 0, void 0, function* () { + }); } -await; -Promise < void > {}; diff --git a/tests/baselines/reference/asyncFunctionDeclaration10_es6.symbols b/tests/baselines/reference/asyncFunctionDeclaration10_es6.symbols index f1d1994e2690e..2c78cb0e0ddce 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration10_es6.symbols +++ b/tests/baselines/reference/asyncFunctionDeclaration10_es6.symbols @@ -2,5 +2,6 @@ async function foo(a = await => await): Promise { >foo : Symbol(foo, Decl(asyncFunctionDeclaration10_es6.ts, 0, 0)) >a : Symbol(a, Decl(asyncFunctionDeclaration10_es6.ts, 0, 19)) +>await : Symbol(await, Decl(asyncFunctionDeclaration10_es6.ts, 0, 31)) >Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) } diff --git a/tests/baselines/reference/asyncFunctionDeclaration10_es6.types b/tests/baselines/reference/asyncFunctionDeclaration10_es6.types index f5d5ae89afd6d..fbf97067f01a8 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration10_es6.types +++ b/tests/baselines/reference/asyncFunctionDeclaration10_es6.types @@ -1,14 +1,8 @@ === tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration10_es6.ts === async function foo(a = await => await): Promise { ->foo : (a?: any) => any +>foo : (a: any, await: any) => Promise >a : any >await : any > : any >await : any ->Promise {} : boolean ->PromisePromise : PromiseConstructor ->void : undefined -> : any ->{} : {} } diff --git a/tests/baselines/reference/asyncFunctionDeclaration12_es2017.errors.txt b/tests/baselines/reference/asyncFunctionDeclaration12_es2017.errors.txt index 37e2c3f847f18..100589c3a5491 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration12_es2017.errors.txt +++ b/tests/baselines/reference/asyncFunctionDeclaration12_es2017.errors.txt @@ -1,16 +1,7 @@ -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration12_es2017.ts(1,24): error TS1005: '(' expected. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration12_es2017.ts(1,29): error TS1005: ',' expected. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration12_es2017.ts(1,33): error TS2355: A function whose declared type is neither 'void' nor 'any' must return a value. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration12_es2017.ts(1,47): error TS1005: '=>' expected. +tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration12_es2017.ts(1,24): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. -==== tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration12_es2017.ts (4 errors) ==== +==== tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration12_es2017.ts (1 errors) ==== var v = async function await(): Promise { } ~~~~~ -!!! error TS1005: '(' expected. - ~ -!!! error TS1005: ',' expected. - ~~~~~~~~~~~~~ -!!! error TS2355: A function whose declared type is neither 'void' nor 'any' must return a value. - ~ -!!! error TS1005: '=>' expected. \ No newline at end of file +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. \ No newline at end of file diff --git a/tests/baselines/reference/asyncFunctionDeclaration12_es2017.js b/tests/baselines/reference/asyncFunctionDeclaration12_es2017.js index 2ed6cf3191f10..03401f2464e43 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration12_es2017.js +++ b/tests/baselines/reference/asyncFunctionDeclaration12_es2017.js @@ -2,5 +2,4 @@ var v = async function await(): Promise { } //// [asyncFunctionDeclaration12_es2017.js] -var v = async function () { }, await; -() => { }; +var v = async function await() { }; diff --git a/tests/baselines/reference/asyncFunctionDeclaration12_es2017.symbols b/tests/baselines/reference/asyncFunctionDeclaration12_es2017.symbols index a6a37aa6004ed..d8a9d115a4f7d 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration12_es2017.symbols +++ b/tests/baselines/reference/asyncFunctionDeclaration12_es2017.symbols @@ -1,6 +1,6 @@ === tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration12_es2017.ts === var v = async function await(): Promise { } >v : Symbol(v, Decl(asyncFunctionDeclaration12_es2017.ts, 0, 3)) ->await : Symbol(await, Decl(asyncFunctionDeclaration12_es2017.ts, 0, 22)) +>await : Symbol(await, Decl(asyncFunctionDeclaration12_es2017.ts, 0, 7)) >Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) diff --git a/tests/baselines/reference/asyncFunctionDeclaration12_es2017.types b/tests/baselines/reference/asyncFunctionDeclaration12_es2017.types index 46fd50a46e331..d2a4a00f1f56a 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration12_es2017.types +++ b/tests/baselines/reference/asyncFunctionDeclaration12_es2017.types @@ -1,7 +1,6 @@ === tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration12_es2017.ts === var v = async function await(): Promise { } ->v : () => any ->async function : () => any ->await : any ->(): Promise { } : () => Promise +>v : () => Promise +>async function await(): Promise { } : () => Promise +>await : () => Promise diff --git a/tests/baselines/reference/asyncFunctionDeclaration12_es5.errors.txt b/tests/baselines/reference/asyncFunctionDeclaration12_es5.errors.txt index 353e75ca6d575..70d25a1ac25aa 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration12_es5.errors.txt +++ b/tests/baselines/reference/asyncFunctionDeclaration12_es5.errors.txt @@ -1,16 +1,7 @@ -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration12_es5.ts(1,24): error TS1005: '(' expected. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration12_es5.ts(1,29): error TS1005: ',' expected. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration12_es5.ts(1,33): error TS2355: A function whose declared type is neither 'void' nor 'any' must return a value. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration12_es5.ts(1,47): error TS1005: '=>' expected. +tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration12_es5.ts(1,24): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. -==== tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration12_es5.ts (4 errors) ==== +==== tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration12_es5.ts (1 errors) ==== var v = async function await(): Promise { } ~~~~~ -!!! error TS1005: '(' expected. - ~ -!!! error TS1005: ',' expected. - ~~~~~~~~~~~~~ -!!! error TS2355: A function whose declared type is neither 'void' nor 'any' must return a value. - ~ -!!! error TS1005: '=>' expected. \ No newline at end of file +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. \ No newline at end of file diff --git a/tests/baselines/reference/asyncFunctionDeclaration12_es5.js b/tests/baselines/reference/asyncFunctionDeclaration12_es5.js index 19bca54f524a8..d74aa370bfbb9 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration12_es5.js +++ b/tests/baselines/reference/asyncFunctionDeclaration12_es5.js @@ -2,9 +2,8 @@ var v = async function await(): Promise { } //// [asyncFunctionDeclaration12_es5.js] -var v = function () { +var v = function await() { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/]; }); }); -}, await; -(function () { }); +}; diff --git a/tests/baselines/reference/asyncFunctionDeclaration12_es5.symbols b/tests/baselines/reference/asyncFunctionDeclaration12_es5.symbols index 688f265efcc6e..113b8c18933d9 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration12_es5.symbols +++ b/tests/baselines/reference/asyncFunctionDeclaration12_es5.symbols @@ -1,6 +1,6 @@ === tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration12_es5.ts === var v = async function await(): Promise { } >v : Symbol(v, Decl(asyncFunctionDeclaration12_es5.ts, 0, 3)) ->await : Symbol(await, Decl(asyncFunctionDeclaration12_es5.ts, 0, 22)) +>await : Symbol(await, Decl(asyncFunctionDeclaration12_es5.ts, 0, 7)) >Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) diff --git a/tests/baselines/reference/asyncFunctionDeclaration12_es5.types b/tests/baselines/reference/asyncFunctionDeclaration12_es5.types index 1432adc522d79..2feefbe43c02c 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration12_es5.types +++ b/tests/baselines/reference/asyncFunctionDeclaration12_es5.types @@ -1,7 +1,6 @@ === tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration12_es5.ts === var v = async function await(): Promise { } ->v : () => any ->async function : () => any ->await : any ->(): Promise { } : () => Promise +>v : () => Promise +>async function await(): Promise { } : () => Promise +>await : () => Promise diff --git a/tests/baselines/reference/asyncFunctionDeclaration12_es6.errors.txt b/tests/baselines/reference/asyncFunctionDeclaration12_es6.errors.txt index ffe7227344f92..125dda8d46290 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration12_es6.errors.txt +++ b/tests/baselines/reference/asyncFunctionDeclaration12_es6.errors.txt @@ -1,16 +1,7 @@ -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration12_es6.ts(1,24): error TS1005: '(' expected. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration12_es6.ts(1,29): error TS1005: ',' expected. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration12_es6.ts(1,33): error TS2355: A function whose declared type is neither 'void' nor 'any' must return a value. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration12_es6.ts(1,47): error TS1005: '=>' expected. +tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration12_es6.ts(1,24): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. -==== tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration12_es6.ts (4 errors) ==== +==== tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration12_es6.ts (1 errors) ==== var v = async function await(): Promise { } ~~~~~ -!!! error TS1005: '(' expected. - ~ -!!! error TS1005: ',' expected. - ~~~~~~~~~~~~~ -!!! error TS2355: A function whose declared type is neither 'void' nor 'any' must return a value. - ~ -!!! error TS1005: '=>' expected. \ No newline at end of file +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. \ No newline at end of file diff --git a/tests/baselines/reference/asyncFunctionDeclaration12_es6.js b/tests/baselines/reference/asyncFunctionDeclaration12_es6.js index 17829af6f20e2..d9982fab9337f 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration12_es6.js +++ b/tests/baselines/reference/asyncFunctionDeclaration12_es6.js @@ -2,7 +2,6 @@ var v = async function await(): Promise { } //// [asyncFunctionDeclaration12_es6.js] -var v = function () { +var v = function await() { return __awaiter(this, void 0, void 0, function* () { }); -}, await; -() => { }; +}; diff --git a/tests/baselines/reference/asyncFunctionDeclaration12_es6.symbols b/tests/baselines/reference/asyncFunctionDeclaration12_es6.symbols index 86bec74c68d07..ec1bbc9f7456f 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration12_es6.symbols +++ b/tests/baselines/reference/asyncFunctionDeclaration12_es6.symbols @@ -1,6 +1,6 @@ === tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration12_es6.ts === var v = async function await(): Promise { } >v : Symbol(v, Decl(asyncFunctionDeclaration12_es6.ts, 0, 3)) ->await : Symbol(await, Decl(asyncFunctionDeclaration12_es6.ts, 0, 22)) +>await : Symbol(await, Decl(asyncFunctionDeclaration12_es6.ts, 0, 7)) >Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) diff --git a/tests/baselines/reference/asyncFunctionDeclaration12_es6.types b/tests/baselines/reference/asyncFunctionDeclaration12_es6.types index 251b01f7dc0e5..2fc4113cb25af 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration12_es6.types +++ b/tests/baselines/reference/asyncFunctionDeclaration12_es6.types @@ -1,7 +1,6 @@ === tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration12_es6.ts === var v = async function await(): Promise { } ->v : () => any ->async function : () => any ->await : any ->(): Promise { } : () => Promise +>v : () => Promise +>async function await(): Promise { } : () => Promise +>await : () => Promise diff --git a/tests/baselines/reference/asyncFunctionDeclaration5_es2017.errors.txt b/tests/baselines/reference/asyncFunctionDeclaration5_es2017.errors.txt index 2d110f68127fc..9b8504d2fa12d 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration5_es2017.errors.txt +++ b/tests/baselines/reference/asyncFunctionDeclaration5_es2017.errors.txt @@ -1,27 +1,8 @@ -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration5_es2017.ts(1,20): error TS1138: Parameter declaration expected. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration5_es2017.ts(1,20): error TS2304: Cannot find name 'await'. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration5_es2017.ts(1,25): error TS1005: ';' expected. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration5_es2017.ts(1,26): error TS1128: Declaration or statement expected. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration5_es2017.ts(1,28): error TS2365: Operator '>' cannot be applied to types 'boolean' and '{}'. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration5_es2017.ts(1,36): error TS2532: Object is possibly 'undefined'. -tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration5_es2017.ts(1,40): error TS1109: Expression expected. +tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration5_es2017.ts(1,20): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. -==== tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration5_es2017.ts (7 errors) ==== +==== tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration5_es2017.ts (1 errors) ==== async function foo(await): Promise { ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~~~~~ -!!! error TS2304: Cannot find name 'await'. - ~ -!!! error TS1005: ';' expected. - ~ -!!! error TS1128: Declaration or statement expected. - ~~~~~~~~~~~~~~~ - ~~~~ -!!! error TS2532: Object is possibly 'undefined'. - ~ -!!! error TS1109: Expression expected. - } - ~ -!!! error TS2365: Operator '>' cannot be applied to types 'boolean' and '{}'. \ No newline at end of file +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. + } \ No newline at end of file diff --git a/tests/baselines/reference/asyncFunctionDeclaration5_es2017.js b/tests/baselines/reference/asyncFunctionDeclaration5_es2017.js index 904bbe62f0ba8..f660de5229ece 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration5_es2017.js +++ b/tests/baselines/reference/asyncFunctionDeclaration5_es2017.js @@ -3,6 +3,5 @@ async function foo(await): Promise { } //// [asyncFunctionDeclaration5_es2017.js] -async function foo() { } -await; -Promise < void > {}; +async function foo(await) { +} diff --git a/tests/baselines/reference/asyncFunctionDeclaration5_es2017.symbols b/tests/baselines/reference/asyncFunctionDeclaration5_es2017.symbols index 2a186f07ad94c..58a4fe62aa395 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration5_es2017.symbols +++ b/tests/baselines/reference/asyncFunctionDeclaration5_es2017.symbols @@ -1,5 +1,6 @@ === tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration5_es2017.ts === async function foo(await): Promise { >foo : Symbol(foo, Decl(asyncFunctionDeclaration5_es2017.ts, 0, 0)) +>await : Symbol(await, Decl(asyncFunctionDeclaration5_es2017.ts, 0, 19)) >Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) } diff --git a/tests/baselines/reference/asyncFunctionDeclaration5_es2017.types b/tests/baselines/reference/asyncFunctionDeclaration5_es2017.types index fb19a3f5b11b1..a1ae2eefdc6a0 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration5_es2017.types +++ b/tests/baselines/reference/asyncFunctionDeclaration5_es2017.types @@ -1,11 +1,5 @@ === tests/cases/conformance/async/es2017/functionDeclarations/asyncFunctionDeclaration5_es2017.ts === async function foo(await): Promise { ->foo : () => any +>foo : (await: any) => Promise >await : any ->Promise {} : boolean ->PromisePromise : PromiseConstructor ->void : undefined -> : any ->{} : {} } diff --git a/tests/baselines/reference/asyncFunctionDeclaration5_es5.errors.txt b/tests/baselines/reference/asyncFunctionDeclaration5_es5.errors.txt index 6607ec7ff5c9f..5d37c723c6a9b 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration5_es5.errors.txt +++ b/tests/baselines/reference/asyncFunctionDeclaration5_es5.errors.txt @@ -1,27 +1,8 @@ -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration5_es5.ts(1,20): error TS1138: Parameter declaration expected. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration5_es5.ts(1,20): error TS2304: Cannot find name 'await'. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration5_es5.ts(1,25): error TS1005: ';' expected. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration5_es5.ts(1,26): error TS1128: Declaration or statement expected. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration5_es5.ts(1,28): error TS2365: Operator '>' cannot be applied to types 'boolean' and '{}'. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration5_es5.ts(1,36): error TS2532: Object is possibly 'undefined'. -tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration5_es5.ts(1,40): error TS1109: Expression expected. +tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration5_es5.ts(1,20): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. -==== tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration5_es5.ts (7 errors) ==== +==== tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration5_es5.ts (1 errors) ==== async function foo(await): Promise { ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~~~~~ -!!! error TS2304: Cannot find name 'await'. - ~ -!!! error TS1005: ';' expected. - ~ -!!! error TS1128: Declaration or statement expected. - ~~~~~~~~~~~~~~~ - ~~~~ -!!! error TS2532: Object is possibly 'undefined'. - ~ -!!! error TS1109: Expression expected. - } - ~ -!!! error TS2365: Operator '>' cannot be applied to types 'boolean' and '{}'. \ No newline at end of file +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. + } \ No newline at end of file diff --git a/tests/baselines/reference/asyncFunctionDeclaration5_es5.js b/tests/baselines/reference/asyncFunctionDeclaration5_es5.js index 5f8f8f4273589..7ebe3a54f54cf 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration5_es5.js +++ b/tests/baselines/reference/asyncFunctionDeclaration5_es5.js @@ -3,10 +3,10 @@ async function foo(await): Promise { } //// [asyncFunctionDeclaration5_es5.js] -function foo() { - return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { - return [2 /*return*/]; - }); }); +function foo(await) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/]; + }); + }); } -await; -Promise < void > {}; diff --git a/tests/baselines/reference/asyncFunctionDeclaration5_es5.symbols b/tests/baselines/reference/asyncFunctionDeclaration5_es5.symbols index 5816bebe5ab46..50d7d0beafd67 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration5_es5.symbols +++ b/tests/baselines/reference/asyncFunctionDeclaration5_es5.symbols @@ -1,5 +1,6 @@ === tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration5_es5.ts === async function foo(await): Promise { >foo : Symbol(foo, Decl(asyncFunctionDeclaration5_es5.ts, 0, 0)) +>await : Symbol(await, Decl(asyncFunctionDeclaration5_es5.ts, 0, 19)) >Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) } diff --git a/tests/baselines/reference/asyncFunctionDeclaration5_es5.types b/tests/baselines/reference/asyncFunctionDeclaration5_es5.types index c1a99312825b4..093ce5645d80d 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration5_es5.types +++ b/tests/baselines/reference/asyncFunctionDeclaration5_es5.types @@ -1,11 +1,5 @@ === tests/cases/conformance/async/es5/functionDeclarations/asyncFunctionDeclaration5_es5.ts === async function foo(await): Promise { ->foo : () => any +>foo : (await: any) => Promise >await : any ->Promise {} : boolean ->PromisePromise : PromiseConstructor ->void : undefined -> : any ->{} : {} } diff --git a/tests/baselines/reference/asyncFunctionDeclaration5_es6.errors.txt b/tests/baselines/reference/asyncFunctionDeclaration5_es6.errors.txt index ccddf6d5c044b..bc4832ffcae22 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration5_es6.errors.txt +++ b/tests/baselines/reference/asyncFunctionDeclaration5_es6.errors.txt @@ -1,27 +1,8 @@ -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration5_es6.ts(1,20): error TS1138: Parameter declaration expected. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration5_es6.ts(1,20): error TS2304: Cannot find name 'await'. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration5_es6.ts(1,25): error TS1005: ';' expected. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration5_es6.ts(1,26): error TS1128: Declaration or statement expected. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration5_es6.ts(1,28): error TS2365: Operator '>' cannot be applied to types 'boolean' and '{}'. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration5_es6.ts(1,36): error TS2532: Object is possibly 'undefined'. -tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration5_es6.ts(1,40): error TS1109: Expression expected. +tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration5_es6.ts(1,20): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. -==== tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration5_es6.ts (7 errors) ==== +==== tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration5_es6.ts (1 errors) ==== async function foo(await): Promise { ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~~~~~ -!!! error TS2304: Cannot find name 'await'. - ~ -!!! error TS1005: ';' expected. - ~ -!!! error TS1128: Declaration or statement expected. - ~~~~~~~~~~~~~~~ - ~~~~ -!!! error TS2532: Object is possibly 'undefined'. - ~ -!!! error TS1109: Expression expected. - } - ~ -!!! error TS2365: Operator '>' cannot be applied to types 'boolean' and '{}'. \ No newline at end of file +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. + } \ No newline at end of file diff --git a/tests/baselines/reference/asyncFunctionDeclaration5_es6.js b/tests/baselines/reference/asyncFunctionDeclaration5_es6.js index 9521b76041585..cb36ae4c3c253 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration5_es6.js +++ b/tests/baselines/reference/asyncFunctionDeclaration5_es6.js @@ -3,8 +3,7 @@ async function foo(await): Promise { } //// [asyncFunctionDeclaration5_es6.js] -function foo() { - return __awaiter(this, void 0, void 0, function* () { }); +function foo(await) { + return __awaiter(this, void 0, void 0, function* () { + }); } -await; -Promise < void > {}; diff --git a/tests/baselines/reference/asyncFunctionDeclaration5_es6.symbols b/tests/baselines/reference/asyncFunctionDeclaration5_es6.symbols index 74ff7be33d3e1..27e1ff6f5efb1 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration5_es6.symbols +++ b/tests/baselines/reference/asyncFunctionDeclaration5_es6.symbols @@ -1,5 +1,6 @@ === tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration5_es6.ts === async function foo(await): Promise { >foo : Symbol(foo, Decl(asyncFunctionDeclaration5_es6.ts, 0, 0)) +>await : Symbol(await, Decl(asyncFunctionDeclaration5_es6.ts, 0, 19)) >Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) } diff --git a/tests/baselines/reference/asyncFunctionDeclaration5_es6.types b/tests/baselines/reference/asyncFunctionDeclaration5_es6.types index 30497fd457ac8..58f5ccd8e489d 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration5_es6.types +++ b/tests/baselines/reference/asyncFunctionDeclaration5_es6.types @@ -1,11 +1,5 @@ === tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration5_es6.ts === async function foo(await): Promise { ->foo : () => any +>foo : (await: any) => Promise >await : any ->Promise {} : boolean ->PromisePromise : PromiseConstructor ->void : undefined -> : any ->{} : {} } diff --git a/tests/baselines/reference/parser.asyncGenerators.classMethods.es2018.errors.txt b/tests/baselines/reference/parser.asyncGenerators.classMethods.es2018.errors.txt index 6af732c1b4fb8..e5747e2499aab 100644 --- a/tests/baselines/reference/parser.asyncGenerators.classMethods.es2018.errors.txt +++ b/tests/baselines/reference/parser.asyncGenerators.classMethods.es2018.errors.txt @@ -3,28 +3,16 @@ tests/cases/conformance/parser/ecmascript2018/asyncGenerators/asyncGeneratorProp tests/cases/conformance/parser/ecmascript2018/asyncGenerators/asyncGeneratorSetAccessorIsError.ts(2,17): error TS1005: '(' expected. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitInParameterInitializerIsError.ts(2,19): error TS2524: 'await' expressions cannot be used in a parameter initializer. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitMissingValueIsError.ts(3,14): error TS1109: Expression expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(2,15): error TS1138: Parameter declaration expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(2,15): error TS2693: 'await' only refers to a type, but is being used as a value here. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(2,20): error TS1005: ';' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(4,1): error TS1128: Declaration or statement expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(3,18): error TS1003: Identifier expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(3,24): error TS1109: Expression expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(3,26): error TS1005: ';' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts(3,18): error TS1003: Identifier expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts(3,26): error TS1005: '=>' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts(3,28): error TS1005: '(' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts(3,34): error TS1109: Expression expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts(3,36): error TS1005: ';' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts(3,28): error TS1005: '(' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts(3,36): error TS1005: '=>' expected. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(2,15): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(3,18): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts(3,18): error TS1213: Identifier expected. 'yield' is a reserved word in strict mode. Class definitions are automatically in strict mode. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts(3,28): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts(3,28): error TS1213: Identifier expected. 'yield' is a reserved word in strict mode. Class definitions are automatically in strict mode. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldAsTypeIsStrictError.ts(4,16): error TS1213: Identifier expected. 'yield' is a reserved word in strict mode. Class definitions are automatically in strict mode. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldInClassComputedPropertyIsError.ts(2,14): error TS1213: Identifier expected. 'yield' is a reserved word in strict mode. Class definitions are automatically in strict mode. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldInClassComputedPropertyIsError.ts(2,14): error TS2693: 'yield' only refers to a type, but is being used as a value here. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldInParameterInitializerIsError.ts(2,19): error TS2523: 'yield' expressions cannot be used in a parameter initializer. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(2,15): error TS1138: Parameter declaration expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(2,15): error TS2693: 'yield' only refers to a type, but is being used as a value here. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(2,20): error TS1005: ';' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(4,1): error TS1128: Declaration or statement expected. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(2,15): error TS1213: Identifier expected. 'yield' is a reserved word in strict mode. Class definitions are automatically in strict mode. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldStarMissingValueIsError.ts(3,16): error TS1109: Expression expected. @@ -43,32 +31,20 @@ tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldStarMissingVa async * yield() { } } -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts (4 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts (1 errors) ==== class C4 { async * f(await) { ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~~~~~ -!!! error TS2693: 'await' only refers to a type, but is being used as a value here. - ~ -!!! error TS1005: ';' expected. +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. } } - ~ -!!! error TS1128: Declaration or statement expected. -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts (4 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts (1 errors) ==== class C5 { async * f(yield) { ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~~~~~ -!!! error TS2693: 'yield' only refers to a type, but is being used as a value here. - ~ -!!! error TS1005: ';' expected. +!!! error TS1213: Identifier expected. 'yield' is a reserved word in strict mode. Class definitions are automatically in strict mode. } } - ~ -!!! error TS1128: Declaration or statement expected. ==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitInParameterInitializerIsError.ts (1 errors) ==== class C6 { async * f(a = await 1) { @@ -90,51 +66,39 @@ tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldStarMissingVa } } } -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts (1 errors) ==== class C9 { async * f() { function yield() { ~~~~~ -!!! error TS1003: Identifier expected. - ~ -!!! error TS1005: '=>' expected. +!!! error TS1213: Identifier expected. 'yield' is a reserved word in strict mode. Class definitions are automatically in strict mode. } } } -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts (1 errors) ==== class C10 { async * f() { const x = function yield() { ~~~~~ -!!! error TS1005: '(' expected. - ~ -!!! error TS1005: '=>' expected. +!!! error TS1213: Identifier expected. 'yield' is a reserved word in strict mode. Class definitions are automatically in strict mode. }; } } -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts (3 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts (1 errors) ==== class C11 { async * f() { function await() { ~~~~~ -!!! error TS1003: Identifier expected. - ~ -!!! error TS1109: Expression expected. - ~ -!!! error TS1005: ';' expected. +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. } } } -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts (3 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts (1 errors) ==== class C12 { async * f() { const x = function await() { ~~~~~ -!!! error TS1005: '(' expected. - ~ -!!! error TS1109: Expression expected. - ~ -!!! error TS1005: ';' expected. +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. }; } } diff --git a/tests/baselines/reference/parser.asyncGenerators.classMethods.es2018.symbols b/tests/baselines/reference/parser.asyncGenerators.classMethods.es2018.symbols index b3494dd007910..042e3043791a0 100644 --- a/tests/baselines/reference/parser.asyncGenerators.classMethods.es2018.symbols +++ b/tests/baselines/reference/parser.asyncGenerators.classMethods.es2018.symbols @@ -28,6 +28,7 @@ class C4 { async * f(await) { >f : Symbol(C4.f, Decl(awaitParameterIsError.ts, 0, 10)) +>await : Symbol(await, Decl(awaitParameterIsError.ts, 1, 14)) } } === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts === @@ -36,6 +37,7 @@ class C5 { async * f(yield) { >f : Symbol(C5.f, Decl(yieldParameterIsError.ts, 0, 10)) +>yield : Symbol(yield, Decl(yieldParameterIsError.ts, 1, 14)) } } === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitInParameterInitializerIsError.ts === @@ -76,7 +78,7 @@ class C9 { >f : Symbol(C9.f, Decl(nestedFunctionDeclarationNamedYieldIsError.ts, 0, 10)) function yield() { -> : Symbol((Missing), Decl(nestedFunctionDeclarationNamedYieldIsError.ts, 1, 17)) +>yield : Symbol(yield, Decl(nestedFunctionDeclarationNamedYieldIsError.ts, 1, 17)) } } } @@ -89,6 +91,7 @@ class C10 { const x = function yield() { >x : Symbol(x, Decl(nestedFunctionExpressionNamedYieldIsError.ts, 2, 13)) +>yield : Symbol(yield, Decl(nestedFunctionExpressionNamedYieldIsError.ts, 2, 17)) }; } @@ -101,7 +104,7 @@ class C11 { >f : Symbol(C11.f, Decl(nestedFunctionDeclarationNamedAwaitIsError.ts, 0, 11)) function await() { -> : Symbol((Missing), Decl(nestedFunctionDeclarationNamedAwaitIsError.ts, 1, 17)) +>await : Symbol(await, Decl(nestedFunctionDeclarationNamedAwaitIsError.ts, 1, 17)) } } } @@ -114,6 +117,7 @@ class C12 { const x = function await() { >x : Symbol(x, Decl(nestedFunctionExpressionNamedAwaitIsError.ts, 2, 13)) +>await : Symbol(await, Decl(nestedFunctionExpressionNamedAwaitIsError.ts, 2, 17)) }; } diff --git a/tests/baselines/reference/parser.asyncGenerators.classMethods.es2018.types b/tests/baselines/reference/parser.asyncGenerators.classMethods.es2018.types index 68375a7d6796e..8de20801f686d 100644 --- a/tests/baselines/reference/parser.asyncGenerators.classMethods.es2018.types +++ b/tests/baselines/reference/parser.asyncGenerators.classMethods.es2018.types @@ -27,7 +27,7 @@ class C4 { >C4 : C4 async * f(await) { ->f : () => any +>f : (await: any) => AsyncGenerator >await : any } } @@ -36,7 +36,7 @@ class C5 { >C5 : C5 async * f(yield) { ->f : () => any +>f : (yield: any) => AsyncGenerator >yield : any } } @@ -78,12 +78,10 @@ class C9 { >C9 : C9 async * f() { ->f : () => AsyncGenerator<() => void, void, unknown> +>f : () => AsyncGenerator function yield() { -> : () => any ->yield() { } : any ->() { } : () => void +>yield : () => void } } } @@ -92,13 +90,12 @@ class C10 { >C10 : C10 async * f() { ->f : () => AsyncGenerator<() => void, void, unknown> +>f : () => AsyncGenerator const x = function yield() { ->x : () => any ->function : () => any ->yield() { } : any ->() { } : () => void +>x : () => void +>function yield() { } : () => void +>yield : () => void }; } @@ -111,10 +108,7 @@ class C11 { >f : () => AsyncGenerator function await() { -> : () => any ->await() : any ->() : any -> : any +>await : () => void } } } @@ -126,11 +120,9 @@ class C12 { >f : () => AsyncGenerator const x = function await() { ->x : () => any ->function : () => any ->await() : any ->() : any -> : any +>x : () => void +>function await() { } : () => void +>await : () => void }; } diff --git a/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.es2018.errors.txt b/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.es2018.errors.txt index bc020c474df0c..8db2f5f3c99df 100644 --- a/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.es2018.errors.txt +++ b/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.es2018.errors.txt @@ -1,19 +1,12 @@ tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitInParameterInitializerIsError.ts(1,25): error TS2524: 'await' expressions cannot be used in a parameter initializer. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitMissingValueIsError.ts(2,10): error TS1109: Expression expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(1,21): error TS1138: Parameter declaration expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(1,26): error TS1005: ';' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(2,14): error TS1003: Identifier expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(2,20): error TS1109: Expression expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(2,22): error TS1005: ';' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts(2,14): error TS1003: Identifier expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts(2,22): error TS1005: '=>' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts(2,24): error TS1005: '(' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts(2,32): error TS1005: '=>' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts(2,24): error TS1005: '(' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts(2,32): error TS1005: '=>' expected. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(1,21): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(2,14): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts(2,14): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts(2,24): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts(2,24): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldInParameterInitializerIsError.ts(1,25): error TS2523: 'yield' expressions cannot be used in a parameter initializer. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(1,21): error TS1138: Parameter declaration expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(1,26): error TS1005: ';' expected. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(1,21): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldStarMissingValueIsError.ts(2,12): error TS1109: Expression expected. @@ -26,19 +19,15 @@ tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldStarMissingVa ==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldNameIsOk.ts (0 errors) ==== async function * yield() { } -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts (1 errors) ==== async function * f4(await) { ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~ -!!! error TS1005: ';' expected. +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. } -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts (1 errors) ==== async function * f5(yield) { ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~ -!!! error TS1005: ';' expected. +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. } ==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitInParameterInitializerIsError.ts (1 errors) ==== async function * f6(a = await 1) { @@ -55,42 +44,32 @@ tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldStarMissingVa async function * g() { } } -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts (1 errors) ==== async function * f9() { function yield() { ~~~~~ -!!! error TS1003: Identifier expected. - ~ -!!! error TS1005: '=>' expected. +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. } } -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts (1 errors) ==== async function * f10() { const x = function yield() { ~~~~~ -!!! error TS1005: '(' expected. - ~ -!!! error TS1005: '=>' expected. +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. }; } -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts (3 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts (1 errors) ==== async function * f11() { function await() { ~~~~~ -!!! error TS1003: Identifier expected. - ~ -!!! error TS1109: Expression expected. - ~ -!!! error TS1005: ';' expected. +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. } } -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts (1 errors) ==== async function * f12() { const x = function yield() { ~~~~~ -!!! error TS1005: '(' expected. - ~ -!!! error TS1005: '=>' expected. +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. }; } ==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldIsOk.ts (0 errors) ==== diff --git a/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.es2018.symbols b/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.es2018.symbols index cfc9034846cc5..791c9e4dde349 100644 --- a/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.es2018.symbols +++ b/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.es2018.symbols @@ -13,12 +13,12 @@ async function * yield() { === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts === async function * f4(await) { >f4 : Symbol(f4, Decl(awaitParameterIsError.ts, 0, 0)) ->await : Symbol(await, Decl(awaitNameIsOk.ts, 0, 0), Decl(awaitAsTypeIsOk.ts, 0, 0)) +>await : Symbol(await, Decl(awaitParameterIsError.ts, 0, 20)) } === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts === async function * f5(yield) { >f5 : Symbol(f5, Decl(yieldParameterIsError.ts, 0, 0)) ->yield : Symbol(yield, Decl(yieldNameIsOk.ts, 0, 0), Decl(yieldAsTypeIsOk.ts, 0, 0)) +>yield : Symbol(yield, Decl(yieldParameterIsError.ts, 0, 20)) } === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitInParameterInitializerIsError.ts === async function * f6(a = await 1) { @@ -43,7 +43,7 @@ async function * f9() { >f9 : Symbol(f9, Decl(nestedFunctionDeclarationNamedYieldIsError.ts, 0, 0)) function yield() { -> : Symbol((Missing), Decl(nestedFunctionDeclarationNamedYieldIsError.ts, 0, 23)) +>yield : Symbol(yield, Decl(nestedFunctionDeclarationNamedYieldIsError.ts, 0, 23)) } } === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts === @@ -52,6 +52,7 @@ async function * f10() { const x = function yield() { >x : Symbol(x, Decl(nestedFunctionExpressionNamedYieldIsError.ts, 1, 9)) +>yield : Symbol(yield, Decl(nestedFunctionExpressionNamedYieldIsError.ts, 1, 13)) }; } @@ -60,7 +61,7 @@ async function * f11() { >f11 : Symbol(f11, Decl(nestedFunctionDeclarationNamedAwaitIsError.ts, 0, 0)) function await() { -> : Symbol((Missing), Decl(nestedFunctionDeclarationNamedAwaitIsError.ts, 0, 24)) +>await : Symbol(await, Decl(nestedFunctionDeclarationNamedAwaitIsError.ts, 0, 24)) } } === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts === @@ -69,6 +70,7 @@ async function * f12() { const x = function yield() { >x : Symbol(x, Decl(nestedFunctionExpressionNamedAwaitIsError.ts, 1, 9)) +>yield : Symbol(yield, Decl(nestedFunctionExpressionNamedAwaitIsError.ts, 1, 13)) }; } diff --git a/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.es2018.types b/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.es2018.types index 08190b40112f5..668567c29ce12 100644 --- a/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.es2018.types +++ b/tests/baselines/reference/parser.asyncGenerators.functionDeclarations.es2018.types @@ -12,13 +12,13 @@ async function * yield() { } === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts === async function * f4(await) { ->f4 : () => any ->await : () => AsyncGenerator +>f4 : (await: any) => AsyncGenerator +>await : any } === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts === async function * f5(yield) { ->f5 : () => any ->yield : () => AsyncGenerator +>f5 : (yield: any) => AsyncGenerator +>yield : any } === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitInParameterInitializerIsError.ts === async function * f6(a = await 1) { @@ -43,23 +43,20 @@ async function * f8() { } === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts === async function * f9() { ->f9 : () => AsyncGenerator<() => void, void, unknown> +>f9 : () => AsyncGenerator function yield() { -> : () => any ->yield() { } : any ->() { } : () => void +>yield : () => void } } === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts === async function * f10() { ->f10 : () => AsyncGenerator<() => void, void, unknown> +>f10 : () => AsyncGenerator const x = function yield() { ->x : () => any ->function : () => any ->yield() { } : any ->() { } : () => void +>x : () => void +>function yield() { } : () => void +>yield : () => void }; } @@ -68,21 +65,17 @@ async function * f11() { >f11 : () => AsyncGenerator function await() { -> : () => any ->await() : any ->() : any -> : any +>await : () => void } } === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts === async function * f12() { ->f12 : () => AsyncGenerator<() => void, void, unknown> +>f12 : () => AsyncGenerator const x = function yield() { ->x : () => any ->function : () => any ->yield() { } : any ->() { } : () => void +>x : () => void +>function yield() { } : () => void +>yield : () => void }; } diff --git a/tests/baselines/reference/parser.asyncGenerators.functionExpressions.es2018.errors.txt b/tests/baselines/reference/parser.asyncGenerators.functionExpressions.es2018.errors.txt index 43d2eb414b213..298b24e1bf05d 100644 --- a/tests/baselines/reference/parser.asyncGenerators.functionExpressions.es2018.errors.txt +++ b/tests/baselines/reference/parser.asyncGenerators.functionExpressions.es2018.errors.txt @@ -1,79 +1,39 @@ tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitInParameterInitializerIsError.ts(1,34): error TS2524: 'await' expressions cannot be used in a parameter initializer. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitMissingValueIsError.ts(2,10): error TS1109: Expression expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitNameIsError.ts(1,29): error TS1005: '(' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitNameIsError.ts(1,29): error TS2451: Cannot redeclare block-scoped variable 'await'. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitNameIsError.ts(1,34): error TS1005: ',' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitNameIsError.ts(1,37): error TS1005: '=>' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(1,30): error TS1138: Parameter declaration expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(1,30): error TS2451: Cannot redeclare block-scoped variable 'await'. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(1,35): error TS1005: ',' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(2,14): error TS1003: Identifier expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(2,20): error TS1109: Expression expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(2,22): error TS1005: ';' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts(2,14): error TS1003: Identifier expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts(2,22): error TS1005: '=>' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts(2,24): error TS1005: '(' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts(2,30): error TS1109: Expression expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts(2,32): error TS1005: ';' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts(2,24): error TS1005: '(' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts(2,32): error TS1005: '=>' expected. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitNameIsError.ts(1,29): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(1,30): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(2,14): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts(2,14): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts(2,24): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts(2,24): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldInParameterInitializerIsError.ts(1,34): error TS2523: 'yield' expressions cannot be used in a parameter initializer. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldNameIsError.ts(1,29): error TS1005: '(' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldNameIsError.ts(1,29): error TS2451: Cannot redeclare block-scoped variable 'yield'. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldNameIsError.ts(1,34): error TS1005: ',' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldNameIsError.ts(1,37): error TS1005: '=>' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(1,30): error TS1138: Parameter declaration expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(1,30): error TS2451: Cannot redeclare block-scoped variable 'yield'. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(1,35): error TS1005: ',' expected. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldNameIsError.ts(1,29): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(1,30): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldStarMissingValueIsError.ts(2,12): error TS1109: Expression expected. ==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/functionExpressionIsOk.ts (0 errors) ==== const f1 = async function * f() { }; -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitNameIsError.ts (4 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitNameIsError.ts (1 errors) ==== const f2 = async function * await() { ~~~~~ -!!! error TS1005: '(' expected. - ~~~~~ -!!! error TS2451: Cannot redeclare block-scoped variable 'await'. -!!! related TS6203 tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts:1:30: 'await' was also declared here. - ~ -!!! error TS1005: ',' expected. - ~ -!!! error TS1005: '=>' expected. - }; -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldNameIsError.ts (4 errors) ==== +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. + }; +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldNameIsError.ts (1 errors) ==== const f3 = async function * yield() { ~~~~~ -!!! error TS1005: '(' expected. - ~~~~~ -!!! error TS2451: Cannot redeclare block-scoped variable 'yield'. -!!! related TS6203 tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts:1:30: 'yield' was also declared here. - ~ -!!! error TS1005: ',' expected. - ~ -!!! error TS1005: '=>' expected. - }; -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts (3 errors) ==== +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. + }; +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts (1 errors) ==== const f4 = async function * (await) { ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~~~~~ -!!! error TS2451: Cannot redeclare block-scoped variable 'await'. -!!! related TS6203 tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitNameIsError.ts:1:29: 'await' was also declared here. - ~ -!!! error TS1005: ',' expected. +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. }; -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts (3 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts (1 errors) ==== const f5 = async function * (yield) { ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~~~~~ -!!! error TS2451: Cannot redeclare block-scoped variable 'yield'. -!!! related TS6203 tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldNameIsError.ts:1:29: 'yield' was also declared here. - ~ -!!! error TS1005: ',' expected. +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. }; ==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitInParameterInitializerIsError.ts (1 errors) ==== const f6 = async function * (a = await 1) { @@ -90,44 +50,32 @@ tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldStarMissingVa async function * g() { } }; -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts (1 errors) ==== const f9 = async function * () { function yield() { ~~~~~ -!!! error TS1003: Identifier expected. - ~ -!!! error TS1005: '=>' expected. +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. } }; -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts (1 errors) ==== const f10 = async function * () { const x = function yield() { ~~~~~ -!!! error TS1005: '(' expected. - ~ -!!! error TS1005: '=>' expected. +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. }; }; -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts (3 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts (1 errors) ==== const f11 = async function * () { function await() { ~~~~~ -!!! error TS1003: Identifier expected. - ~ -!!! error TS1109: Expression expected. - ~ -!!! error TS1005: ';' expected. +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. } }; -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts (3 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts (1 errors) ==== const f12 = async function * () { const x = function await() { ~~~~~ -!!! error TS1005: '(' expected. - ~ -!!! error TS1109: Expression expected. - ~ -!!! error TS1005: ';' expected. +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. }; }; ==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldIsOk.ts (0 errors) ==== diff --git a/tests/baselines/reference/parser.asyncGenerators.functionExpressions.es2018.symbols b/tests/baselines/reference/parser.asyncGenerators.functionExpressions.es2018.symbols index b914ecf1eaf16..67d1da450c236 100644 --- a/tests/baselines/reference/parser.asyncGenerators.functionExpressions.es2018.symbols +++ b/tests/baselines/reference/parser.asyncGenerators.functionExpressions.es2018.symbols @@ -7,13 +7,13 @@ const f1 = async function * f() { === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitNameIsError.ts === const f2 = async function * await() { >f2 : Symbol(f2, Decl(awaitNameIsError.ts, 0, 5)) ->await : Symbol(await, Decl(awaitNameIsError.ts, 0, 27), Decl(awaitAsTypeIsOk.ts, 0, 0)) +>await : Symbol(await, Decl(awaitNameIsError.ts, 0, 10)) }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldNameIsError.ts === const f3 = async function * yield() { >f3 : Symbol(f3, Decl(yieldNameIsError.ts, 0, 5)) ->yield : Symbol(yield, Decl(yieldNameIsError.ts, 0, 27), Decl(yieldAsTypeIsOk.ts, 0, 0)) +>yield : Symbol(yield, Decl(yieldNameIsError.ts, 0, 10)) }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts === @@ -53,7 +53,7 @@ const f9 = async function * () { >f9 : Symbol(f9, Decl(nestedFunctionDeclarationNamedYieldIsError.ts, 0, 5)) function yield() { -> : Symbol((Missing), Decl(nestedFunctionDeclarationNamedYieldIsError.ts, 0, 32)) +>yield : Symbol(yield, Decl(nestedFunctionDeclarationNamedYieldIsError.ts, 0, 32)) } }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts === @@ -62,6 +62,7 @@ const f10 = async function * () { const x = function yield() { >x : Symbol(x, Decl(nestedFunctionExpressionNamedYieldIsError.ts, 1, 9)) +>yield : Symbol(yield, Decl(nestedFunctionExpressionNamedYieldIsError.ts, 1, 13)) }; }; @@ -70,7 +71,7 @@ const f11 = async function * () { >f11 : Symbol(f11, Decl(nestedFunctionDeclarationNamedAwaitIsError.ts, 0, 5)) function await() { -> : Symbol((Missing), Decl(nestedFunctionDeclarationNamedAwaitIsError.ts, 0, 33)) +>await : Symbol(await, Decl(nestedFunctionDeclarationNamedAwaitIsError.ts, 0, 33)) } }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts === @@ -79,6 +80,7 @@ const f12 = async function * () { const x = function await() { >x : Symbol(x, Decl(nestedFunctionExpressionNamedAwaitIsError.ts, 1, 9)) +>await : Symbol(await, Decl(nestedFunctionExpressionNamedAwaitIsError.ts, 1, 13)) }; }; @@ -120,26 +122,26 @@ const f18 = async function * () { }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitAsTypeIsOk.ts === interface await {} ->await : Symbol(await, Decl(awaitNameIsError.ts, 0, 27), Decl(awaitAsTypeIsOk.ts, 0, 0)) +>await : Symbol(await, Decl(awaitAsTypeIsOk.ts, 0, 0)) const f19 = async function * () { >f19 : Symbol(f19, Decl(awaitAsTypeIsOk.ts, 1, 5)) let x: await; >x : Symbol(x, Decl(awaitAsTypeIsOk.ts, 2, 7)) ->await : Symbol(await, Decl(awaitNameIsError.ts, 0, 27), Decl(awaitAsTypeIsOk.ts, 0, 0)) +>await : Symbol(await, Decl(awaitAsTypeIsOk.ts, 0, 0)) }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldAsTypeIsOk.ts === interface yield {} ->yield : Symbol(yield, Decl(yieldNameIsError.ts, 0, 27), Decl(yieldAsTypeIsOk.ts, 0, 0)) +>yield : Symbol(yield, Decl(yieldAsTypeIsOk.ts, 0, 0)) const f20 = async function * () { >f20 : Symbol(f20, Decl(yieldAsTypeIsOk.ts, 1, 5)) let x: yield; >x : Symbol(x, Decl(yieldAsTypeIsOk.ts, 2, 7)) ->yield : Symbol(yield, Decl(yieldNameIsError.ts, 0, 27), Decl(yieldAsTypeIsOk.ts, 0, 0)) +>yield : Symbol(yield, Decl(yieldAsTypeIsOk.ts, 0, 0)) }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldInNestedComputedPropertyIsOk.ts === diff --git a/tests/baselines/reference/parser.asyncGenerators.functionExpressions.es2018.types b/tests/baselines/reference/parser.asyncGenerators.functionExpressions.es2018.types index 0af07dc220f33..071b5834b3ed8 100644 --- a/tests/baselines/reference/parser.asyncGenerators.functionExpressions.es2018.types +++ b/tests/baselines/reference/parser.asyncGenerators.functionExpressions.es2018.types @@ -7,31 +7,29 @@ const f1 = async function * f() { }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitNameIsError.ts === const f2 = async function * await() { ->f2 : () => any ->async function * : () => any ->await : any ->() {} : () => void +>f2 : () => AsyncGenerator +>async function * await() {} : () => AsyncGenerator +>await : () => AsyncGenerator }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldNameIsError.ts === const f3 = async function * yield() { ->f3 : () => any ->async function * : () => any ->yield : any ->() {} : () => void +>f3 : () => AsyncGenerator +>async function * yield() {} : () => AsyncGenerator +>yield : () => AsyncGenerator }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts === const f4 = async function * (await) { ->f4 : () => any ->async function * ( : () => any +>f4 : (await: any) => AsyncGenerator +>async function * (await) {} : (await: any) => AsyncGenerator >await : any }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts === const f5 = async function * (yield) { ->f5 : () => any ->async function * ( : () => any +>f5 : (yield: any) => AsyncGenerator +>async function * (yield) {} : (yield: any) => AsyncGenerator >yield : any }; @@ -63,25 +61,22 @@ const f8 = async function * () { }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts === const f9 = async function * () { ->f9 : () => AsyncGenerator<() => void, void, unknown> ->async function * () { function yield() { }} : () => AsyncGenerator<() => void, void, unknown> +>f9 : () => AsyncGenerator +>async function * () { function yield() { }} : () => AsyncGenerator function yield() { -> : () => any ->yield() { } : any ->() { } : () => void +>yield : () => void } }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts === const f10 = async function * () { ->f10 : () => AsyncGenerator<() => void, void, unknown> ->async function * () { const x = function yield() { };} : () => AsyncGenerator<() => void, void, unknown> +>f10 : () => AsyncGenerator +>async function * () { const x = function yield() { };} : () => AsyncGenerator const x = function yield() { ->x : () => any ->function : () => any ->yield() { } : any ->() { } : () => void +>x : () => void +>function yield() { } : () => void +>yield : () => void }; }; @@ -91,10 +86,7 @@ const f11 = async function * () { >async function * () { function await() { }} : () => AsyncGenerator function await() { -> : () => any ->await() : any ->() : any -> : any +>await : () => void } }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts === @@ -103,11 +95,9 @@ const f12 = async function * () { >async function * () { const x = function await() { };} : () => AsyncGenerator const x = function await() { ->x : () => any ->function : () => any ->await() : any ->() : any -> : any +>x : () => void +>function await() { } : () => void +>await : () => void }; }; diff --git a/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.es2018.errors.txt b/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.es2018.errors.txt index e0f8adbab15a2..d64ea22f8b2fa 100644 --- a/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.es2018.errors.txt +++ b/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.es2018.errors.txt @@ -3,27 +3,13 @@ tests/cases/conformance/parser/ecmascript2018/asyncGenerators/asyncGeneratorProp tests/cases/conformance/parser/ecmascript2018/asyncGenerators/asyncGeneratorSetAccessorIsError.ts(2,17): error TS1005: '(' expected. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitInParameterInitializerIsError.ts(2,19): error TS2524: 'await' expressions cannot be used in a parameter initializer. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitMissingValueIsError.ts(3,14): error TS1109: Expression expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(2,15): error TS1138: Parameter declaration expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(2,15): error TS2693: 'await' only refers to a type, but is being used as a value here. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(2,20): error TS1005: ',' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(2,22): error TS1136: Property assignment expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(4,1): error TS1128: Declaration or statement expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(3,18): error TS1003: Identifier expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(3,24): error TS1109: Expression expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(3,26): error TS1005: ';' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts(3,18): error TS1003: Identifier expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts(3,26): error TS1005: '=>' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts(3,28): error TS1005: '(' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts(3,34): error TS1109: Expression expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts(3,36): error TS1005: ';' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts(3,28): error TS1005: '(' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts(3,36): error TS1005: '=>' expected. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts(2,15): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts(3,18): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts(3,18): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts(3,28): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts(3,28): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldInParameterInitializerIsError.ts(2,19): error TS2523: 'yield' expressions cannot be used in a parameter initializer. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(2,15): error TS1138: Parameter declaration expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(2,15): error TS2693: 'yield' only refers to a type, but is being used as a value here. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(2,20): error TS1005: ',' expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(2,22): error TS1136: Property assignment expected. -tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(4,1): error TS1128: Declaration or statement expected. +tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts(2,15): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldStarMissingValueIsError.ts(3,16): error TS1109: Expression expected. @@ -42,36 +28,20 @@ tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldStarMissingVa async * yield() { } }; -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts (5 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts (1 errors) ==== const o4 = { async * f(await) { ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~~~~~ -!!! error TS2693: 'await' only refers to a type, but is being used as a value here. - ~ -!!! error TS1005: ',' expected. - ~ -!!! error TS1136: Property assignment expected. +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. } }; - ~ -!!! error TS1128: Declaration or statement expected. -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts (5 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts (1 errors) ==== const o5 = { async * f(yield) { ~~~~~ -!!! error TS1138: Parameter declaration expected. - ~~~~~ -!!! error TS2693: 'yield' only refers to a type, but is being used as a value here. - ~ -!!! error TS1005: ',' expected. - ~ -!!! error TS1136: Property assignment expected. +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. } }; - ~ -!!! error TS1128: Declaration or statement expected. ==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitInParameterInitializerIsError.ts (1 errors) ==== const o6 = { async * f(a = await 1) { @@ -93,51 +63,39 @@ tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldStarMissingVa } } }; -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts (1 errors) ==== const o9 = { async * f() { function yield() { ~~~~~ -!!! error TS1003: Identifier expected. - ~ -!!! error TS1005: '=>' expected. +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. } } }; -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts (1 errors) ==== const o10 = { async * f() { const x = function yield() { ~~~~~ -!!! error TS1005: '(' expected. - ~ -!!! error TS1005: '=>' expected. +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. }; } }; -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts (3 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedAwaitIsError.ts (1 errors) ==== const o11 = { async * f() { function await() { ~~~~~ -!!! error TS1003: Identifier expected. - ~ -!!! error TS1109: Expression expected. - ~ -!!! error TS1005: ';' expected. +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. } } }; -==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts (3 errors) ==== +==== tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedAwaitIsError.ts (1 errors) ==== const o12 = { async * f() { const x = function await() { ~~~~~ -!!! error TS1005: '(' expected. - ~ -!!! error TS1109: Expression expected. - ~ -!!! error TS1005: ';' expected. +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. }; } }; diff --git a/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.es2018.symbols b/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.es2018.symbols index acc79db8e8e0b..57d16f0ee8393 100644 --- a/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.es2018.symbols +++ b/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.es2018.symbols @@ -78,7 +78,7 @@ const o9 = { >f : Symbol(f, Decl(nestedFunctionDeclarationNamedYieldIsError.ts, 0, 12)) function yield() { -> : Symbol((Missing), Decl(nestedFunctionDeclarationNamedYieldIsError.ts, 1, 17)) +>yield : Symbol(yield, Decl(nestedFunctionDeclarationNamedYieldIsError.ts, 1, 17)) } } }; @@ -91,6 +91,7 @@ const o10 = { const x = function yield() { >x : Symbol(x, Decl(nestedFunctionExpressionNamedYieldIsError.ts, 2, 13)) +>yield : Symbol(yield, Decl(nestedFunctionExpressionNamedYieldIsError.ts, 2, 17)) }; } @@ -103,7 +104,7 @@ const o11 = { >f : Symbol(f, Decl(nestedFunctionDeclarationNamedAwaitIsError.ts, 0, 13)) function await() { -> : Symbol((Missing), Decl(nestedFunctionDeclarationNamedAwaitIsError.ts, 1, 17)) +>await : Symbol(await, Decl(nestedFunctionDeclarationNamedAwaitIsError.ts, 1, 17)) } } }; @@ -116,6 +117,7 @@ const o12 = { const x = function await() { >x : Symbol(x, Decl(nestedFunctionExpressionNamedAwaitIsError.ts, 2, 13)) +>await : Symbol(await, Decl(nestedFunctionExpressionNamedAwaitIsError.ts, 2, 17)) }; } diff --git a/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.es2018.types b/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.es2018.types index 5a6ea2a19fb81..b9ec519e0e918 100644 --- a/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.es2018.types +++ b/tests/baselines/reference/parser.asyncGenerators.objectLiteralMethods.es2018.types @@ -27,21 +27,21 @@ const o3 = { }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/awaitParameterIsError.ts === const o4 = { ->o4 : { f(): any; await: any; } ->{ async * f(await) : { f(): any; await: any; } +>o4 : { f(await: any): AsyncGenerator; } +>{ async * f(await) { }} : { f(await: any): AsyncGenerator; } async * f(await) { ->f : () => any +>f : (await: any) => AsyncGenerator >await : any } }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/yieldParameterIsError.ts === const o5 = { ->o5 : { f(): any; yield: any; } ->{ async * f(yield) : { f(): any; yield: any; } +>o5 : { f(yield: any): AsyncGenerator; } +>{ async * f(yield) { }} : { f(yield: any): AsyncGenerator; } async * f(yield) { ->f : () => any +>f : (yield: any) => AsyncGenerator >yield : any } }; @@ -83,32 +83,29 @@ const o8 = { }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionDeclarationNamedYieldIsError.ts === const o9 = { ->o9 : { f(): AsyncGenerator<() => void, void, unknown>; } ->{ async * f() { function yield() { } }} : { f(): AsyncGenerator<() => void, void, unknown>; } +>o9 : { f(): AsyncGenerator; } +>{ async * f() { function yield() { } }} : { f(): AsyncGenerator; } async * f() { ->f : () => AsyncGenerator<() => void, void, unknown> +>f : () => AsyncGenerator function yield() { -> : () => any ->yield() { } : any ->() { } : () => void +>yield : () => void } } }; === tests/cases/conformance/parser/ecmascript2018/asyncGenerators/nestedFunctionExpressionNamedYieldIsError.ts === const o10 = { ->o10 : { f(): AsyncGenerator<() => void, void, unknown>; } ->{ async * f() { const x = function yield() { }; }} : { f(): AsyncGenerator<() => void, void, unknown>; } +>o10 : { f(): AsyncGenerator; } +>{ async * f() { const x = function yield() { }; }} : { f(): AsyncGenerator; } async * f() { ->f : () => AsyncGenerator<() => void, void, unknown> +>f : () => AsyncGenerator const x = function yield() { ->x : () => any ->function : () => any ->yield() { } : any ->() { } : () => void +>x : () => void +>function yield() { } : () => void +>yield : () => void }; } @@ -122,10 +119,7 @@ const o11 = { >f : () => AsyncGenerator function await() { -> : () => any ->await() : any ->() : any -> : any +>await : () => void } } }; @@ -138,11 +132,9 @@ const o12 = { >f : () => AsyncGenerator const x = function await() { ->x : () => any ->function : () => any ->await() : any ->() : any -> : any +>x : () => void +>function await() { } : () => void +>await : () => void }; } diff --git a/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).errors.txt b/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).errors.txt index b0eb67d7c7d48..659262179f7f0 100644 --- a/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).errors.txt +++ b/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).errors.txt @@ -59,6 +59,19 @@ tests/cases/conformance/externalModules/index.ts(46,3): error TS1378: Top-level // await allowed in aliased import import { await as _await } from "./other"; + // newlines + // await in throw + throw await + 1; + + // await in var + let y = await + 1; + + // await in expression statement; + await + 1; + ==== tests/cases/conformance/externalModules/other.ts (0 errors) ==== const _await = 1; diff --git a/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).js b/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).js index 55c20cc289c5d..5cf6aa277f641 100644 --- a/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).js +++ b/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).js @@ -52,6 +52,19 @@ class C { // await allowed in aliased import import { await as _await } from "./other"; + +// newlines +// await in throw +throw await + 1; + +// await in var +let y = await + 1; + +// await in expression statement; +await + 1; //// [other.ts] const _await = 1; @@ -106,3 +119,10 @@ let C = class C { C = __decorate([ (await dec) ], C); +// newlines +// await in throw +throw await 1; +// await in var +let y = await 1; +// await in expression statement; +await 1; diff --git a/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).symbols b/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).symbols index 992258ff5dfdf..ed823db8bc9ee 100644 --- a/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).symbols +++ b/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).symbols @@ -102,6 +102,21 @@ import { await as _await } from "./other"; >await : Symbol(await, Decl(other.ts, 3, 8)) >_await : Symbol(_await, Decl(index.ts, 50, 8)) +// newlines +// await in throw +throw await + 1; + +// await in var +let y = await +>y : Symbol(y, Decl(index.ts, 58, 3)) + + 1; + +// await in expression statement; +await + 1; + === tests/cases/conformance/externalModules/other.ts === const _await = 1; >_await : Symbol(_await, Decl(other.ts, 0, 5)) diff --git a/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).types b/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).types index b2a82b1bea73a..3d24af5ccdeeb 100644 --- a/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).types +++ b/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2015).types @@ -143,6 +143,29 @@ import { await as _await } from "./other"; >await : 1 >_await : 1 +// newlines +// await in throw +throw await +>await 1 : 1 + + 1; +>1 : 1 + +// await in var +let y = await +>y : number +>await 1 : 1 + + 1; +>1 : 1 + +// await in expression statement; +await +>await 1 : 1 + + 1; +>1 : 1 + === tests/cases/conformance/externalModules/other.ts === const _await = 1; >_await : 1 diff --git a/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2017).js b/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2017).js index 55c20cc289c5d..5cf6aa277f641 100644 --- a/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2017).js +++ b/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2017).js @@ -52,6 +52,19 @@ class C { // await allowed in aliased import import { await as _await } from "./other"; + +// newlines +// await in throw +throw await + 1; + +// await in var +let y = await + 1; + +// await in expression statement; +await + 1; //// [other.ts] const _await = 1; @@ -106,3 +119,10 @@ let C = class C { C = __decorate([ (await dec) ], C); +// newlines +// await in throw +throw await 1; +// await in var +let y = await 1; +// await in expression statement; +await 1; diff --git a/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2017).symbols b/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2017).symbols index 992258ff5dfdf..ed823db8bc9ee 100644 --- a/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2017).symbols +++ b/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2017).symbols @@ -102,6 +102,21 @@ import { await as _await } from "./other"; >await : Symbol(await, Decl(other.ts, 3, 8)) >_await : Symbol(_await, Decl(index.ts, 50, 8)) +// newlines +// await in throw +throw await + 1; + +// await in var +let y = await +>y : Symbol(y, Decl(index.ts, 58, 3)) + + 1; + +// await in expression statement; +await + 1; + === tests/cases/conformance/externalModules/other.ts === const _await = 1; >_await : Symbol(_await, Decl(other.ts, 0, 5)) diff --git a/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2017).types b/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2017).types index b2a82b1bea73a..3d24af5ccdeeb 100644 --- a/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2017).types +++ b/tests/baselines/reference/topLevelAwait.1(module=esnext,target=es2017).types @@ -143,6 +143,29 @@ import { await as _await } from "./other"; >await : 1 >_await : 1 +// newlines +// await in throw +throw await +>await 1 : 1 + + 1; +>1 : 1 + +// await in var +let y = await +>y : number +>await 1 : 1 + + 1; +>1 : 1 + +// await in expression statement; +await +>await 1 : 1 + + 1; +>1 : 1 + === tests/cases/conformance/externalModules/other.ts === const _await = 1; >_await : 1 diff --git a/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).errors.txt b/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).errors.txt index b0eb67d7c7d48..659262179f7f0 100644 --- a/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).errors.txt +++ b/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).errors.txt @@ -59,6 +59,19 @@ tests/cases/conformance/externalModules/index.ts(46,3): error TS1378: Top-level // await allowed in aliased import import { await as _await } from "./other"; + // newlines + // await in throw + throw await + 1; + + // await in var + let y = await + 1; + + // await in expression statement; + await + 1; + ==== tests/cases/conformance/externalModules/other.ts (0 errors) ==== const _await = 1; diff --git a/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).js b/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).js index 172e302f2418e..082a4d2188e1a 100644 --- a/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).js +++ b/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).js @@ -52,6 +52,19 @@ class C { // await allowed in aliased import import { await as _await } from "./other"; + +// newlines +// await in throw +throw await + 1; + +// await in var +let y = await + 1; + +// await in expression statement; +await + 1; //// [other.ts] const _await = 1; @@ -75,7 +88,7 @@ System.register([], function (exports_1, context_1) { //// [index.js] System.register([], function (exports_1, context_1) { "use strict"; - var x, C1, C2, C3, C; + var x, C1, C2, C3, C, y; var __moduleName = context_1 && context_1.id; return { setters: [], @@ -122,6 +135,13 @@ System.register([], function (exports_1, context_1) { C = __decorate([ (await dec) ], C); + // newlines + // await in throw + throw await 1; + // await in var + y = await 1; + // await in expression statement; + await 1; } }; }); diff --git a/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).symbols b/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).symbols index 992258ff5dfdf..ed823db8bc9ee 100644 --- a/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).symbols +++ b/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).symbols @@ -102,6 +102,21 @@ import { await as _await } from "./other"; >await : Symbol(await, Decl(other.ts, 3, 8)) >_await : Symbol(_await, Decl(index.ts, 50, 8)) +// newlines +// await in throw +throw await + 1; + +// await in var +let y = await +>y : Symbol(y, Decl(index.ts, 58, 3)) + + 1; + +// await in expression statement; +await + 1; + === tests/cases/conformance/externalModules/other.ts === const _await = 1; >_await : Symbol(_await, Decl(other.ts, 0, 5)) diff --git a/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).types b/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).types index b2a82b1bea73a..3d24af5ccdeeb 100644 --- a/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).types +++ b/tests/baselines/reference/topLevelAwait.1(module=system,target=es2015).types @@ -143,6 +143,29 @@ import { await as _await } from "./other"; >await : 1 >_await : 1 +// newlines +// await in throw +throw await +>await 1 : 1 + + 1; +>1 : 1 + +// await in var +let y = await +>y : number +>await 1 : 1 + + 1; +>1 : 1 + +// await in expression statement; +await +>await 1 : 1 + + 1; +>1 : 1 + === tests/cases/conformance/externalModules/other.ts === const _await = 1; >_await : 1 diff --git a/tests/baselines/reference/topLevelAwait.1(module=system,target=es2017).js b/tests/baselines/reference/topLevelAwait.1(module=system,target=es2017).js index 172e302f2418e..082a4d2188e1a 100644 --- a/tests/baselines/reference/topLevelAwait.1(module=system,target=es2017).js +++ b/tests/baselines/reference/topLevelAwait.1(module=system,target=es2017).js @@ -52,6 +52,19 @@ class C { // await allowed in aliased import import { await as _await } from "./other"; + +// newlines +// await in throw +throw await + 1; + +// await in var +let y = await + 1; + +// await in expression statement; +await + 1; //// [other.ts] const _await = 1; @@ -75,7 +88,7 @@ System.register([], function (exports_1, context_1) { //// [index.js] System.register([], function (exports_1, context_1) { "use strict"; - var x, C1, C2, C3, C; + var x, C1, C2, C3, C, y; var __moduleName = context_1 && context_1.id; return { setters: [], @@ -122,6 +135,13 @@ System.register([], function (exports_1, context_1) { C = __decorate([ (await dec) ], C); + // newlines + // await in throw + throw await 1; + // await in var + y = await 1; + // await in expression statement; + await 1; } }; }); diff --git a/tests/baselines/reference/topLevelAwait.1(module=system,target=es2017).symbols b/tests/baselines/reference/topLevelAwait.1(module=system,target=es2017).symbols index 992258ff5dfdf..ed823db8bc9ee 100644 --- a/tests/baselines/reference/topLevelAwait.1(module=system,target=es2017).symbols +++ b/tests/baselines/reference/topLevelAwait.1(module=system,target=es2017).symbols @@ -102,6 +102,21 @@ import { await as _await } from "./other"; >await : Symbol(await, Decl(other.ts, 3, 8)) >_await : Symbol(_await, Decl(index.ts, 50, 8)) +// newlines +// await in throw +throw await + 1; + +// await in var +let y = await +>y : Symbol(y, Decl(index.ts, 58, 3)) + + 1; + +// await in expression statement; +await + 1; + === tests/cases/conformance/externalModules/other.ts === const _await = 1; >_await : Symbol(_await, Decl(other.ts, 0, 5)) diff --git a/tests/baselines/reference/topLevelAwait.1(module=system,target=es2017).types b/tests/baselines/reference/topLevelAwait.1(module=system,target=es2017).types index b2a82b1bea73a..3d24af5ccdeeb 100644 --- a/tests/baselines/reference/topLevelAwait.1(module=system,target=es2017).types +++ b/tests/baselines/reference/topLevelAwait.1(module=system,target=es2017).types @@ -143,6 +143,29 @@ import { await as _await } from "./other"; >await : 1 >_await : 1 +// newlines +// await in throw +throw await +>await 1 : 1 + + 1; +>1 : 1 + +// await in var +let y = await +>y : number +>await 1 : 1 + + 1; +>1 : 1 + +// await in expression statement; +await +>await 1 : 1 + + 1; +>1 : 1 + === tests/cases/conformance/externalModules/other.ts === const _await = 1; >_await : 1 diff --git a/tests/baselines/reference/topLevelAwaitErrors.1.errors.txt b/tests/baselines/reference/topLevelAwaitErrors.1.errors.txt index d2e7ffcb15a17..773e8446a6fda 100644 --- a/tests/baselines/reference/topLevelAwaitErrors.1.errors.txt +++ b/tests/baselines/reference/topLevelAwaitErrors.1.errors.txt @@ -5,8 +5,12 @@ tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(5,16): error TS tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(8,14): error TS1005: '>' expected. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(8,16): error TS2693: 'string' only refers to a type, but is being used as a value here. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(11,17): error TS1109: Expression expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(11,22): error TS1109: Expression expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(11,23): error TS2693: 'string' only refers to a type, but is being used as a value here. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(11,29): error TS1005: ',' expected. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(15,8): error TS1109: Expression expected. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(18,2): error TS1109: Expression expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(18,8): error TS2304: Cannot find name 'x'. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(21,2): error TS1109: Expression expected. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(26,6): error TS1109: Expression expected. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(30,6): error TS1109: Expression expected. @@ -16,7 +20,7 @@ tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(41,14): error T tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,20): error TS1109: Expression expected. -==== tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts (16 errors) ==== +==== tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts (20 errors) ==== export {}; // reparse call as invalid await should error @@ -42,6 +46,12 @@ tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,20): error T class C extends await { ~~~~~ !!! error TS1109: Expression expected. + ~ +!!! error TS1109: Expression expected. + ~~~~~~ +!!! error TS2693: 'string' only refers to a type, but is being used as a value here. + ~ +!!! error TS1005: ',' expected. } // await in class decorators should fail @@ -53,6 +63,8 @@ tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,20): error T @await(x) ~~~~~ !!! error TS1109: Expression expected. + ~ +!!! error TS2304: Cannot find name 'x'. class C2 {} @await diff --git a/tests/baselines/reference/topLevelAwaitErrors.1.js b/tests/baselines/reference/topLevelAwaitErrors.1.js index 566c86afe4929..175321a0513f8 100644 --- a/tests/baselines/reference/topLevelAwaitErrors.1.js +++ b/tests/baselines/reference/topLevelAwaitErrors.1.js @@ -51,7 +51,7 @@ await , string > (1); // reparse tagged template as invalid await should error await , string > ``; // reparse class extends clause should fail -class C extends { +class C extends string { } // await in class decorators should fail let C1 = class C1 { @@ -62,6 +62,7 @@ C1 = __decorate([ let C2 = class C2 { }; C2 = __decorate([ + (x) ], C2); let C3 = class C3 { }; @@ -77,6 +78,7 @@ class C5 { ["foo"]() { } } __decorate([ + (1) ], C5.prototype, "foo", null); class C6 { ["foo"]() { } @@ -94,7 +96,7 @@ __decorate([ __param(0, ) ], C7.prototype, "method1", null); __decorate([ - __param(0, ) + __param(0, (1)) ], C7.prototype, "method2", null); __decorate([ __param(0, (await )) diff --git a/tests/baselines/reference/topLevelAwaitErrors.1.types b/tests/baselines/reference/topLevelAwaitErrors.1.types index 5f3a5e323c722..7e8efc49dce7f 100644 --- a/tests/baselines/reference/topLevelAwaitErrors.1.types +++ b/tests/baselines/reference/topLevelAwaitErrors.1.types @@ -32,7 +32,7 @@ await ``; // reparse class extends clause should fail class C extends await { >C : C -> : any +>string : any } // await in class decorators should fail @@ -45,7 +45,9 @@ class C1 {} >C1 : C1 @await(x) +>await(x) : any > : any +>x : any class C2 {} >C2 : C2 @@ -71,7 +73,9 @@ class C5 { >C5 : C5 @await(1) +>await(1) : any > : any +>1 : 1 ["foo"]() {} >["foo"] : () => void @@ -101,7 +105,9 @@ class C7 { method2(@await(1) [x]) {} >method2 : ([x]: [any]) => void +>await(1) : any > : any +>1 : 1 >x : any method3(@(await) [x]) {} diff --git a/tests/cases/conformance/externalModules/topLevelAwait.1.ts b/tests/cases/conformance/externalModules/topLevelAwait.1.ts index dbee4b33013d3..afa8d4d1a2b43 100644 --- a/tests/cases/conformance/externalModules/topLevelAwait.1.ts +++ b/tests/cases/conformance/externalModules/topLevelAwait.1.ts @@ -55,6 +55,19 @@ class C { // await allowed in aliased import import { await as _await } from "./other"; +// newlines +// await in throw +throw await + 1; + +// await in var +let y = await + 1; + +// await in expression statement; +await + 1; + // @filename: other.ts const _await = 1; From fd2ddfe12dfced992b1794b5bc63f6796c87e424 Mon Sep 17 00:00:00 2001 From: typescript-bot Date: Wed, 24 Jun 2020 00:42:37 +0000 Subject: [PATCH 2/2] Update LKG --- lib/tsc.js | 435 ++++++++++++++++++------------------ lib/tsserver.js | 456 +++++++++++++++++++------------------- lib/tsserverlibrary.js | 456 +++++++++++++++++++------------------- lib/typescript.js | 456 +++++++++++++++++++------------------- lib/typescriptServices.js | 456 +++++++++++++++++++------------------- lib/typingsInstaller.js | 456 +++++++++++++++++++------------------- 6 files changed, 1363 insertions(+), 1352 deletions(-) diff --git a/lib/tsc.js b/lib/tsc.js index a2fe86e1943a6..95cac4d822a99 100644 --- a/lib/tsc.js +++ b/lib/tsc.js @@ -10551,6 +10551,14 @@ var ts; } } ts.getThisContainer = getThisContainer; + function isInTopLevelContext(node) { + if (ts.isIdentifier(node) && (ts.isClassDeclaration(node.parent) || ts.isFunctionDeclaration(node.parent)) && node.parent.name === node) { + node = node.parent; + } + var container = getThisContainer(node, true); + return ts.isSourceFile(container); + } + ts.isInTopLevelContext = isInTopLevelContext; function getNewTargetContainer(node) { var container = getThisContainer(node, false); if (container) { @@ -11639,13 +11647,7 @@ var ts; case 198: return parent.name === node; case 156: - if (parent.right === node) { - while (parent.kind === 156) { - parent = parent.parent; - } - return parent.kind === 175 || parent.kind === 172; - } - return false; + return parent.right === node; case 195: case 262: return parent.propertyName === node; @@ -22057,31 +22059,6 @@ var ts; createBaseNode: function (kind) { return countNode(new NodeConstructor(kind, 0, 0)); } }; var factory = ts.createNodeFactory(1 | 2 | 8, baseNodeFactory); - var reparseContext = { - get factory() { return factory; }, - enableEmitNotification: ts.notImplemented, - enableSubstitution: ts.notImplemented, - endLexicalEnvironment: ts.returnUndefined, - getCompilerOptions: ts.notImplemented, - getEmitHost: ts.notImplemented, - getEmitResolver: ts.notImplemented, - getEmitHelperFactory: ts.notImplemented, - setLexicalEnvironmentFlags: ts.noop, - getLexicalEnvironmentFlags: function () { return 0; }, - hoistFunctionDeclaration: ts.notImplemented, - hoistVariableDeclaration: ts.notImplemented, - addInitializationStatement: ts.notImplemented, - isEmitNotificationEnabled: ts.notImplemented, - isSubstitutionEnabled: ts.notImplemented, - onEmitNode: ts.notImplemented, - onSubstituteNode: ts.notImplemented, - readEmitHelpers: ts.notImplemented, - requestEmitHelper: ts.notImplemented, - resumeLexicalEnvironment: ts.noop, - startLexicalEnvironment: ts.noop, - suspendLexicalEnvironment: ts.noop, - addDiagnostic: ts.notImplemented, - }; var fileName; var sourceFlags; var sourceText; @@ -22099,6 +22076,7 @@ var ts; var parsingContext; var notParenthesizedArrow; var contextFlags; + var topLevel = true; var parseErrorBeforeNextFinishedNode = false; function parseSourceFile(fileName, sourceText, languageVersion, syntaxCursor, setParentNodes, scriptKind) { if (setParentNodes === void 0) { setParentNodes = false; } @@ -22210,6 +22188,7 @@ var ts; identifierCount = 0; nodeCount = 0; sourceFlags = 0; + topLevel = true; switch (scriptKind) { case 1: case 2: @@ -22243,6 +22222,7 @@ var ts; parsingContext = 0; identifiers = undefined; notParenthesizedArrow = undefined; + topLevel = true; } function parseSourceFileWorker(languageVersion, setParentNodes, scriptKind) { var isDeclarationFile = isDeclarationFileName(fileName); @@ -22289,105 +22269,89 @@ var ts; return node; } function reparseTopLevelAwait(sourceFile) { - return ts.visitEachChild(sourceFile, visitor, reparseContext); - function visitor(node) { - if (!(node.transformFlags & 8388608)) { - return node; - } - switch (node.kind) { - case 160: return reparseDecorator(node); - case 157: return reparseComputedPropertyName(node); - case 220: return reparseExpressionWithTypeArguments(node); - case 230: return reparseExpressionStatement(node); - case 231: return reparseIfStatement(node); - case 241: return reparseSwitchStatement(node); - case 240: return reparseWithStatement(node); - case 232: return reparseDoStatement(node); - case 233: return reparseWhileStatement(node); - case 234: return reparseForStatement(node); - case 235: return reparseForInStatement(node); - case 236: return reparseForOfStatement(node); - case 239: return reparseReturnStatement(node); - case 243: return reparseThrowStatement(node); - case 263: return reparseExportAssignment(node); - case 246: return reparseVariableDeclaration(node); - case 195: return reparseBindingElement(node); - default: return ts.visitEachChild(node, visitor, reparseContext); - } - } - function reparse(node, parse) { - if (node && node.transformFlags & 8388608) { - if (ts.isExpression(node)) { - return speculationHelper(function () { - scanner.setTextPos(node.pos); - var savedContextFlags = contextFlags; - contextFlags = node.flags & 25358336; + var savedSyntaxCursor = syntaxCursor; + var baseSyntaxCursor = IncrementalParser.createSyntaxCursor(sourceFile); + syntaxCursor = { currentNode: currentNode }; + var statements = []; + var savedParseDiagnostics = parseDiagnostics; + parseDiagnostics = []; + var pos = 0; + var start = findNextStatementWithAwait(sourceFile.statements, 0); + var _loop_3 = function () { + var prevStatement = sourceFile.statements[pos]; + var nextStatement = sourceFile.statements[start]; + ts.addRange(statements, sourceFile.statements, pos, start); + pos = findNextStatementWithoutAwait(sourceFile.statements, start); + var diagnosticStart = ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= prevStatement.pos; }); + var diagnosticEnd = diagnosticStart >= 0 ? ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= nextStatement.pos; }, diagnosticStart) : -1; + if (diagnosticStart >= 0) { + ts.addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart, diagnosticEnd >= 0 ? diagnosticEnd : undefined); + } + speculationHelper(function () { + var savedContextFlags = contextFlags; + contextFlags |= 32768; + scanner.setTextPos(nextStatement.pos); + nextToken(); + while (token() !== 1) { + var startPos = scanner.getStartPos(); + var statement = parseListElement(0, parseStatement); + statements.push(statement); + if (startPos === scanner.getStartPos()) { nextToken(); - var result = doInAwaitContext(parse); - contextFlags = savedContextFlags; - return result; - }, 2); + } + if (pos >= 0) { + var nonAwaitStatement = sourceFile.statements[pos]; + if (statement.end === nonAwaitStatement.pos) { + break; + } + if (statement.end > nonAwaitStatement.pos) { + pos = findNextStatementWithoutAwait(sourceFile.statements, pos + 1); + } + } } - return ts.visitEachChild(node, visitor, reparseContext); - } - return node; + contextFlags = savedContextFlags; + }, 2); + start = pos >= 0 ? findNextStatementWithAwait(sourceFile.statements, pos) : -1; + }; + while (start !== -1) { + _loop_3(); } - function update(updated, original) { - if (updated !== original) { - ts.setNodeFlags(updated, updated.flags | 32768); + if (pos >= 0) { + var prevStatement_1 = sourceFile.statements[pos]; + ts.addRange(statements, sourceFile.statements, pos); + var diagnosticStart = ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= prevStatement_1.pos; }); + if (diagnosticStart >= 0) { + ts.addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart); } - return updated; - } - function reparseExpressionStatement(node) { - return update(factory.updateExpressionStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseReturnStatement(node) { - return update(factory.updateReturnStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseThrowStatement(node) { - return update(factory.updateThrowStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseIfStatement(node) { - return update(factory.updateIfStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.thenStatement, visitor), ts.visitNode(node.elseStatement, visitor)), node); - } - function reparseSwitchStatement(node) { - return update(factory.updateSwitchStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.caseBlock, visitor)), node); - } - function reparseWithStatement(node) { - return update(factory.updateWithStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); } - function reparseDoStatement(node) { - return update(factory.updateDoStatement(node, ts.visitNode(node.statement, visitor), reparse(node.expression, parseExpression)), node); + syntaxCursor = savedSyntaxCursor; + return factory.updateSourceFile(sourceFile, ts.setTextRange(factory.createNodeArray(statements), sourceFile.statements)); + function containsPossibleTopLevelAwait(node) { + return !(node.flags & 32768) + && !!(node.transformFlags & 8388608); } - function reparseWhileStatement(node) { - return update(factory.updateWhileStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseForStatement(node) { - return update(factory.updateForStatement(node, reparse(node.initializer, parseExpression), reparse(node.condition, parseExpression), reparse(node.incrementor, parseExpression), ts.visitNode(node, visitor)), node); - } - function reparseForInStatement(node) { - return update(factory.updateForInStatement(node, reparse(node.initializer, parseExpression), reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseForOfStatement(node) { - return update(factory.updateForOfStatement(node, node.awaitModifier, reparse(node.initializer, parseExpression), reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseExportAssignment(node) { - return update(factory.updateExportAssignment(node, ts.visitNodes(node.decorators, visitor), node.modifiers, reparse(node.expression, parseExpression)), node); - } - function reparseExpressionWithTypeArguments(node) { - return update(factory.updateExpressionWithTypeArguments(node, reparse(node.expression, parseLeftHandSideExpressionOrHigher), node.typeArguments), node); - } - function reparseDecorator(node) { - return update(factory.updateDecorator(node, reparse(node.expression, parseLeftHandSideExpressionOrHigher)), node); - } - function reparseComputedPropertyName(node) { - return update(factory.updateComputedPropertyName(node, reparse(node.expression, parseExpression)), node); + function findNextStatementWithAwait(statements, start) { + for (var i = start; i < statements.length; i++) { + if (containsPossibleTopLevelAwait(statements[i])) { + return i; + } + } + return -1; } - function reparseVariableDeclaration(node) { - return update(factory.updateVariableDeclaration(node, ts.visitNode(node.name, visitor), node.exclamationToken, node.type, reparse(node.initializer, parseExpression)), node); + function findNextStatementWithoutAwait(statements, start) { + for (var i = start; i < statements.length; i++) { + if (!containsPossibleTopLevelAwait(statements[i])) { + return i; + } + } + return -1; } - function reparseBindingElement(node) { - return update(factory.updateBindingElement(node, node.dotDotDotToken, ts.visitNode(node.propertyName, visitor), ts.visitNode(node.name, visitor), reparse(node.initializer, parseExpression)), node); + function currentNode(position) { + var node = baseSyntaxCursor.currentNode(position); + if (topLevel && node && containsPossibleTopLevelAwait(node)) { + node.intersectsChange = true; + } + return node; } } function fixupParentReferences(rootNode) { @@ -22582,6 +22546,12 @@ var ts; function tryParse(callback) { return speculationHelper(callback, 0); } + function isBindingIdentifier() { + if (token() === 78) { + return true; + } + return token() > 115; + } function isIdentifier() { if (token() === 78) { return true; @@ -22734,6 +22704,9 @@ var ts; ts.Diagnostics.Identifier_expected; return createMissingNode(78, reportAtCurrentPosition, diagnosticMessage || defaultMessage, msgArg); } + function parseBindingIdentifier(privateIdentifierDiagnosticMessage) { + return createIdentifier(isBindingIdentifier(), undefined, privateIdentifierDiagnosticMessage); + } function parseIdentifier(diagnosticMessage, privateIdentifierDiagnosticMessage) { return createIdentifier(isIdentifier(), diagnosticMessage, privateIdentifierDiagnosticMessage); } @@ -22886,9 +22859,9 @@ var ts; return isIdentifier() && !isHeritageClauseExtendsOrImplementsKeyword(); } case 8: - return isIdentifierOrPrivateIdentifierOrPattern(); + return isBindingIdentifierOrPrivateIdentifierOrPattern(); case 10: - return token() === 27 || token() === 25 || isIdentifierOrPrivateIdentifierOrPattern(); + return token() === 27 || token() === 25 || isBindingIdentifierOrPrivateIdentifierOrPattern(); case 19: return isIdentifier(); case 15: @@ -23538,7 +23511,7 @@ var ts; } function isStartOfParameter(isJSDocParameter) { return token() === 25 || - isIdentifierOrPrivateIdentifierOrPattern() || + isBindingIdentifierOrPrivateIdentifierOrPattern() || ts.isModifierKind(token()) || token() === 59 || isStartOfType(!isJSDocParameter); @@ -23550,15 +23523,26 @@ var ts; } return name; } + function parseParameterInOuterAwaitContext() { + return parseParameterWorker(true); + } function parseParameter() { + return parseParameterWorker(false); + } + function parseParameterWorker(inOuterAwaitContext) { var pos = getNodePos(); var hasJSDoc = hasPrecedingJSDocComment(); if (token() === 107) { - var node = factory.createParameterDeclaration(undefined, undefined, undefined, createIdentifier(true), undefined, parseTypeAnnotation(), undefined); - return withJSDoc(finishNode(node, pos), hasJSDoc); + var node_1 = factory.createParameterDeclaration(undefined, undefined, undefined, createIdentifier(true), undefined, parseTypeAnnotation(), undefined); + return withJSDoc(finishNode(node_1, pos), hasJSDoc); } - var modifiers; - return withJSDoc(finishNode(factory.createParameterDeclaration(parseDecorators(), modifiers = parseModifiers(), parseOptionalToken(25), parseNameOfParameter(modifiers), parseOptionalToken(57), parseTypeAnnotation(), parseInitializer()), pos), hasJSDoc); + var decorators = inOuterAwaitContext ? doInAwaitContext(parseDecorators) : parseDecorators(); + var savedTopLevel = topLevel; + topLevel = false; + var modifiers = parseModifiers(); + var node = withJSDoc(finishNode(factory.createParameterDeclaration(decorators, modifiers, parseOptionalToken(25), parseNameOfParameter(modifiers), parseOptionalToken(57), parseTypeAnnotation(), parseInitializer()), pos), hasJSDoc); + topLevel = savedTopLevel; + return node; } function parseReturnType(returnToken, isType) { if (shouldParseReturnType(returnToken, isType)) { @@ -23587,7 +23571,7 @@ var ts; setAwaitContext(!!(flags & 2)); var parameters = flags & 32 ? parseDelimitedList(17, parseJSDocParameter) : - parseDelimitedList(16, parseParameter); + parseDelimitedList(16, savedAwaitContext ? parseParameterInOuterAwaitContext : parseParameter); setYieldContext(savedYieldContext); setAwaitContext(savedAwaitContext); return parameters; @@ -24480,9 +24464,13 @@ var ts; !isStartOfExpressionStatement()) { return parseFunctionBlock(16 | (isAsync ? 2 : 0)); } - return isAsync + var savedTopLevel = topLevel; + topLevel = false; + var node = isAsync ? doInAwaitContext(parseAssignmentExpressionOrHigher) : doOutsideOfAwaitContext(parseAssignmentExpressionOrHigher); + topLevel = savedTopLevel; + return node; } function parseConditionalExpressionRest(leftOperand, pos) { var questionToken = parseOptionalToken(57); @@ -25215,10 +25203,10 @@ var ts; var asteriskToken = parseOptionalToken(41); var isGenerator = asteriskToken ? 1 : 0; var isAsync = ts.some(modifiers, ts.isAsyncModifier) ? 2 : 0; - var name = isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalIdentifier) : - isGenerator ? doInYieldContext(parseOptionalIdentifier) : - isAsync ? doInAwaitContext(parseOptionalIdentifier) : - parseOptionalIdentifier(); + var name = isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalBindingIdentifier) : + isGenerator ? doInYieldContext(parseOptionalBindingIdentifier) : + isAsync ? doInAwaitContext(parseOptionalBindingIdentifier) : + parseOptionalBindingIdentifier(); var typeParameters = parseTypeParameters(); var parameters = parseParameters(isGenerator | isAsync); var type = parseReturnType(58, false); @@ -25229,8 +25217,8 @@ var ts; var node = factory.createFunctionExpression(modifiers, asteriskToken, name, typeParameters, parameters, type, body); return withJSDoc(finishNode(node, pos), hasJSDoc); } - function parseOptionalIdentifier() { - return isIdentifier() ? parseIdentifier() : undefined; + function parseOptionalBindingIdentifier() { + return isBindingIdentifier() ? parseBindingIdentifier() : undefined; } function parseNewExpressionOrNewDotTarget() { var pos = getNodePos(); @@ -25285,6 +25273,8 @@ var ts; setYieldContext(!!(flags & 1)); var savedAwaitContext = inAwaitContext(); setAwaitContext(!!(flags & 2)); + var savedTopLevel = topLevel; + topLevel = false; var saveDecoratorContext = inDecoratorContext(); if (saveDecoratorContext) { setDecoratorContext(false); @@ -25293,6 +25283,7 @@ var ts; if (saveDecoratorContext) { setDecoratorContext(true); } + topLevel = savedTopLevel; setYieldContext(savedYieldContext); setAwaitContext(savedAwaitContext); return block; @@ -25791,7 +25782,7 @@ var ts; function parseObjectBindingElement() { var pos = getNodePos(); var dotDotDotToken = parseOptionalToken(25); - var tokenIsIdentifier = isIdentifier(); + var tokenIsIdentifier = isBindingIdentifier(); var propertyName = parsePropertyName(); var name; if (tokenIsIdentifier && token() !== 58) { @@ -25819,11 +25810,11 @@ var ts; parseExpected(23); return finishNode(factory.createArrayBindingPattern(elements), pos); } - function isIdentifierOrPrivateIdentifierOrPattern() { + function isBindingIdentifierOrPrivateIdentifierOrPattern() { return token() === 18 || token() === 22 || token() === 79 - || isIdentifier(); + || isBindingIdentifier(); } function parseIdentifierOrPattern(privateIdentifierDiagnosticMessage) { if (token() === 22) { @@ -25832,7 +25823,7 @@ var ts; if (token() === 18) { return parseObjectBindingPattern(); } - return parseIdentifier(undefined, privateIdentifierDiagnosticMessage); + return parseBindingIdentifier(privateIdentifierDiagnosticMessage); } function parseVariableDeclarationAllowExclamation() { return parseVariableDeclaration(true); @@ -25893,7 +25884,7 @@ var ts; var modifierFlags = ts.modifiersToFlags(modifiers); parseExpected(97); var asteriskToken = parseOptionalToken(41); - var name = modifierFlags & 512 ? parseOptionalIdentifier() : parseIdentifier(); + var name = modifierFlags & 512 ? parseOptionalBindingIdentifier() : parseBindingIdentifier(); var isGenerator = asteriskToken ? 1 : 0; var isAsync = modifierFlags & 256 ? 2 : 0; var typeParameters = parseTypeParameters(); @@ -26013,12 +26004,22 @@ var ts; } return false; } + function parseDecoratorExpression() { + if (inAwaitContext() && token() === 130) { + var pos = getNodePos(); + var awaitExpression = parseIdentifier(ts.Diagnostics.Expression_expected); + nextToken(); + var memberExpression = parseMemberExpressionRest(pos, awaitExpression, true); + return parseCallExpressionRest(pos, memberExpression); + } + return parseLeftHandSideExpressionOrHigher(); + } function tryParseDecorator() { var pos = getNodePos(); if (!parseOptional(59)) { return undefined; } - var expression = doInDecoratorContext(parseLeftHandSideExpressionOrHigher); + var expression = doInDecoratorContext(parseDecoratorExpression); return finishNode(factory.createDecorator(expression), pos); } function parseDecorators() { @@ -26138,8 +26139,8 @@ var ts; return withJSDoc(finishNode(node, pos), hasJSDoc); } function parseNameOfClassDeclarationOrExpression() { - return isIdentifier() && !isImplementsClause() - ? parseIdentifier() + return isBindingIdentifier() && !isImplementsClause() + ? createIdentifier(isBindingIdentifier()) : undefined; } function isImplementsClause() { @@ -27603,6 +27604,7 @@ var ts; } } } + IncrementalParser.createSyntaxCursor = createSyntaxCursor; })(IncrementalParser || (IncrementalParser = {})); function isDeclarationFileName(fileName) { return ts.fileExtensionIs(fileName, ".d.ts"); @@ -29277,7 +29279,7 @@ var ts; } function convertObjectLiteralExpressionToJson(node, knownOptions, extraKeyDiagnostics, parentOption) { var result = returnValue ? {} : undefined; - var _loop_3 = function (element) { + var _loop_4 = function (element) { if (element.kind !== 285) { errors.push(ts.createDiagnosticForNodeInSourceFile(sourceFile, element, ts.Diagnostics.Property_assignment_expected)); return "continue"; @@ -29325,7 +29327,7 @@ var ts; }; for (var _i = 0, _a = node.properties; _i < _a.length; _i++) { var element = _a[_i]; - _loop_3(element); + _loop_4(element); } return result; } @@ -29489,7 +29491,7 @@ var ts; var optionsNameMap = _a.optionsNameMap; var result = ts.createMap(); var getCanonicalFileName = pathOptions && ts.createGetCanonicalFileName(pathOptions.useCaseSensitiveFileNames); - var _loop_4 = function (name) { + var _loop_5 = function (name) { if (ts.hasProperty(options, name)) { if (optionsNameMap.has(name) && optionsNameMap.get(name).category === ts.Diagnostics.Command_line_Options) { return "continue"; @@ -29518,7 +29520,7 @@ var ts; } }; for (var name in options) { - _loop_4(name); + _loop_5(name); } return result; } @@ -30138,7 +30140,7 @@ var ts; } var jsonOnlyIncludeRegexes; if (validatedIncludeSpecs && validatedIncludeSpecs.length > 0) { - var _loop_5 = function (file) { + var _loop_6 = function (file) { if (ts.fileExtensionIs(file, ".json")) { if (!jsonOnlyIncludeRegexes) { var includes = validatedIncludeSpecs.filter(function (s) { return ts.endsWith(s, ".json"); }); @@ -30165,7 +30167,7 @@ var ts; }; for (var _a = 0, _b = host.readDirectory(basePath, supportedExtensionsWithJsonIfResolveJsonModule, validatedExcludeSpecs, validatedIncludeSpecs, undefined); _a < _b.length; _a++) { var file = _b[_a]; - _loop_5(file); + _loop_6(file); } } var literalFiles = ts.arrayFrom(literalFileMap.values()); @@ -33063,16 +33065,27 @@ var ts; parent = saveParent; currentFlow = saveCurrentFlow; } - function checkStrictModeIdentifier(node) { - if (inStrictMode && - node.originalKeywordKind >= 116 && - node.originalKeywordKind <= 124 && - !ts.isIdentifierName(node) && + function checkContextualIdentifier(node) { + if (!file.parseDiagnostics.length && !(node.flags & 8388608) && - !(node.flags & 4194304)) { - if (!file.parseDiagnostics.length) { + !(node.flags & 4194304) && + !ts.isIdentifierName(node)) { + if (inStrictMode && + node.originalKeywordKind >= 116 && + node.originalKeywordKind <= 124) { file.bindDiagnostics.push(createDiagnosticForNode(node, getStrictModeIdentifierMessage(node), ts.declarationNameToString(node))); } + else if (node.originalKeywordKind === 130) { + if (ts.isExternalModule(file) && ts.isInTopLevelContext(node)) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, ts.declarationNameToString(node))); + } + else if (node.flags & 32768) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, ts.declarationNameToString(node))); + } + } + else if (node.originalKeywordKind === 124 && node.flags & 8192) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, ts.declarationNameToString(node))); + } } } function getStrictModeIdentifierMessage(node) { @@ -33278,7 +33291,7 @@ var ts; if (currentFlow && (ts.isExpression(node) || parent.kind === 286)) { node.flowNode = currentFlow; } - return checkStrictModeIdentifier(node); + return checkContextualIdentifier(node); case 105: node.flowNode = currentFlow; break; @@ -35112,7 +35125,7 @@ var ts; function addDuplicateDeclarationError(node, message, symbolName, relatedNodes) { var errorNode = (ts.getExpandoInitializer(node, false) ? ts.getNameOfExpando(node) : ts.getNameOfDeclaration(node)) || node; var err = lookupOrIssueError(errorNode, message, symbolName); - var _loop_6 = function (relatedNode) { + var _loop_7 = function (relatedNode) { var adjustedNode = (ts.getExpandoInitializer(relatedNode, false) ? ts.getNameOfExpando(relatedNode) : ts.getNameOfDeclaration(relatedNode)) || relatedNode; if (adjustedNode === errorNode) return "continue"; @@ -35125,7 +35138,7 @@ var ts; }; for (var _i = 0, _a = relatedNodes || ts.emptyArray; _i < _a.length; _i++) { var relatedNode = _a[_i]; - _loop_6(relatedNode); + _loop_7(relatedNode); } } function combineSymbolTables(first, second) { @@ -37026,7 +37039,7 @@ var ts; } function forEachSymbolTableInScope(enclosingDeclaration, callback) { var result; - var _loop_7 = function (location) { + var _loop_8 = function (location) { if (location.locals && !isGlobalSourceFile(location)) { if (result = callback(location.locals)) { return { value: result }; @@ -37059,7 +37072,7 @@ var ts; } }; for (var location = enclosingDeclaration; location; location = location.parent) { - var state_2 = _loop_7(location); + var state_2 = _loop_8(location); if (typeof state_2 === "object") return state_2.value; } @@ -38886,7 +38899,7 @@ var ts; if (ts.length(reexports) > 1) { var groups = ts.group(reexports, function (decl) { return ts.isStringLiteral(decl.moduleSpecifier) ? ">" + decl.moduleSpecifier.text : ">"; }); if (groups.length !== reexports.length) { - var _loop_8 = function (group_1) { + var _loop_9 = function (group_1) { if (group_1.length > 1) { statements = __spreadArrays(ts.filter(statements, function (s) { return group_1.indexOf(s) === -1; }), [ ts.factory.createExportDeclaration(undefined, undefined, false, ts.factory.createNamedExports(ts.flatMap(group_1, function (e) { return ts.cast(e.exportClause, ts.isNamedExports).elements; })), group_1[0].moduleSpecifier) @@ -38895,7 +38908,7 @@ var ts; }; for (var _i = 0, groups_1 = groups; _i < groups_1.length; _i++) { var group_1 = groups_1[_i]; - _loop_8(group_1); + _loop_9(group_1); } } } @@ -41829,7 +41842,7 @@ var ts; if (!ts.length(result) && indexWithLengthOverOne !== -1) { var masterList = signatureLists[indexWithLengthOverOne !== undefined ? indexWithLengthOverOne : 0]; var results = masterList.slice(); - var _loop_9 = function (signatures) { + var _loop_10 = function (signatures) { if (signatures !== masterList) { var signature_1 = signatures[0]; ts.Debug.assert(!!signature_1, "getUnionSignatures bails early on empty signature lists and should not have empty lists on second pass"); @@ -41841,7 +41854,7 @@ var ts; }; for (var _b = 0, signatureLists_1 = signatureLists; _b < signatureLists_1.length; _b++) { var signatures = signatureLists_1[_b]; - var state_3 = _loop_9(signatures); + var state_3 = _loop_10(signatures); if (state_3 === "break") break; } @@ -41956,7 +41969,7 @@ var ts; var types = type.types; var mixinFlags = findMixins(types); var mixinCount = ts.countWhere(mixinFlags, function (b) { return b; }); - var _loop_10 = function (i) { + var _loop_11 = function (i) { var t = type.types[i]; if (!mixinFlags[i]) { var signatures = getSignaturesOfType(t, 1); @@ -41974,19 +41987,19 @@ var ts; numberIndexInfo = intersectIndexInfos(numberIndexInfo, getIndexInfoOfType(t, 1)); }; for (var i = 0; i < types.length; i++) { - _loop_10(i); + _loop_11(i); } setStructuredTypeMembers(type, emptySymbols, callSignatures || ts.emptyArray, constructSignatures || ts.emptyArray, stringIndexInfo, numberIndexInfo); } function appendSignatures(signatures, newSignatures) { - var _loop_11 = function (sig) { + var _loop_12 = function (sig) { if (!signatures || ts.every(signatures, function (s) { return !compareSignaturesIdentical(s, sig, false, false, false, compareTypesIdentical); })) { signatures = ts.append(signatures, sig); } }; for (var _i = 0, newSignatures_1 = newSignatures; _i < newSignatures_1.length; _i++) { var sig = newSignatures_1[_i]; - _loop_11(sig); + _loop_12(sig); } return signatures; } @@ -44032,7 +44045,7 @@ var ts; var expandedDeclarations = []; var optionalIndex = -1; var restTypes; - var _loop_12 = function (i) { + var _loop_13 = function (i) { var type = elementTypes[i]; var flags = target.elementFlags[i]; if (flags & 8) { @@ -44051,7 +44064,7 @@ var ts; } }; for (var i = 0; i < elementTypes.length; i++) { - _loop_12(i); + _loop_13(i); } if (restTypes) { expandedTypes[expandedTypes.length - 1] = getUnionType(restTypes); @@ -44976,7 +44989,7 @@ var ts; function getConditionalType(root, mapper) { var result; var extraTypes; - var _loop_13 = function () { + var _loop_14 = function () { var checkType = instantiateType(root.checkType, mapper); var checkTypeInstantiable = isGenericObjectType(checkType) || isGenericIndexType(checkType); var extendsType = instantiateType(root.extendsType, mapper); @@ -45025,7 +45038,7 @@ var ts; return "break"; }; while (true) { - var state_4 = _loop_13(); + var state_4 = _loop_14(); if (typeof state_4 === "object") return state_4.value; if (state_4 === "break") @@ -47216,7 +47229,7 @@ var ts; reducedTarget = findMatchingDiscriminantType(source, target, isRelatedTo) || filterPrimitivesIfContainsNonPrimitive(target); checkTypes = reducedTarget.flags & 1048576 ? reducedTarget.types : [reducedTarget]; } - var _loop_14 = function (prop) { + var _loop_15 = function (prop) { if (shouldCheckAsExcessProperty(prop, source.symbol) && !isIgnoredJsxProperty(source, prop)) { if (!isKnownProperty(reducedTarget, prop.escapedName, isComparingJsxAttributes)) { if (reportErrors) { @@ -47269,7 +47282,7 @@ var ts; }; for (var _i = 0, _a = getPropertiesOfType(source); _i < _a.length; _i++) { var prop = _a[_i]; - var state_5 = _loop_14(prop); + var state_5 = _loop_15(prop); if (typeof state_5 === "object") return state_5.value; } @@ -47821,11 +47834,11 @@ var ts; } var discriminantCombinations = ts.cartesianProduct(sourceDiscriminantTypes); var matchingTypes = []; - var _loop_15 = function (combination) { + var _loop_16 = function (combination) { var hasMatch = false; outer: for (var _i = 0, _a = target.types; _i < _a.length; _i++) { var type = _a[_i]; - var _loop_16 = function (i) { + var _loop_17 = function (i) { var sourceProperty = sourcePropertiesFiltered[i]; var targetProperty = getPropertyOfType(type, sourceProperty.escapedName); if (!targetProperty) @@ -47838,7 +47851,7 @@ var ts; } }; for (var i = 0; i < sourcePropertiesFiltered.length; i++) { - var state_7 = _loop_16(i); + var state_7 = _loop_17(i); switch (state_7) { case "continue-outer": continue outer; } @@ -47852,7 +47865,7 @@ var ts; }; for (var _a = 0, discriminantCombinations_1 = discriminantCombinations; _a < discriminantCombinations_1.length; _a++) { var combination = discriminantCombinations_1[_a]; - var state_6 = _loop_15(combination); + var state_6 = _loop_16(combination); if (typeof state_6 === "object") return state_6.value; } @@ -48433,7 +48446,7 @@ var ts; if (!variances) { cache.variances = ts.emptyArray; variances = []; - var _loop_17 = function (tp) { + var _loop_18 = function (tp) { var unmeasurable = false; var unreliable = false; var oldHandler = outofbandVarianceMarkerHandler; @@ -48458,7 +48471,7 @@ var ts; }; for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { var tp = typeParameters_1[_i]; - _loop_17(tp); + _loop_18(tp); } cache.variances = variances; } @@ -54858,7 +54871,7 @@ var ts; var spreadIndex = getSpreadArgumentIndex(args); if (spreadIndex >= 0) { var effectiveArgs_1 = args.slice(0, spreadIndex); - var _loop_18 = function (i) { + var _loop_19 = function (i) { var arg = args[i]; var spreadType = arg.kind === 217 && (flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression)); if (spreadType && isTupleType(spreadType)) { @@ -54874,7 +54887,7 @@ var ts; } }; for (var i = spreadIndex; i < args.length; i++) { - _loop_18(i); + _loop_19(i); } return effectiveArgs_1; } @@ -55109,7 +55122,7 @@ var ts; var min_3 = Number.MAX_VALUE; var minIndex = 0; var i_1 = 0; - var _loop_19 = function (c) { + var _loop_20 = function (c) { var chain_2 = function () { return ts.chainDiagnosticMessages(undefined, ts.Diagnostics.Overload_0_of_1_2_gave_the_following_error, i_1 + 1, candidates.length, signatureToString(c)); }; var diags_2 = getSignatureApplicabilityError(node, args, c, assignableRelation, 0, true, chain_2); if (diags_2) { @@ -55127,7 +55140,7 @@ var ts; }; for (var _a = 0, candidatesForArgumentError_1 = candidatesForArgumentError; _a < candidatesForArgumentError_1.length; _a++) { var c = candidatesForArgumentError_1[_a]; - _loop_19(c); + _loop_20(c); } var diags_3 = max > 1 ? allDiagnostics[minIndex] : ts.flatten(allDiagnostics); ts.Debug.assert(diags_3.length > 0, "No errors reported for 3 or fewer overload signatures"); @@ -55248,7 +55261,7 @@ var ts; } var _a = ts.minAndMax(candidates, getNumNonRestParameters), minArgumentCount = _a.min, maxNonRestParam = _a.max; var parameters = []; - var _loop_20 = function (i) { + var _loop_21 = function (i) { var symbols = ts.mapDefined(candidates, function (s) { return signatureHasRestParameter(s) ? i < s.parameters.length - 1 ? s.parameters[i] : ts.last(s.parameters) : i < s.parameters.length ? s.parameters[i] : undefined; }); @@ -55256,7 +55269,7 @@ var ts; parameters.push(createCombinedSymbolFromTypes(symbols, ts.mapDefined(candidates, function (candidate) { return tryGetTypeAtPosition(candidate, i); }))); }; for (var i = 0; i < maxNonRestParam; i++) { - _loop_20(i); + _loop_21(i); } var restParameterSymbols = ts.mapDefined(candidates, function (c) { return signatureHasRestParameter(c) ? ts.last(c.parameters) : undefined; }); var flags = 0; @@ -56765,14 +56778,10 @@ var ts; checkExpression(node.expression); return undefinedWideningType; } - function isInTopLevelContext(node) { - var container = ts.getThisContainer(node, true); - return ts.isSourceFile(container); - } function checkAwaitExpression(node) { if (produceDiagnostics) { if (!(node.flags & 32768)) { - if (isInTopLevelContext(node)) { + if (ts.isInTopLevelContext(node)) { var sourceFile = ts.getSourceFileOfNode(node); if (!hasParseDiagnostics(sourceFile)) { var span = void 0; @@ -61108,7 +61117,7 @@ var ts; } function issueMemberSpecificError(node, typeWithThis, baseWithThis, broadDiag) { var issuedMemberError = false; - var _loop_21 = function (member) { + var _loop_22 = function (member) { if (ts.hasStaticModifier(member)) { return "continue"; } @@ -61126,7 +61135,7 @@ var ts; }; for (var _i = 0, _a = node.members; _i < _a.length; _i++) { var member = _a[_i]; - _loop_21(member); + _loop_22(member); } if (!issuedMemberError) { checkTypeAssignableTo(typeWithThis, baseWithThis, node.name || node, broadDiag); @@ -61811,7 +61820,6 @@ var ts; } } function checkImportBinding(node) { - checkGrammarAwaitIdentifier(node.name); checkCollisionWithRequireExportsInGeneratedCode(node, node.name); checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name); checkAliasSymbol(node); @@ -62864,10 +62872,10 @@ var ts; return checkDestructuringAssignment(expr, iteratedType || errorType); } if (expr.parent.kind === 285) { - var node_1 = ts.cast(expr.parent.parent, ts.isObjectLiteralExpression); - var typeOfParentObjectLiteral = getTypeOfAssignmentPattern(node_1) || errorType; - var propertyIndex = ts.indexOfNode(node_1.properties, expr.parent); - return checkObjectLiteralDestructuringPropertyAssignment(node_1, typeOfParentObjectLiteral, propertyIndex); + var node_2 = ts.cast(expr.parent.parent, ts.isObjectLiteralExpression); + var typeOfParentObjectLiteral = getTypeOfAssignmentPattern(node_2) || errorType; + var propertyIndex = ts.indexOfNode(node_2.properties, expr.parent); + return checkObjectLiteralDestructuringPropertyAssignment(node_2, typeOfParentObjectLiteral, propertyIndex); } var node = ts.cast(expr.parent, ts.isArrayLiteralExpression); var typeOfArrayLiteral = getTypeOfAssignmentPattern(node) || errorType; @@ -64097,28 +64105,17 @@ var ts; } return false; } - function checkGrammarAwaitIdentifier(name) { - if (name && ts.isIdentifier(name) && name.originalKeywordKind === 130 && isInTopLevelContext(name.parent)) { - var file = ts.getSourceFileOfNode(name); - if (!file.isDeclarationFile && ts.isExternalModule(file)) { - return grammarErrorOnNode(name, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, ts.idText(name)); - } - } - return false; - } function checkGrammarFunctionLikeDeclaration(node) { var file = ts.getSourceFileOfNode(node); return checkGrammarDecoratorsAndModifiers(node) || checkGrammarTypeParameterList(node.typeParameters, file) || - (ts.isFunctionDeclaration(node) && checkGrammarAwaitIdentifier(node.name)) || checkGrammarParameterList(node.parameters) || checkGrammarArrowFunction(node, file) || (ts.isFunctionLikeDeclaration(node) && checkGrammarForUseStrictSimpleParameterList(node)); } function checkGrammarClassLikeDeclaration(node) { var file = ts.getSourceFileOfNode(node); - return (ts.isClassDeclaration(node) && checkGrammarAwaitIdentifier(node.name)) || - checkGrammarClassDeclarationHeritageClauses(node) || + return checkGrammarClassDeclarationHeritageClauses(node) || checkGrammarTypeParameterList(node.typeParameters, file); } function checkGrammarArrowFunction(node, file) { @@ -64645,9 +64642,6 @@ var ts; return grammarErrorOnNode(node.name, ts.Diagnostics.A_rest_element_cannot_have_a_property_name); } } - if (ts.isIdentifier(node.name) && checkGrammarAwaitIdentifier(node.name)) { - return true; - } if (node.dotDotDotToken && node.initializer) { return grammarErrorAtPos(node, node.initializer.pos - 1, 1, ts.Diagnostics.A_rest_element_cannot_have_an_initializer); } @@ -64703,9 +64697,6 @@ var ts; } } } - if (ts.isIdentifier(node.name) && checkGrammarAwaitIdentifier(node.name)) { - return true; - } if (node.exclamationToken && (node.parent.parent.kind !== 229 || !node.type || node.initializer || node.flags & 8388608)) { return grammarErrorOnNode(node.exclamationToken, ts.Diagnostics.Definite_assignment_assertions_can_only_be_used_along_with_a_type_annotation); } @@ -87967,7 +87958,7 @@ var ts; importedFileFromNodeModules = importedFileFromNodeModules || ts.pathContainsNodeModules(path); }); var sortedPaths = []; - var _loop_22 = function (directory) { + var _loop_23 = function (directory) { var directoryStart = ts.ensureTrailingDirectorySeparator(directory); var pathsInDirectory; allFileNames.forEach(function (canonicalFileName, fileName) { @@ -87992,7 +87983,7 @@ var ts; }; var out_directory_1; for (var directory = ts.getDirectoryPath(ts.toPath(importingFileName, cwd, getCanonicalFileName)); allFileNames.size !== 0;) { - var state_8 = _loop_22(directory); + var state_8 = _loop_23(directory); directory = out_directory_1; if (state_8 === "break") break; diff --git a/lib/tsserver.js b/lib/tsserver.js index 39d2ef5eab3f7..0a854813aaef8 100644 --- a/lib/tsserver.js +++ b/lib/tsserver.js @@ -13822,6 +13822,15 @@ var ts; } } ts.getThisContainer = getThisContainer; + function isInTopLevelContext(node) { + // The name of a class or function declaration is a BindingIdentifier in its surrounding scope. + if (ts.isIdentifier(node) && (ts.isClassDeclaration(node.parent) || ts.isFunctionDeclaration(node.parent)) && node.parent.name === node) { + node = node.parent; + } + var container = getThisContainer(node, /*includeArrowFunctions*/ true); + return ts.isSourceFile(container); + } + ts.isInTopLevelContext = isInTopLevelContext; function getNewTargetContainer(node) { var container = getThisContainer(node, /*includeArrowFunctions*/ false); if (container) { @@ -15019,13 +15028,7 @@ var ts; return parent.name === node; case 156 /* QualifiedName */: // Name on right hand side of dot in a type query or type reference - if (parent.right === node) { - while (parent.kind === 156 /* QualifiedName */) { - parent = parent.parent; - } - return parent.kind === 175 /* TypeQuery */ || parent.kind === 172 /* TypeReference */; - } - return false; + return parent.right === node; case 195 /* BindingElement */: case 262 /* ImportSpecifier */: // Property name in binding element or import specifier @@ -27382,31 +27385,6 @@ var ts; createBaseNode: function (kind) { return countNode(new NodeConstructor(kind, /*pos*/ 0, /*end*/ 0)); } }; var factory = ts.createNodeFactory(1 /* NoParenthesizerRules */ | 2 /* NoNodeConverters */ | 8 /* NoOriginalNode */, baseNodeFactory); - var reparseContext = { - get factory() { return factory; }, - enableEmitNotification: ts.notImplemented, - enableSubstitution: ts.notImplemented, - endLexicalEnvironment: ts.returnUndefined, - getCompilerOptions: ts.notImplemented, - getEmitHost: ts.notImplemented, - getEmitResolver: ts.notImplemented, - getEmitHelperFactory: ts.notImplemented, - setLexicalEnvironmentFlags: ts.noop, - getLexicalEnvironmentFlags: function () { return 0; }, - hoistFunctionDeclaration: ts.notImplemented, - hoistVariableDeclaration: ts.notImplemented, - addInitializationStatement: ts.notImplemented, - isEmitNotificationEnabled: ts.notImplemented, - isSubstitutionEnabled: ts.notImplemented, - onEmitNode: ts.notImplemented, - onSubstituteNode: ts.notImplemented, - readEmitHelpers: ts.notImplemented, - requestEmitHelper: ts.notImplemented, - resumeLexicalEnvironment: ts.noop, - startLexicalEnvironment: ts.noop, - suspendLexicalEnvironment: ts.noop, - addDiagnostic: ts.notImplemented, - }; var fileName; var sourceFlags; var sourceText; @@ -27470,6 +27448,8 @@ var ts; // parsing. These context flags are naturally stored and restored through normal recursive // descent parsing and unwinding. var contextFlags; + // Indicates whether we are currently parsing top-level statements. + var topLevel = true; // Whether or not we've had a parse error since creating the last AST node. If we have // encountered an error, it will be stored on the next AST node we create. Parse errors // can be broken down into three categories: @@ -27613,6 +27593,7 @@ var ts; identifierCount = 0; nodeCount = 0; sourceFlags = 0; + topLevel = true; switch (scriptKind) { case 1 /* JS */: case 2 /* JSX */: @@ -27649,6 +27630,7 @@ var ts; parsingContext = 0; identifiers = undefined; notParenthesizedArrow = undefined; + topLevel = true; } function parseSourceFileWorker(languageVersion, setParentNodes, scriptKind) { var isDeclarationFile = isDeclarationFileName(fileName); @@ -27697,107 +27679,97 @@ var ts; return node; } function reparseTopLevelAwait(sourceFile) { - return ts.visitEachChild(sourceFile, visitor, reparseContext); - function visitor(node) { - if (!(node.transformFlags & 8388608 /* ContainsPossibleTopLevelAwait */)) { - return node; - } - // We explicitly visit each non-Expression node that has an immediate Expression child so that - // we can reparse the Expression in an Await context - switch (node.kind) { - case 160 /* Decorator */: return reparseDecorator(node); - case 157 /* ComputedPropertyName */: return reparseComputedPropertyName(node); - case 220 /* ExpressionWithTypeArguments */: return reparseExpressionWithTypeArguments(node); - case 230 /* ExpressionStatement */: return reparseExpressionStatement(node); - case 231 /* IfStatement */: return reparseIfStatement(node); - case 241 /* SwitchStatement */: return reparseSwitchStatement(node); - case 240 /* WithStatement */: return reparseWithStatement(node); - case 232 /* DoStatement */: return reparseDoStatement(node); - case 233 /* WhileStatement */: return reparseWhileStatement(node); - case 234 /* ForStatement */: return reparseForStatement(node); - case 235 /* ForInStatement */: return reparseForInStatement(node); - case 236 /* ForOfStatement */: return reparseForOfStatement(node); - case 239 /* ReturnStatement */: return reparseReturnStatement(node); - case 243 /* ThrowStatement */: return reparseThrowStatement(node); - case 263 /* ExportAssignment */: return reparseExportAssignment(node); - case 246 /* VariableDeclaration */: return reparseVariableDeclaration(node); - case 195 /* BindingElement */: return reparseBindingElement(node); - default: return ts.visitEachChild(node, visitor, reparseContext); - } - } - function reparse(node, parse) { - if (node && node.transformFlags & 8388608 /* ContainsPossibleTopLevelAwait */) { - if (ts.isExpression(node)) { - return speculationHelper(function () { - scanner.setTextPos(node.pos); - var savedContextFlags = contextFlags; - contextFlags = node.flags & 25358336 /* ContextFlags */; + var savedSyntaxCursor = syntaxCursor; + var baseSyntaxCursor = IncrementalParser.createSyntaxCursor(sourceFile); + syntaxCursor = { currentNode: currentNode }; + var statements = []; + var savedParseDiagnostics = parseDiagnostics; + parseDiagnostics = []; + var pos = 0; + var start = findNextStatementWithAwait(sourceFile.statements, 0); + var _loop_3 = function () { + // append all statements between pos and start + var prevStatement = sourceFile.statements[pos]; + var nextStatement = sourceFile.statements[start]; + ts.addRange(statements, sourceFile.statements, pos, start); + pos = findNextStatementWithoutAwait(sourceFile.statements, start); + // append all diagnostics associated with the copied range + var diagnosticStart = ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= prevStatement.pos; }); + var diagnosticEnd = diagnosticStart >= 0 ? ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= nextStatement.pos; }, diagnosticStart) : -1; + if (diagnosticStart >= 0) { + ts.addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart, diagnosticEnd >= 0 ? diagnosticEnd : undefined); + } + // reparse all statements between start and pos. We skip existing diagnostics for the same range and allow the parser to generate new ones. + speculationHelper(function () { + var savedContextFlags = contextFlags; + contextFlags |= 32768 /* AwaitContext */; + scanner.setTextPos(nextStatement.pos); + nextToken(); + while (token() !== 1 /* EndOfFileToken */) { + var startPos = scanner.getStartPos(); + var statement = parseListElement(0 /* SourceElements */, parseStatement); + statements.push(statement); + if (startPos === scanner.getStartPos()) { nextToken(); - var result = doInAwaitContext(parse); - contextFlags = savedContextFlags; - return result; - }, 2 /* Reparse */); + } + if (pos >= 0) { + var nonAwaitStatement = sourceFile.statements[pos]; + if (statement.end === nonAwaitStatement.pos) { + // done reparsing this section + break; + } + if (statement.end > nonAwaitStatement.pos) { + // we ate into the next statement, so we must reparse it. + pos = findNextStatementWithoutAwait(sourceFile.statements, pos + 1); + } + } } - return ts.visitEachChild(node, visitor, reparseContext); - } - return node; + contextFlags = savedContextFlags; + }, 2 /* Reparse */); + // find the next statement containing an `await` + start = pos >= 0 ? findNextStatementWithAwait(sourceFile.statements, pos) : -1; + }; + while (start !== -1) { + _loop_3(); } - function update(updated, original) { - if (updated !== original) { - ts.setNodeFlags(updated, updated.flags | 32768 /* AwaitContext */); + // append all statements between pos and the end of the list + if (pos >= 0) { + var prevStatement_1 = sourceFile.statements[pos]; + ts.addRange(statements, sourceFile.statements, pos); + // append all diagnostics associated with the copied range + var diagnosticStart = ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= prevStatement_1.pos; }); + if (diagnosticStart >= 0) { + ts.addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart); } - return updated; - } - function reparseExpressionStatement(node) { - return update(factory.updateExpressionStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseReturnStatement(node) { - return update(factory.updateReturnStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseThrowStatement(node) { - return update(factory.updateThrowStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseIfStatement(node) { - return update(factory.updateIfStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.thenStatement, visitor), ts.visitNode(node.elseStatement, visitor)), node); } - function reparseSwitchStatement(node) { - return update(factory.updateSwitchStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.caseBlock, visitor)), node); + syntaxCursor = savedSyntaxCursor; + return factory.updateSourceFile(sourceFile, ts.setTextRange(factory.createNodeArray(statements), sourceFile.statements)); + function containsPossibleTopLevelAwait(node) { + return !(node.flags & 32768 /* AwaitContext */) + && !!(node.transformFlags & 8388608 /* ContainsPossibleTopLevelAwait */); } - function reparseWithStatement(node) { - return update(factory.updateWithStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseDoStatement(node) { - return update(factory.updateDoStatement(node, ts.visitNode(node.statement, visitor), reparse(node.expression, parseExpression)), node); - } - function reparseWhileStatement(node) { - return update(factory.updateWhileStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseForStatement(node) { - return update(factory.updateForStatement(node, reparse(node.initializer, parseExpression), reparse(node.condition, parseExpression), reparse(node.incrementor, parseExpression), ts.visitNode(node, visitor)), node); - } - function reparseForInStatement(node) { - return update(factory.updateForInStatement(node, reparse(node.initializer, parseExpression), reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseForOfStatement(node) { - return update(factory.updateForOfStatement(node, node.awaitModifier, reparse(node.initializer, parseExpression), reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseExportAssignment(node) { - return update(factory.updateExportAssignment(node, ts.visitNodes(node.decorators, visitor), node.modifiers, reparse(node.expression, parseExpression)), node); - } - function reparseExpressionWithTypeArguments(node) { - return update(factory.updateExpressionWithTypeArguments(node, reparse(node.expression, parseLeftHandSideExpressionOrHigher), node.typeArguments), node); - } - function reparseDecorator(node) { - return update(factory.updateDecorator(node, reparse(node.expression, parseLeftHandSideExpressionOrHigher)), node); - } - function reparseComputedPropertyName(node) { - return update(factory.updateComputedPropertyName(node, reparse(node.expression, parseExpression)), node); + function findNextStatementWithAwait(statements, start) { + for (var i = start; i < statements.length; i++) { + if (containsPossibleTopLevelAwait(statements[i])) { + return i; + } + } + return -1; } - function reparseVariableDeclaration(node) { - return update(factory.updateVariableDeclaration(node, ts.visitNode(node.name, visitor), node.exclamationToken, node.type, reparse(node.initializer, parseExpression)), node); + function findNextStatementWithoutAwait(statements, start) { + for (var i = start; i < statements.length; i++) { + if (!containsPossibleTopLevelAwait(statements[i])) { + return i; + } + } + return -1; } - function reparseBindingElement(node) { - return update(factory.updateBindingElement(node, node.dotDotDotToken, ts.visitNode(node.propertyName, visitor), ts.visitNode(node.name, visitor), reparse(node.initializer, parseExpression)), node); + function currentNode(position) { + var node = baseSyntaxCursor.currentNode(position); + if (topLevel && node && containsPossibleTopLevelAwait(node)) { + node.intersectsChange = true; + } + return node; } } function fixupParentReferences(rootNode) { @@ -28048,6 +28020,12 @@ var ts; function tryParse(callback) { return speculationHelper(callback, 0 /* TryParse */); } + function isBindingIdentifier() { + if (token() === 78 /* Identifier */) { + return true; + } + return token() > 115 /* LastReservedWord */; + } // Ignore strict mode flag because we will report an error in type checker instead. function isIdentifier() { if (token() === 78 /* Identifier */) { @@ -28217,6 +28195,9 @@ var ts; ts.Diagnostics.Identifier_expected; return createMissingNode(78 /* Identifier */, reportAtCurrentPosition, diagnosticMessage || defaultMessage, msgArg); } + function parseBindingIdentifier(privateIdentifierDiagnosticMessage) { + return createIdentifier(isBindingIdentifier(), /*diagnosticMessage*/ undefined, privateIdentifierDiagnosticMessage); + } function parseIdentifier(diagnosticMessage, privateIdentifierDiagnosticMessage) { return createIdentifier(isIdentifier(), diagnosticMessage, privateIdentifierDiagnosticMessage); } @@ -28394,9 +28375,9 @@ var ts; return isIdentifier() && !isHeritageClauseExtendsOrImplementsKeyword(); } case 8 /* VariableDeclarations */: - return isIdentifierOrPrivateIdentifierOrPattern(); + return isBindingIdentifierOrPrivateIdentifierOrPattern(); case 10 /* ArrayBindingElements */: - return token() === 27 /* CommaToken */ || token() === 25 /* DotDotDotToken */ || isIdentifierOrPrivateIdentifierOrPattern(); + return token() === 27 /* CommaToken */ || token() === 25 /* DotDotDotToken */ || isBindingIdentifierOrPrivateIdentifierOrPattern(); case 19 /* TypeParameters */: return isIdentifier(); case 15 /* ArrayLiteralMembers */: @@ -29238,7 +29219,7 @@ var ts; } function isStartOfParameter(isJSDocParameter) { return token() === 25 /* DotDotDotToken */ || - isIdentifierOrPrivateIdentifierOrPattern() || + isBindingIdentifierOrPrivateIdentifierOrPattern() || ts.isModifierKind(token()) || token() === 59 /* AtToken */ || isStartOfType(/*inStartOfParameter*/ !isJSDocParameter); @@ -29260,22 +29241,34 @@ var ts; } return name; } + function parseParameterInOuterAwaitContext() { + return parseParameterWorker(/*inOuterAwaitContext*/ true); + } function parseParameter() { + return parseParameterWorker(/*inOuterAwaitContext*/ false); + } + function parseParameterWorker(inOuterAwaitContext) { var pos = getNodePos(); var hasJSDoc = hasPrecedingJSDocComment(); if (token() === 107 /* ThisKeyword */) { - var node = factory.createParameterDeclaration( + var node_1 = factory.createParameterDeclaration( /*decorators*/ undefined, /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, createIdentifier(/*isIdentifier*/ true), /*questionToken*/ undefined, parseTypeAnnotation(), /*initializer*/ undefined); - return withJSDoc(finishNode(node, pos), hasJSDoc); + return withJSDoc(finishNode(node_1, pos), hasJSDoc); } // FormalParameter [Yield,Await]: // BindingElement[?Yield,?Await] - var modifiers; - return withJSDoc(finishNode(factory.createParameterDeclaration(parseDecorators(), modifiers = parseModifiers(), parseOptionalToken(25 /* DotDotDotToken */), parseNameOfParameter(modifiers), parseOptionalToken(57 /* QuestionToken */), parseTypeAnnotation(), parseInitializer()), pos), hasJSDoc); + // Decorators are parsed in the outer [Await] context, the rest of the parameter is parsed in the function's [Await] context. + var decorators = inOuterAwaitContext ? doInAwaitContext(parseDecorators) : parseDecorators(); + var savedTopLevel = topLevel; + topLevel = false; + var modifiers = parseModifiers(); + var node = withJSDoc(finishNode(factory.createParameterDeclaration(decorators, modifiers, parseOptionalToken(25 /* DotDotDotToken */), parseNameOfParameter(modifiers), parseOptionalToken(57 /* QuestionToken */), parseTypeAnnotation(), parseInitializer()), pos), hasJSDoc); + topLevel = savedTopLevel; + return node; } function parseReturnType(returnToken, isType) { if (shouldParseReturnType(returnToken, isType)) { @@ -29318,7 +29311,7 @@ var ts; setAwaitContext(!!(flags & 2 /* Await */)); var parameters = flags & 32 /* JSDoc */ ? parseDelimitedList(17 /* JSDocParameters */, parseJSDocParameter) : - parseDelimitedList(16 /* Parameters */, parseParameter); + parseDelimitedList(16 /* Parameters */, savedAwaitContext ? parseParameterInOuterAwaitContext : parseParameter); setYieldContext(savedYieldContext); setAwaitContext(savedAwaitContext); return parameters; @@ -30447,9 +30440,13 @@ var ts; // Note: even when 'IgnoreMissingOpenBrace' is passed, parseBody will still error. return parseFunctionBlock(16 /* IgnoreMissingOpenBrace */ | (isAsync ? 2 /* Await */ : 0 /* None */)); } - return isAsync + var savedTopLevel = topLevel; + topLevel = false; + var node = isAsync ? doInAwaitContext(parseAssignmentExpressionOrHigher) : doOutsideOfAwaitContext(parseAssignmentExpressionOrHigher); + topLevel = savedTopLevel; + return node; } function parseConditionalExpressionRest(leftOperand, pos) { // Note: we are passed in an expression which was produced from parseBinaryExpressionOrHigher. @@ -31440,10 +31437,10 @@ var ts; var asteriskToken = parseOptionalToken(41 /* AsteriskToken */); var isGenerator = asteriskToken ? 1 /* Yield */ : 0 /* None */; var isAsync = ts.some(modifiers, ts.isAsyncModifier) ? 2 /* Await */ : 0 /* None */; - var name = isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalIdentifier) : - isGenerator ? doInYieldContext(parseOptionalIdentifier) : - isAsync ? doInAwaitContext(parseOptionalIdentifier) : - parseOptionalIdentifier(); + var name = isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalBindingIdentifier) : + isGenerator ? doInYieldContext(parseOptionalBindingIdentifier) : + isAsync ? doInAwaitContext(parseOptionalBindingIdentifier) : + parseOptionalBindingIdentifier(); var typeParameters = parseTypeParameters(); var parameters = parseParameters(isGenerator | isAsync); var type = parseReturnType(58 /* ColonToken */, /*isType*/ false); @@ -31454,8 +31451,8 @@ var ts; var node = factory.createFunctionExpression(modifiers, asteriskToken, name, typeParameters, parameters, type, body); return withJSDoc(finishNode(node, pos), hasJSDoc); } - function parseOptionalIdentifier() { - return isIdentifier() ? parseIdentifier() : undefined; + function parseOptionalBindingIdentifier() { + return isBindingIdentifier() ? parseBindingIdentifier() : undefined; } function parseNewExpressionOrNewDotTarget() { var pos = getNodePos(); @@ -31511,6 +31508,8 @@ var ts; setYieldContext(!!(flags & 1 /* Yield */)); var savedAwaitContext = inAwaitContext(); setAwaitContext(!!(flags & 2 /* Await */)); + var savedTopLevel = topLevel; + topLevel = false; // We may be in a [Decorator] context when parsing a function expression or // arrow function. The body of the function is not in [Decorator] context. var saveDecoratorContext = inDecoratorContext(); @@ -31521,6 +31520,7 @@ var ts; if (saveDecoratorContext) { setDecoratorContext(/*val*/ true); } + topLevel = savedTopLevel; setYieldContext(savedYieldContext); setAwaitContext(savedAwaitContext); return block; @@ -32079,7 +32079,7 @@ var ts; function parseObjectBindingElement() { var pos = getNodePos(); var dotDotDotToken = parseOptionalToken(25 /* DotDotDotToken */); - var tokenIsIdentifier = isIdentifier(); + var tokenIsIdentifier = isBindingIdentifier(); var propertyName = parsePropertyName(); var name; if (tokenIsIdentifier && token() !== 58 /* ColonToken */) { @@ -32107,11 +32107,11 @@ var ts; parseExpected(23 /* CloseBracketToken */); return finishNode(factory.createArrayBindingPattern(elements), pos); } - function isIdentifierOrPrivateIdentifierOrPattern() { + function isBindingIdentifierOrPrivateIdentifierOrPattern() { return token() === 18 /* OpenBraceToken */ || token() === 22 /* OpenBracketToken */ || token() === 79 /* PrivateIdentifier */ - || isIdentifier(); + || isBindingIdentifier(); } function parseIdentifierOrPattern(privateIdentifierDiagnosticMessage) { if (token() === 22 /* OpenBracketToken */) { @@ -32120,7 +32120,7 @@ var ts; if (token() === 18 /* OpenBraceToken */) { return parseObjectBindingPattern(); } - return parseIdentifier(/*diagnosticMessage*/ undefined, privateIdentifierDiagnosticMessage); + return parseBindingIdentifier(privateIdentifierDiagnosticMessage); } function parseVariableDeclarationAllowExclamation() { return parseVariableDeclaration(/*allowExclamation*/ true); @@ -32192,7 +32192,7 @@ var ts; parseExpected(97 /* FunctionKeyword */); var asteriskToken = parseOptionalToken(41 /* AsteriskToken */); // We don't parse the name here in await context, instead we will report a grammar error in the checker. - var name = modifierFlags & 512 /* Default */ ? parseOptionalIdentifier() : parseIdentifier(); + var name = modifierFlags & 512 /* Default */ ? parseOptionalBindingIdentifier() : parseBindingIdentifier(); var isGenerator = asteriskToken ? 1 /* Yield */ : 0 /* None */; var isAsync = modifierFlags & 256 /* Async */ ? 2 /* Await */ : 0 /* None */; var typeParameters = parseTypeParameters(); @@ -32336,12 +32336,24 @@ var ts; } return false; } + function parseDecoratorExpression() { + if (inAwaitContext() && token() === 130 /* AwaitKeyword */) { + // `@await` is is disallowed in an [Await] context, but can cause parsing to go off the rails + // This simply parses the missing identifier and moves on. + var pos = getNodePos(); + var awaitExpression = parseIdentifier(ts.Diagnostics.Expression_expected); + nextToken(); + var memberExpression = parseMemberExpressionRest(pos, awaitExpression, /*allowOptionalChain*/ true); + return parseCallExpressionRest(pos, memberExpression); + } + return parseLeftHandSideExpressionOrHigher(); + } function tryParseDecorator() { var pos = getNodePos(); if (!parseOptional(59 /* AtToken */)) { return undefined; } - var expression = doInDecoratorContext(parseLeftHandSideExpressionOrHigher); + var expression = doInDecoratorContext(parseDecoratorExpression); return finishNode(factory.createDecorator(expression), pos); } function parseDecorators() { @@ -32482,8 +32494,8 @@ var ts; // - class expression with omitted name, 'implements' starts heritage clause // - class with name 'implements' // 'isImplementsClause' helps to disambiguate between these two cases - return isIdentifier() && !isImplementsClause() - ? parseIdentifier() + return isBindingIdentifier() && !isImplementsClause() + ? createIdentifier(isBindingIdentifier()) : undefined; } function isImplementsClause() { @@ -34279,6 +34291,7 @@ var ts; } } } + IncrementalParser.createSyntaxCursor = createSyntaxCursor; var InvalidPosition; (function (InvalidPosition) { InvalidPosition[InvalidPosition["Value"] = -1] = "Value"; @@ -36065,7 +36078,7 @@ var ts; } function convertObjectLiteralExpressionToJson(node, knownOptions, extraKeyDiagnostics, parentOption) { var result = returnValue ? {} : undefined; - var _loop_3 = function (element) { + var _loop_4 = function (element) { if (element.kind !== 285 /* PropertyAssignment */) { errors.push(ts.createDiagnosticForNodeInSourceFile(sourceFile, element, ts.Diagnostics.Property_assignment_expected)); return "continue"; @@ -36118,7 +36131,7 @@ var ts; }; for (var _i = 0, _a = node.properties; _i < _a.length; _i++) { var element = _a[_i]; - _loop_3(element); + _loop_4(element); } return result; } @@ -36301,7 +36314,7 @@ var ts; var optionsNameMap = _a.optionsNameMap; var result = ts.createMap(); var getCanonicalFileName = pathOptions && ts.createGetCanonicalFileName(pathOptions.useCaseSensitiveFileNames); - var _loop_4 = function (name) { + var _loop_5 = function (name) { if (ts.hasProperty(options, name)) { // tsconfig only options cannot be specified via command line, // so we can assume that only types that can appear here string | number | boolean @@ -36335,7 +36348,7 @@ var ts; } }; for (var name in options) { - _loop_4(name); + _loop_5(name); } return result; } @@ -37096,7 +37109,7 @@ var ts; } var jsonOnlyIncludeRegexes; if (validatedIncludeSpecs && validatedIncludeSpecs.length > 0) { - var _loop_5 = function (file) { + var _loop_6 = function (file) { if (ts.fileExtensionIs(file, ".json" /* Json */)) { // Valid only if *.json specified if (!jsonOnlyIncludeRegexes) { @@ -37134,7 +37147,7 @@ var ts; }; for (var _a = 0, _b = host.readDirectory(basePath, supportedExtensionsWithJsonIfResolveJsonModule, validatedExcludeSpecs, validatedIncludeSpecs, /*depth*/ undefined); _a < _b.length; _a++) { var file = _b[_a]; - _loop_5(file); + _loop_6(file); } } var literalFiles = ts.arrayFrom(literalFileMap.values()); @@ -40541,18 +40554,31 @@ var ts; currentFlow = saveCurrentFlow; } // The binder visits every node in the syntax tree so it is a convenient place to perform a single localized - // check for reserved words used as identifiers in strict mode code. - function checkStrictModeIdentifier(node) { - if (inStrictMode && - node.originalKeywordKind >= 116 /* FirstFutureReservedWord */ && - node.originalKeywordKind <= 124 /* LastFutureReservedWord */ && - !ts.isIdentifierName(node) && + // check for reserved words used as identifiers in strict mode code, as well as `yield` or `await` in + // [Yield] or [Await] contexts, respectively. + function checkContextualIdentifier(node) { + // Report error only if there are no parse errors in file + if (!file.parseDiagnostics.length && !(node.flags & 8388608 /* Ambient */) && - !(node.flags & 4194304 /* JSDoc */)) { - // Report error only if there are no parse errors in file - if (!file.parseDiagnostics.length) { + !(node.flags & 4194304 /* JSDoc */) && + !ts.isIdentifierName(node)) { + // strict mode identifiers + if (inStrictMode && + node.originalKeywordKind >= 116 /* FirstFutureReservedWord */ && + node.originalKeywordKind <= 124 /* LastFutureReservedWord */) { file.bindDiagnostics.push(createDiagnosticForNode(node, getStrictModeIdentifierMessage(node), ts.declarationNameToString(node))); } + else if (node.originalKeywordKind === 130 /* AwaitKeyword */) { + if (ts.isExternalModule(file) && ts.isInTopLevelContext(node)) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, ts.declarationNameToString(node))); + } + else if (node.flags & 32768 /* AwaitContext */) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, ts.declarationNameToString(node))); + } + } + else if (node.originalKeywordKind === 124 /* YieldKeyword */ && node.flags & 8192 /* YieldContext */) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, ts.declarationNameToString(node))); + } } } function getStrictModeIdentifierMessage(node) { @@ -40819,7 +40845,7 @@ var ts; if (currentFlow && (ts.isExpression(node) || parent.kind === 286 /* ShorthandPropertyAssignment */)) { node.flowNode = currentFlow; } - return checkStrictModeIdentifier(node); + return checkContextualIdentifier(node); case 105 /* SuperKeyword */: node.flowNode = currentFlow; break; @@ -43015,7 +43041,7 @@ var ts; function addDuplicateDeclarationError(node, message, symbolName, relatedNodes) { var errorNode = (ts.getExpandoInitializer(node, /*isPrototypeAssignment*/ false) ? ts.getNameOfExpando(node) : ts.getNameOfDeclaration(node)) || node; var err = lookupOrIssueError(errorNode, message, symbolName); - var _loop_6 = function (relatedNode) { + var _loop_7 = function (relatedNode) { var adjustedNode = (ts.getExpandoInitializer(relatedNode, /*isPrototypeAssignment*/ false) ? ts.getNameOfExpando(relatedNode) : ts.getNameOfDeclaration(relatedNode)) || relatedNode; if (adjustedNode === errorNode) return "continue"; @@ -43028,7 +43054,7 @@ var ts; }; for (var _i = 0, _a = relatedNodes || ts.emptyArray; _i < _a.length; _i++) { var relatedNode = _a[_i]; - _loop_6(relatedNode); + _loop_7(relatedNode); } } function combineSymbolTables(first, second) { @@ -45269,7 +45295,7 @@ var ts; } function forEachSymbolTableInScope(enclosingDeclaration, callback) { var result; - var _loop_7 = function (location) { + var _loop_8 = function (location) { // Locals of a source file are not in scope (because they get merged into the global symbol table) if (location.locals && !isGlobalSourceFile(location)) { if (result = callback(location.locals)) { @@ -45315,7 +45341,7 @@ var ts; } }; for (var location = enclosingDeclaration; location; location = location.parent) { - var state_2 = _loop_7(location); + var state_2 = _loop_8(location); if (typeof state_2 === "object") return state_2.value; } @@ -47325,7 +47351,7 @@ var ts; if (ts.length(reexports) > 1) { var groups = ts.group(reexports, function (decl) { return ts.isStringLiteral(decl.moduleSpecifier) ? ">" + decl.moduleSpecifier.text : ">"; }); if (groups.length !== reexports.length) { - var _loop_8 = function (group_1) { + var _loop_9 = function (group_1) { if (group_1.length > 1) { // remove group members from statements and then merge group members and add back to statements statements = __spreadArrays(ts.filter(statements, function (s) { return group_1.indexOf(s) === -1; }), [ @@ -47338,7 +47364,7 @@ var ts; }; for (var _i = 0, groups_1 = groups; _i < groups_1.length; _i++) { var group_1 = groups_1[_i]; - _loop_8(group_1); + _loop_9(group_1); } } } @@ -50850,7 +50876,7 @@ var ts; // signatures from the type, whose ordering would be non-obvious) var masterList = signatureLists[indexWithLengthOverOne !== undefined ? indexWithLengthOverOne : 0]; var results = masterList.slice(); - var _loop_9 = function (signatures) { + var _loop_10 = function (signatures) { if (signatures !== masterList) { var signature_1 = signatures[0]; ts.Debug.assert(!!signature_1, "getUnionSignatures bails early on empty signature lists and should not have empty lists on second pass"); @@ -50862,7 +50888,7 @@ var ts; }; for (var _b = 0, signatureLists_1 = signatureLists; _b < signatureLists_1.length; _b++) { var signatures = signatureLists_1[_b]; - var state_3 = _loop_9(signatures); + var state_3 = _loop_10(signatures); if (state_3 === "break") break; } @@ -50986,7 +51012,7 @@ var ts; var types = type.types; var mixinFlags = findMixins(types); var mixinCount = ts.countWhere(mixinFlags, function (b) { return b; }); - var _loop_10 = function (i) { + var _loop_11 = function (i) { var t = type.types[i]; // When an intersection type contains mixin constructor types, the construct signatures from // those types are discarded and their return types are mixed into the return types of all @@ -51009,19 +51035,19 @@ var ts; numberIndexInfo = intersectIndexInfos(numberIndexInfo, getIndexInfoOfType(t, 1 /* Number */)); }; for (var i = 0; i < types.length; i++) { - _loop_10(i); + _loop_11(i); } setStructuredTypeMembers(type, emptySymbols, callSignatures || ts.emptyArray, constructSignatures || ts.emptyArray, stringIndexInfo, numberIndexInfo); } function appendSignatures(signatures, newSignatures) { - var _loop_11 = function (sig) { + var _loop_12 = function (sig) { if (!signatures || ts.every(signatures, function (s) { return !compareSignaturesIdentical(s, sig, /*partialMatch*/ false, /*ignoreThisTypes*/ false, /*ignoreReturnTypes*/ false, compareTypesIdentical); })) { signatures = ts.append(signatures, sig); } }; for (var _i = 0, newSignatures_1 = newSignatures; _i < newSignatures_1.length; _i++) { var sig = newSignatures_1[_i]; - _loop_11(sig); + _loop_12(sig); } return signatures; } @@ -53308,7 +53334,7 @@ var ts; var expandedDeclarations = []; var optionalIndex = -1; var restTypes; - var _loop_12 = function (i) { + var _loop_13 = function (i) { var type = elementTypes[i]; var flags = target.elementFlags[i]; if (flags & 8 /* Variadic */) { @@ -53331,7 +53357,7 @@ var ts; } }; for (var i = 0; i < elementTypes.length; i++) { - _loop_12(i); + _loop_13(i); } if (restTypes) { // Create a union of the collected rest element types. @@ -54381,7 +54407,7 @@ var ts; function getConditionalType(root, mapper) { var result; var extraTypes; - var _loop_13 = function () { + var _loop_14 = function () { var checkType = instantiateType(root.checkType, mapper); var checkTypeInstantiable = isGenericObjectType(checkType) || isGenericIndexType(checkType); var extendsType = instantiateType(root.extendsType, mapper); @@ -54455,7 +54481,7 @@ var ts; // types of the form 'A extends B ? X : C extends D ? Y : E extends F ? Z : ...' as a single construct for // purposes of resolution. This means such types aren't subject to the instatiation depth limiter. while (true) { - var state_4 = _loop_13(); + var state_4 = _loop_14(); if (typeof state_4 === "object") return state_4.value; if (state_4 === "break") @@ -56933,7 +56959,7 @@ var ts; reducedTarget = findMatchingDiscriminantType(source, target, isRelatedTo) || filterPrimitivesIfContainsNonPrimitive(target); checkTypes = reducedTarget.flags & 1048576 /* Union */ ? reducedTarget.types : [reducedTarget]; } - var _loop_14 = function (prop) { + var _loop_15 = function (prop) { if (shouldCheckAsExcessProperty(prop, source.symbol) && !isIgnoredJsxProperty(source, prop)) { if (!isKnownProperty(reducedTarget, prop.escapedName, isComparingJsxAttributes)) { if (reportErrors) { @@ -56996,7 +57022,7 @@ var ts; }; for (var _i = 0, _a = getPropertiesOfType(source); _i < _a.length; _i++) { var prop = _a[_i]; - var state_5 = _loop_14(prop); + var state_5 = _loop_15(prop); if (typeof state_5 === "object") return state_5.value; } @@ -57669,11 +57695,11 @@ var ts; // constituents of 'target'. If any combination does not have a match then 'source' is not relatable. var discriminantCombinations = ts.cartesianProduct(sourceDiscriminantTypes); var matchingTypes = []; - var _loop_15 = function (combination) { + var _loop_16 = function (combination) { var hasMatch = false; outer: for (var _i = 0, _a = target.types; _i < _a.length; _i++) { var type = _a[_i]; - var _loop_16 = function (i) { + var _loop_17 = function (i) { var sourceProperty = sourcePropertiesFiltered[i]; var targetProperty = getPropertyOfType(type, sourceProperty.escapedName); if (!targetProperty) @@ -57689,7 +57715,7 @@ var ts; } }; for (var i = 0; i < sourcePropertiesFiltered.length; i++) { - var state_7 = _loop_16(i); + var state_7 = _loop_17(i); switch (state_7) { case "continue-outer": continue outer; } @@ -57703,7 +57729,7 @@ var ts; }; for (var _a = 0, discriminantCombinations_1 = discriminantCombinations; _a < discriminantCombinations_1.length; _a++) { var combination = discriminantCombinations_1[_a]; - var state_6 = _loop_15(combination); + var state_6 = _loop_16(combination); if (typeof state_6 === "object") return state_6.value; } @@ -58345,7 +58371,7 @@ var ts; // The emptyArray singleton is used to signal a recursive invocation. cache.variances = ts.emptyArray; variances = []; - var _loop_17 = function (tp) { + var _loop_18 = function (tp) { var unmeasurable = false; var unreliable = false; var oldHandler = outofbandVarianceMarkerHandler; @@ -58377,7 +58403,7 @@ var ts; }; for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { var tp = typeParameters_1[_i]; - _loop_17(tp); + _loop_18(tp); } cache.variances = variances; } @@ -65860,7 +65886,7 @@ var ts; if (spreadIndex >= 0) { // Create synthetic arguments from spreads of tuple types. var effectiveArgs_1 = args.slice(0, spreadIndex); - var _loop_18 = function (i) { + var _loop_19 = function (i) { var arg = args[i]; // We can call checkExpressionCached because spread expressions never have a contextual type. var spreadType = arg.kind === 217 /* SpreadElement */ && (flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression)); @@ -65877,7 +65903,7 @@ var ts; } }; for (var i = spreadIndex; i < args.length; i++) { - _loop_18(i); + _loop_19(i); } return effectiveArgs_1; } @@ -66179,7 +66205,7 @@ var ts; var min_3 = Number.MAX_VALUE; var minIndex = 0; var i_1 = 0; - var _loop_19 = function (c) { + var _loop_20 = function (c) { var chain_2 = function () { return ts.chainDiagnosticMessages(/*details*/ undefined, ts.Diagnostics.Overload_0_of_1_2_gave_the_following_error, i_1 + 1, candidates.length, signatureToString(c)); }; var diags_2 = getSignatureApplicabilityError(node, args, c, assignableRelation, 0 /* Normal */, /*reportErrors*/ true, chain_2); if (diags_2) { @@ -66197,7 +66223,7 @@ var ts; }; for (var _a = 0, candidatesForArgumentError_1 = candidatesForArgumentError; _a < candidatesForArgumentError_1.length; _a++) { var c = candidatesForArgumentError_1[_a]; - _loop_19(c); + _loop_20(c); } var diags_3 = max > 1 ? allDiagnostics[minIndex] : ts.flatten(allDiagnostics); ts.Debug.assert(diags_3.length > 0, "No errors reported for 3 or fewer overload signatures"); @@ -66331,7 +66357,7 @@ var ts; } var _a = ts.minAndMax(candidates, getNumNonRestParameters), minArgumentCount = _a.min, maxNonRestParam = _a.max; var parameters = []; - var _loop_20 = function (i) { + var _loop_21 = function (i) { var symbols = ts.mapDefined(candidates, function (s) { return signatureHasRestParameter(s) ? i < s.parameters.length - 1 ? s.parameters[i] : ts.last(s.parameters) : i < s.parameters.length ? s.parameters[i] : undefined; }); @@ -66339,7 +66365,7 @@ var ts; parameters.push(createCombinedSymbolFromTypes(symbols, ts.mapDefined(candidates, function (candidate) { return tryGetTypeAtPosition(candidate, i); }))); }; for (var i = 0; i < maxNonRestParam; i++) { - _loop_20(i); + _loop_21(i); } var restParameterSymbols = ts.mapDefined(candidates, function (c) { return signatureHasRestParameter(c) ? ts.last(c.parameters) : undefined; }); var flags = 0 /* None */; @@ -68091,15 +68117,11 @@ var ts; checkExpression(node.expression); return undefinedWideningType; } - function isInTopLevelContext(node) { - var container = ts.getThisContainer(node, /*includeArrowFunctions*/ true); - return ts.isSourceFile(container); - } function checkAwaitExpression(node) { // Grammar checking if (produceDiagnostics) { if (!(node.flags & 32768 /* AwaitContext */)) { - if (isInTopLevelContext(node)) { + if (ts.isInTopLevelContext(node)) { var sourceFile = ts.getSourceFileOfNode(node); if (!hasParseDiagnostics(sourceFile)) { var span = void 0; @@ -73262,7 +73284,7 @@ var ts; function issueMemberSpecificError(node, typeWithThis, baseWithThis, broadDiag) { // iterate over all implemented properties and issue errors on each one which isn't compatible, rather than the class as a whole, if possible var issuedMemberError = false; - var _loop_21 = function (member) { + var _loop_22 = function (member) { if (ts.hasStaticModifier(member)) { return "continue"; } @@ -73281,7 +73303,7 @@ var ts; }; for (var _i = 0, _a = node.members; _i < _a.length; _i++) { var member = _a[_i]; - _loop_21(member); + _loop_22(member); } if (!issuedMemberError) { // check again with diagnostics to generate a less-specific error @@ -74054,7 +74076,6 @@ var ts; } } function checkImportBinding(node) { - checkGrammarAwaitIdentifier(node.name); checkCollisionWithRequireExportsInGeneratedCode(node, node.name); checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name); checkAliasSymbol(node); @@ -75225,10 +75246,10 @@ var ts; // If this is from nested object binding pattern // for ({ skills: { primary, secondary } } = multiRobot, i = 0; i < 1; i++) { if (expr.parent.kind === 285 /* PropertyAssignment */) { - var node_1 = ts.cast(expr.parent.parent, ts.isObjectLiteralExpression); - var typeOfParentObjectLiteral = getTypeOfAssignmentPattern(node_1) || errorType; - var propertyIndex = ts.indexOfNode(node_1.properties, expr.parent); - return checkObjectLiteralDestructuringPropertyAssignment(node_1, typeOfParentObjectLiteral, propertyIndex); + var node_2 = ts.cast(expr.parent.parent, ts.isObjectLiteralExpression); + var typeOfParentObjectLiteral = getTypeOfAssignmentPattern(node_2) || errorType; + var propertyIndex = ts.indexOfNode(node_2.properties, expr.parent); + return checkObjectLiteralDestructuringPropertyAssignment(node_2, typeOfParentObjectLiteral, propertyIndex); } // Array literal assignment - array destructuring pattern var node = ts.cast(expr.parent, ts.isArrayLiteralExpression); @@ -76585,29 +76606,18 @@ var ts; } return false; } - function checkGrammarAwaitIdentifier(name) { - if (name && ts.isIdentifier(name) && name.originalKeywordKind === 130 /* AwaitKeyword */ && isInTopLevelContext(name.parent)) { - var file = ts.getSourceFileOfNode(name); - if (!file.isDeclarationFile && ts.isExternalModule(file)) { - return grammarErrorOnNode(name, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, ts.idText(name)); - } - } - return false; - } function checkGrammarFunctionLikeDeclaration(node) { // Prevent cascading error by short-circuit var file = ts.getSourceFileOfNode(node); return checkGrammarDecoratorsAndModifiers(node) || checkGrammarTypeParameterList(node.typeParameters, file) || - (ts.isFunctionDeclaration(node) && checkGrammarAwaitIdentifier(node.name)) || checkGrammarParameterList(node.parameters) || checkGrammarArrowFunction(node, file) || (ts.isFunctionLikeDeclaration(node) && checkGrammarForUseStrictSimpleParameterList(node)); } function checkGrammarClassLikeDeclaration(node) { var file = ts.getSourceFileOfNode(node); - return (ts.isClassDeclaration(node) && checkGrammarAwaitIdentifier(node.name)) || - checkGrammarClassDeclarationHeritageClauses(node) || + return checkGrammarClassDeclarationHeritageClauses(node) || checkGrammarTypeParameterList(node.typeParameters, file); } function checkGrammarArrowFunction(node, file) { @@ -77177,9 +77187,6 @@ var ts; return grammarErrorOnNode(node.name, ts.Diagnostics.A_rest_element_cannot_have_a_property_name); } } - if (ts.isIdentifier(node.name) && checkGrammarAwaitIdentifier(node.name)) { - return true; - } if (node.dotDotDotToken && node.initializer) { // Error on equals token which immediately precedes the initializer return grammarErrorAtPos(node, node.initializer.pos - 1, 1, ts.Diagnostics.A_rest_element_cannot_have_an_initializer); @@ -77236,9 +77243,6 @@ var ts; } } } - if (ts.isIdentifier(node.name) && checkGrammarAwaitIdentifier(node.name)) { - return true; - } if (node.exclamationToken && (node.parent.parent.kind !== 229 /* VariableStatement */ || !node.type || node.initializer || node.flags & 8388608 /* Ambient */)) { return grammarErrorOnNode(node.exclamationToken, ts.Diagnostics.Definite_assignment_assertions_can_only_be_used_along_with_a_type_annotation); } @@ -107201,7 +107205,7 @@ var ts; }); // Sort by paths closest to importing file Name directory var sortedPaths = []; - var _loop_22 = function (directory) { + var _loop_23 = function (directory) { var directoryStart = ts.ensureTrailingDirectorySeparator(directory); var pathsInDirectory; allFileNames.forEach(function (canonicalFileName, fileName) { @@ -107227,7 +107231,7 @@ var ts; }; var out_directory_1; for (var directory = ts.getDirectoryPath(ts.toPath(importingFileName, cwd, getCanonicalFileName)); allFileNames.size !== 0;) { - var state_8 = _loop_22(directory); + var state_8 = _loop_23(directory); directory = out_directory_1; if (state_8 === "break") break; diff --git a/lib/tsserverlibrary.js b/lib/tsserverlibrary.js index ca693e9bad035..d63c7fdad4e75 100644 --- a/lib/tsserverlibrary.js +++ b/lib/tsserverlibrary.js @@ -13972,6 +13972,15 @@ var ts; } } ts.getThisContainer = getThisContainer; + function isInTopLevelContext(node) { + // The name of a class or function declaration is a BindingIdentifier in its surrounding scope. + if (ts.isIdentifier(node) && (ts.isClassDeclaration(node.parent) || ts.isFunctionDeclaration(node.parent)) && node.parent.name === node) { + node = node.parent; + } + var container = getThisContainer(node, /*includeArrowFunctions*/ true); + return ts.isSourceFile(container); + } + ts.isInTopLevelContext = isInTopLevelContext; function getNewTargetContainer(node) { var container = getThisContainer(node, /*includeArrowFunctions*/ false); if (container) { @@ -15169,13 +15178,7 @@ var ts; return parent.name === node; case 156 /* QualifiedName */: // Name on right hand side of dot in a type query or type reference - if (parent.right === node) { - while (parent.kind === 156 /* QualifiedName */) { - parent = parent.parent; - } - return parent.kind === 175 /* TypeQuery */ || parent.kind === 172 /* TypeReference */; - } - return false; + return parent.right === node; case 195 /* BindingElement */: case 262 /* ImportSpecifier */: // Property name in binding element or import specifier @@ -27532,31 +27535,6 @@ var ts; createBaseNode: function (kind) { return countNode(new NodeConstructor(kind, /*pos*/ 0, /*end*/ 0)); } }; var factory = ts.createNodeFactory(1 /* NoParenthesizerRules */ | 2 /* NoNodeConverters */ | 8 /* NoOriginalNode */, baseNodeFactory); - var reparseContext = { - get factory() { return factory; }, - enableEmitNotification: ts.notImplemented, - enableSubstitution: ts.notImplemented, - endLexicalEnvironment: ts.returnUndefined, - getCompilerOptions: ts.notImplemented, - getEmitHost: ts.notImplemented, - getEmitResolver: ts.notImplemented, - getEmitHelperFactory: ts.notImplemented, - setLexicalEnvironmentFlags: ts.noop, - getLexicalEnvironmentFlags: function () { return 0; }, - hoistFunctionDeclaration: ts.notImplemented, - hoistVariableDeclaration: ts.notImplemented, - addInitializationStatement: ts.notImplemented, - isEmitNotificationEnabled: ts.notImplemented, - isSubstitutionEnabled: ts.notImplemented, - onEmitNode: ts.notImplemented, - onSubstituteNode: ts.notImplemented, - readEmitHelpers: ts.notImplemented, - requestEmitHelper: ts.notImplemented, - resumeLexicalEnvironment: ts.noop, - startLexicalEnvironment: ts.noop, - suspendLexicalEnvironment: ts.noop, - addDiagnostic: ts.notImplemented, - }; var fileName; var sourceFlags; var sourceText; @@ -27620,6 +27598,8 @@ var ts; // parsing. These context flags are naturally stored and restored through normal recursive // descent parsing and unwinding. var contextFlags; + // Indicates whether we are currently parsing top-level statements. + var topLevel = true; // Whether or not we've had a parse error since creating the last AST node. If we have // encountered an error, it will be stored on the next AST node we create. Parse errors // can be broken down into three categories: @@ -27763,6 +27743,7 @@ var ts; identifierCount = 0; nodeCount = 0; sourceFlags = 0; + topLevel = true; switch (scriptKind) { case 1 /* JS */: case 2 /* JSX */: @@ -27799,6 +27780,7 @@ var ts; parsingContext = 0; identifiers = undefined; notParenthesizedArrow = undefined; + topLevel = true; } function parseSourceFileWorker(languageVersion, setParentNodes, scriptKind) { var isDeclarationFile = isDeclarationFileName(fileName); @@ -27847,107 +27829,97 @@ var ts; return node; } function reparseTopLevelAwait(sourceFile) { - return ts.visitEachChild(sourceFile, visitor, reparseContext); - function visitor(node) { - if (!(node.transformFlags & 8388608 /* ContainsPossibleTopLevelAwait */)) { - return node; - } - // We explicitly visit each non-Expression node that has an immediate Expression child so that - // we can reparse the Expression in an Await context - switch (node.kind) { - case 160 /* Decorator */: return reparseDecorator(node); - case 157 /* ComputedPropertyName */: return reparseComputedPropertyName(node); - case 220 /* ExpressionWithTypeArguments */: return reparseExpressionWithTypeArguments(node); - case 230 /* ExpressionStatement */: return reparseExpressionStatement(node); - case 231 /* IfStatement */: return reparseIfStatement(node); - case 241 /* SwitchStatement */: return reparseSwitchStatement(node); - case 240 /* WithStatement */: return reparseWithStatement(node); - case 232 /* DoStatement */: return reparseDoStatement(node); - case 233 /* WhileStatement */: return reparseWhileStatement(node); - case 234 /* ForStatement */: return reparseForStatement(node); - case 235 /* ForInStatement */: return reparseForInStatement(node); - case 236 /* ForOfStatement */: return reparseForOfStatement(node); - case 239 /* ReturnStatement */: return reparseReturnStatement(node); - case 243 /* ThrowStatement */: return reparseThrowStatement(node); - case 263 /* ExportAssignment */: return reparseExportAssignment(node); - case 246 /* VariableDeclaration */: return reparseVariableDeclaration(node); - case 195 /* BindingElement */: return reparseBindingElement(node); - default: return ts.visitEachChild(node, visitor, reparseContext); - } - } - function reparse(node, parse) { - if (node && node.transformFlags & 8388608 /* ContainsPossibleTopLevelAwait */) { - if (ts.isExpression(node)) { - return speculationHelper(function () { - scanner.setTextPos(node.pos); - var savedContextFlags = contextFlags; - contextFlags = node.flags & 25358336 /* ContextFlags */; + var savedSyntaxCursor = syntaxCursor; + var baseSyntaxCursor = IncrementalParser.createSyntaxCursor(sourceFile); + syntaxCursor = { currentNode: currentNode }; + var statements = []; + var savedParseDiagnostics = parseDiagnostics; + parseDiagnostics = []; + var pos = 0; + var start = findNextStatementWithAwait(sourceFile.statements, 0); + var _loop_3 = function () { + // append all statements between pos and start + var prevStatement = sourceFile.statements[pos]; + var nextStatement = sourceFile.statements[start]; + ts.addRange(statements, sourceFile.statements, pos, start); + pos = findNextStatementWithoutAwait(sourceFile.statements, start); + // append all diagnostics associated with the copied range + var diagnosticStart = ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= prevStatement.pos; }); + var diagnosticEnd = diagnosticStart >= 0 ? ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= nextStatement.pos; }, diagnosticStart) : -1; + if (diagnosticStart >= 0) { + ts.addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart, diagnosticEnd >= 0 ? diagnosticEnd : undefined); + } + // reparse all statements between start and pos. We skip existing diagnostics for the same range and allow the parser to generate new ones. + speculationHelper(function () { + var savedContextFlags = contextFlags; + contextFlags |= 32768 /* AwaitContext */; + scanner.setTextPos(nextStatement.pos); + nextToken(); + while (token() !== 1 /* EndOfFileToken */) { + var startPos = scanner.getStartPos(); + var statement = parseListElement(0 /* SourceElements */, parseStatement); + statements.push(statement); + if (startPos === scanner.getStartPos()) { nextToken(); - var result = doInAwaitContext(parse); - contextFlags = savedContextFlags; - return result; - }, 2 /* Reparse */); + } + if (pos >= 0) { + var nonAwaitStatement = sourceFile.statements[pos]; + if (statement.end === nonAwaitStatement.pos) { + // done reparsing this section + break; + } + if (statement.end > nonAwaitStatement.pos) { + // we ate into the next statement, so we must reparse it. + pos = findNextStatementWithoutAwait(sourceFile.statements, pos + 1); + } + } } - return ts.visitEachChild(node, visitor, reparseContext); - } - return node; + contextFlags = savedContextFlags; + }, 2 /* Reparse */); + // find the next statement containing an `await` + start = pos >= 0 ? findNextStatementWithAwait(sourceFile.statements, pos) : -1; + }; + while (start !== -1) { + _loop_3(); } - function update(updated, original) { - if (updated !== original) { - ts.setNodeFlags(updated, updated.flags | 32768 /* AwaitContext */); + // append all statements between pos and the end of the list + if (pos >= 0) { + var prevStatement_1 = sourceFile.statements[pos]; + ts.addRange(statements, sourceFile.statements, pos); + // append all diagnostics associated with the copied range + var diagnosticStart = ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= prevStatement_1.pos; }); + if (diagnosticStart >= 0) { + ts.addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart); } - return updated; - } - function reparseExpressionStatement(node) { - return update(factory.updateExpressionStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseReturnStatement(node) { - return update(factory.updateReturnStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseThrowStatement(node) { - return update(factory.updateThrowStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseIfStatement(node) { - return update(factory.updateIfStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.thenStatement, visitor), ts.visitNode(node.elseStatement, visitor)), node); } - function reparseSwitchStatement(node) { - return update(factory.updateSwitchStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.caseBlock, visitor)), node); + syntaxCursor = savedSyntaxCursor; + return factory.updateSourceFile(sourceFile, ts.setTextRange(factory.createNodeArray(statements), sourceFile.statements)); + function containsPossibleTopLevelAwait(node) { + return !(node.flags & 32768 /* AwaitContext */) + && !!(node.transformFlags & 8388608 /* ContainsPossibleTopLevelAwait */); } - function reparseWithStatement(node) { - return update(factory.updateWithStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseDoStatement(node) { - return update(factory.updateDoStatement(node, ts.visitNode(node.statement, visitor), reparse(node.expression, parseExpression)), node); - } - function reparseWhileStatement(node) { - return update(factory.updateWhileStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseForStatement(node) { - return update(factory.updateForStatement(node, reparse(node.initializer, parseExpression), reparse(node.condition, parseExpression), reparse(node.incrementor, parseExpression), ts.visitNode(node, visitor)), node); - } - function reparseForInStatement(node) { - return update(factory.updateForInStatement(node, reparse(node.initializer, parseExpression), reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseForOfStatement(node) { - return update(factory.updateForOfStatement(node, node.awaitModifier, reparse(node.initializer, parseExpression), reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseExportAssignment(node) { - return update(factory.updateExportAssignment(node, ts.visitNodes(node.decorators, visitor), node.modifiers, reparse(node.expression, parseExpression)), node); - } - function reparseExpressionWithTypeArguments(node) { - return update(factory.updateExpressionWithTypeArguments(node, reparse(node.expression, parseLeftHandSideExpressionOrHigher), node.typeArguments), node); - } - function reparseDecorator(node) { - return update(factory.updateDecorator(node, reparse(node.expression, parseLeftHandSideExpressionOrHigher)), node); - } - function reparseComputedPropertyName(node) { - return update(factory.updateComputedPropertyName(node, reparse(node.expression, parseExpression)), node); + function findNextStatementWithAwait(statements, start) { + for (var i = start; i < statements.length; i++) { + if (containsPossibleTopLevelAwait(statements[i])) { + return i; + } + } + return -1; } - function reparseVariableDeclaration(node) { - return update(factory.updateVariableDeclaration(node, ts.visitNode(node.name, visitor), node.exclamationToken, node.type, reparse(node.initializer, parseExpression)), node); + function findNextStatementWithoutAwait(statements, start) { + for (var i = start; i < statements.length; i++) { + if (!containsPossibleTopLevelAwait(statements[i])) { + return i; + } + } + return -1; } - function reparseBindingElement(node) { - return update(factory.updateBindingElement(node, node.dotDotDotToken, ts.visitNode(node.propertyName, visitor), ts.visitNode(node.name, visitor), reparse(node.initializer, parseExpression)), node); + function currentNode(position) { + var node = baseSyntaxCursor.currentNode(position); + if (topLevel && node && containsPossibleTopLevelAwait(node)) { + node.intersectsChange = true; + } + return node; } } function fixupParentReferences(rootNode) { @@ -28198,6 +28170,12 @@ var ts; function tryParse(callback) { return speculationHelper(callback, 0 /* TryParse */); } + function isBindingIdentifier() { + if (token() === 78 /* Identifier */) { + return true; + } + return token() > 115 /* LastReservedWord */; + } // Ignore strict mode flag because we will report an error in type checker instead. function isIdentifier() { if (token() === 78 /* Identifier */) { @@ -28367,6 +28345,9 @@ var ts; ts.Diagnostics.Identifier_expected; return createMissingNode(78 /* Identifier */, reportAtCurrentPosition, diagnosticMessage || defaultMessage, msgArg); } + function parseBindingIdentifier(privateIdentifierDiagnosticMessage) { + return createIdentifier(isBindingIdentifier(), /*diagnosticMessage*/ undefined, privateIdentifierDiagnosticMessage); + } function parseIdentifier(diagnosticMessage, privateIdentifierDiagnosticMessage) { return createIdentifier(isIdentifier(), diagnosticMessage, privateIdentifierDiagnosticMessage); } @@ -28544,9 +28525,9 @@ var ts; return isIdentifier() && !isHeritageClauseExtendsOrImplementsKeyword(); } case 8 /* VariableDeclarations */: - return isIdentifierOrPrivateIdentifierOrPattern(); + return isBindingIdentifierOrPrivateIdentifierOrPattern(); case 10 /* ArrayBindingElements */: - return token() === 27 /* CommaToken */ || token() === 25 /* DotDotDotToken */ || isIdentifierOrPrivateIdentifierOrPattern(); + return token() === 27 /* CommaToken */ || token() === 25 /* DotDotDotToken */ || isBindingIdentifierOrPrivateIdentifierOrPattern(); case 19 /* TypeParameters */: return isIdentifier(); case 15 /* ArrayLiteralMembers */: @@ -29388,7 +29369,7 @@ var ts; } function isStartOfParameter(isJSDocParameter) { return token() === 25 /* DotDotDotToken */ || - isIdentifierOrPrivateIdentifierOrPattern() || + isBindingIdentifierOrPrivateIdentifierOrPattern() || ts.isModifierKind(token()) || token() === 59 /* AtToken */ || isStartOfType(/*inStartOfParameter*/ !isJSDocParameter); @@ -29410,22 +29391,34 @@ var ts; } return name; } + function parseParameterInOuterAwaitContext() { + return parseParameterWorker(/*inOuterAwaitContext*/ true); + } function parseParameter() { + return parseParameterWorker(/*inOuterAwaitContext*/ false); + } + function parseParameterWorker(inOuterAwaitContext) { var pos = getNodePos(); var hasJSDoc = hasPrecedingJSDocComment(); if (token() === 107 /* ThisKeyword */) { - var node = factory.createParameterDeclaration( + var node_1 = factory.createParameterDeclaration( /*decorators*/ undefined, /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, createIdentifier(/*isIdentifier*/ true), /*questionToken*/ undefined, parseTypeAnnotation(), /*initializer*/ undefined); - return withJSDoc(finishNode(node, pos), hasJSDoc); + return withJSDoc(finishNode(node_1, pos), hasJSDoc); } // FormalParameter [Yield,Await]: // BindingElement[?Yield,?Await] - var modifiers; - return withJSDoc(finishNode(factory.createParameterDeclaration(parseDecorators(), modifiers = parseModifiers(), parseOptionalToken(25 /* DotDotDotToken */), parseNameOfParameter(modifiers), parseOptionalToken(57 /* QuestionToken */), parseTypeAnnotation(), parseInitializer()), pos), hasJSDoc); + // Decorators are parsed in the outer [Await] context, the rest of the parameter is parsed in the function's [Await] context. + var decorators = inOuterAwaitContext ? doInAwaitContext(parseDecorators) : parseDecorators(); + var savedTopLevel = topLevel; + topLevel = false; + var modifiers = parseModifiers(); + var node = withJSDoc(finishNode(factory.createParameterDeclaration(decorators, modifiers, parseOptionalToken(25 /* DotDotDotToken */), parseNameOfParameter(modifiers), parseOptionalToken(57 /* QuestionToken */), parseTypeAnnotation(), parseInitializer()), pos), hasJSDoc); + topLevel = savedTopLevel; + return node; } function parseReturnType(returnToken, isType) { if (shouldParseReturnType(returnToken, isType)) { @@ -29468,7 +29461,7 @@ var ts; setAwaitContext(!!(flags & 2 /* Await */)); var parameters = flags & 32 /* JSDoc */ ? parseDelimitedList(17 /* JSDocParameters */, parseJSDocParameter) : - parseDelimitedList(16 /* Parameters */, parseParameter); + parseDelimitedList(16 /* Parameters */, savedAwaitContext ? parseParameterInOuterAwaitContext : parseParameter); setYieldContext(savedYieldContext); setAwaitContext(savedAwaitContext); return parameters; @@ -30597,9 +30590,13 @@ var ts; // Note: even when 'IgnoreMissingOpenBrace' is passed, parseBody will still error. return parseFunctionBlock(16 /* IgnoreMissingOpenBrace */ | (isAsync ? 2 /* Await */ : 0 /* None */)); } - return isAsync + var savedTopLevel = topLevel; + topLevel = false; + var node = isAsync ? doInAwaitContext(parseAssignmentExpressionOrHigher) : doOutsideOfAwaitContext(parseAssignmentExpressionOrHigher); + topLevel = savedTopLevel; + return node; } function parseConditionalExpressionRest(leftOperand, pos) { // Note: we are passed in an expression which was produced from parseBinaryExpressionOrHigher. @@ -31590,10 +31587,10 @@ var ts; var asteriskToken = parseOptionalToken(41 /* AsteriskToken */); var isGenerator = asteriskToken ? 1 /* Yield */ : 0 /* None */; var isAsync = ts.some(modifiers, ts.isAsyncModifier) ? 2 /* Await */ : 0 /* None */; - var name = isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalIdentifier) : - isGenerator ? doInYieldContext(parseOptionalIdentifier) : - isAsync ? doInAwaitContext(parseOptionalIdentifier) : - parseOptionalIdentifier(); + var name = isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalBindingIdentifier) : + isGenerator ? doInYieldContext(parseOptionalBindingIdentifier) : + isAsync ? doInAwaitContext(parseOptionalBindingIdentifier) : + parseOptionalBindingIdentifier(); var typeParameters = parseTypeParameters(); var parameters = parseParameters(isGenerator | isAsync); var type = parseReturnType(58 /* ColonToken */, /*isType*/ false); @@ -31604,8 +31601,8 @@ var ts; var node = factory.createFunctionExpression(modifiers, asteriskToken, name, typeParameters, parameters, type, body); return withJSDoc(finishNode(node, pos), hasJSDoc); } - function parseOptionalIdentifier() { - return isIdentifier() ? parseIdentifier() : undefined; + function parseOptionalBindingIdentifier() { + return isBindingIdentifier() ? parseBindingIdentifier() : undefined; } function parseNewExpressionOrNewDotTarget() { var pos = getNodePos(); @@ -31661,6 +31658,8 @@ var ts; setYieldContext(!!(flags & 1 /* Yield */)); var savedAwaitContext = inAwaitContext(); setAwaitContext(!!(flags & 2 /* Await */)); + var savedTopLevel = topLevel; + topLevel = false; // We may be in a [Decorator] context when parsing a function expression or // arrow function. The body of the function is not in [Decorator] context. var saveDecoratorContext = inDecoratorContext(); @@ -31671,6 +31670,7 @@ var ts; if (saveDecoratorContext) { setDecoratorContext(/*val*/ true); } + topLevel = savedTopLevel; setYieldContext(savedYieldContext); setAwaitContext(savedAwaitContext); return block; @@ -32229,7 +32229,7 @@ var ts; function parseObjectBindingElement() { var pos = getNodePos(); var dotDotDotToken = parseOptionalToken(25 /* DotDotDotToken */); - var tokenIsIdentifier = isIdentifier(); + var tokenIsIdentifier = isBindingIdentifier(); var propertyName = parsePropertyName(); var name; if (tokenIsIdentifier && token() !== 58 /* ColonToken */) { @@ -32257,11 +32257,11 @@ var ts; parseExpected(23 /* CloseBracketToken */); return finishNode(factory.createArrayBindingPattern(elements), pos); } - function isIdentifierOrPrivateIdentifierOrPattern() { + function isBindingIdentifierOrPrivateIdentifierOrPattern() { return token() === 18 /* OpenBraceToken */ || token() === 22 /* OpenBracketToken */ || token() === 79 /* PrivateIdentifier */ - || isIdentifier(); + || isBindingIdentifier(); } function parseIdentifierOrPattern(privateIdentifierDiagnosticMessage) { if (token() === 22 /* OpenBracketToken */) { @@ -32270,7 +32270,7 @@ var ts; if (token() === 18 /* OpenBraceToken */) { return parseObjectBindingPattern(); } - return parseIdentifier(/*diagnosticMessage*/ undefined, privateIdentifierDiagnosticMessage); + return parseBindingIdentifier(privateIdentifierDiagnosticMessage); } function parseVariableDeclarationAllowExclamation() { return parseVariableDeclaration(/*allowExclamation*/ true); @@ -32342,7 +32342,7 @@ var ts; parseExpected(97 /* FunctionKeyword */); var asteriskToken = parseOptionalToken(41 /* AsteriskToken */); // We don't parse the name here in await context, instead we will report a grammar error in the checker. - var name = modifierFlags & 512 /* Default */ ? parseOptionalIdentifier() : parseIdentifier(); + var name = modifierFlags & 512 /* Default */ ? parseOptionalBindingIdentifier() : parseBindingIdentifier(); var isGenerator = asteriskToken ? 1 /* Yield */ : 0 /* None */; var isAsync = modifierFlags & 256 /* Async */ ? 2 /* Await */ : 0 /* None */; var typeParameters = parseTypeParameters(); @@ -32486,12 +32486,24 @@ var ts; } return false; } + function parseDecoratorExpression() { + if (inAwaitContext() && token() === 130 /* AwaitKeyword */) { + // `@await` is is disallowed in an [Await] context, but can cause parsing to go off the rails + // This simply parses the missing identifier and moves on. + var pos = getNodePos(); + var awaitExpression = parseIdentifier(ts.Diagnostics.Expression_expected); + nextToken(); + var memberExpression = parseMemberExpressionRest(pos, awaitExpression, /*allowOptionalChain*/ true); + return parseCallExpressionRest(pos, memberExpression); + } + return parseLeftHandSideExpressionOrHigher(); + } function tryParseDecorator() { var pos = getNodePos(); if (!parseOptional(59 /* AtToken */)) { return undefined; } - var expression = doInDecoratorContext(parseLeftHandSideExpressionOrHigher); + var expression = doInDecoratorContext(parseDecoratorExpression); return finishNode(factory.createDecorator(expression), pos); } function parseDecorators() { @@ -32632,8 +32644,8 @@ var ts; // - class expression with omitted name, 'implements' starts heritage clause // - class with name 'implements' // 'isImplementsClause' helps to disambiguate between these two cases - return isIdentifier() && !isImplementsClause() - ? parseIdentifier() + return isBindingIdentifier() && !isImplementsClause() + ? createIdentifier(isBindingIdentifier()) : undefined; } function isImplementsClause() { @@ -34429,6 +34441,7 @@ var ts; } } } + IncrementalParser.createSyntaxCursor = createSyntaxCursor; var InvalidPosition; (function (InvalidPosition) { InvalidPosition[InvalidPosition["Value"] = -1] = "Value"; @@ -36215,7 +36228,7 @@ var ts; } function convertObjectLiteralExpressionToJson(node, knownOptions, extraKeyDiagnostics, parentOption) { var result = returnValue ? {} : undefined; - var _loop_3 = function (element) { + var _loop_4 = function (element) { if (element.kind !== 285 /* PropertyAssignment */) { errors.push(ts.createDiagnosticForNodeInSourceFile(sourceFile, element, ts.Diagnostics.Property_assignment_expected)); return "continue"; @@ -36268,7 +36281,7 @@ var ts; }; for (var _i = 0, _a = node.properties; _i < _a.length; _i++) { var element = _a[_i]; - _loop_3(element); + _loop_4(element); } return result; } @@ -36451,7 +36464,7 @@ var ts; var optionsNameMap = _a.optionsNameMap; var result = ts.createMap(); var getCanonicalFileName = pathOptions && ts.createGetCanonicalFileName(pathOptions.useCaseSensitiveFileNames); - var _loop_4 = function (name) { + var _loop_5 = function (name) { if (ts.hasProperty(options, name)) { // tsconfig only options cannot be specified via command line, // so we can assume that only types that can appear here string | number | boolean @@ -36485,7 +36498,7 @@ var ts; } }; for (var name in options) { - _loop_4(name); + _loop_5(name); } return result; } @@ -37246,7 +37259,7 @@ var ts; } var jsonOnlyIncludeRegexes; if (validatedIncludeSpecs && validatedIncludeSpecs.length > 0) { - var _loop_5 = function (file) { + var _loop_6 = function (file) { if (ts.fileExtensionIs(file, ".json" /* Json */)) { // Valid only if *.json specified if (!jsonOnlyIncludeRegexes) { @@ -37284,7 +37297,7 @@ var ts; }; for (var _a = 0, _b = host.readDirectory(basePath, supportedExtensionsWithJsonIfResolveJsonModule, validatedExcludeSpecs, validatedIncludeSpecs, /*depth*/ undefined); _a < _b.length; _a++) { var file = _b[_a]; - _loop_5(file); + _loop_6(file); } } var literalFiles = ts.arrayFrom(literalFileMap.values()); @@ -40691,18 +40704,31 @@ var ts; currentFlow = saveCurrentFlow; } // The binder visits every node in the syntax tree so it is a convenient place to perform a single localized - // check for reserved words used as identifiers in strict mode code. - function checkStrictModeIdentifier(node) { - if (inStrictMode && - node.originalKeywordKind >= 116 /* FirstFutureReservedWord */ && - node.originalKeywordKind <= 124 /* LastFutureReservedWord */ && - !ts.isIdentifierName(node) && + // check for reserved words used as identifiers in strict mode code, as well as `yield` or `await` in + // [Yield] or [Await] contexts, respectively. + function checkContextualIdentifier(node) { + // Report error only if there are no parse errors in file + if (!file.parseDiagnostics.length && !(node.flags & 8388608 /* Ambient */) && - !(node.flags & 4194304 /* JSDoc */)) { - // Report error only if there are no parse errors in file - if (!file.parseDiagnostics.length) { + !(node.flags & 4194304 /* JSDoc */) && + !ts.isIdentifierName(node)) { + // strict mode identifiers + if (inStrictMode && + node.originalKeywordKind >= 116 /* FirstFutureReservedWord */ && + node.originalKeywordKind <= 124 /* LastFutureReservedWord */) { file.bindDiagnostics.push(createDiagnosticForNode(node, getStrictModeIdentifierMessage(node), ts.declarationNameToString(node))); } + else if (node.originalKeywordKind === 130 /* AwaitKeyword */) { + if (ts.isExternalModule(file) && ts.isInTopLevelContext(node)) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, ts.declarationNameToString(node))); + } + else if (node.flags & 32768 /* AwaitContext */) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, ts.declarationNameToString(node))); + } + } + else if (node.originalKeywordKind === 124 /* YieldKeyword */ && node.flags & 8192 /* YieldContext */) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, ts.declarationNameToString(node))); + } } } function getStrictModeIdentifierMessage(node) { @@ -40969,7 +40995,7 @@ var ts; if (currentFlow && (ts.isExpression(node) || parent.kind === 286 /* ShorthandPropertyAssignment */)) { node.flowNode = currentFlow; } - return checkStrictModeIdentifier(node); + return checkContextualIdentifier(node); case 105 /* SuperKeyword */: node.flowNode = currentFlow; break; @@ -43165,7 +43191,7 @@ var ts; function addDuplicateDeclarationError(node, message, symbolName, relatedNodes) { var errorNode = (ts.getExpandoInitializer(node, /*isPrototypeAssignment*/ false) ? ts.getNameOfExpando(node) : ts.getNameOfDeclaration(node)) || node; var err = lookupOrIssueError(errorNode, message, symbolName); - var _loop_6 = function (relatedNode) { + var _loop_7 = function (relatedNode) { var adjustedNode = (ts.getExpandoInitializer(relatedNode, /*isPrototypeAssignment*/ false) ? ts.getNameOfExpando(relatedNode) : ts.getNameOfDeclaration(relatedNode)) || relatedNode; if (adjustedNode === errorNode) return "continue"; @@ -43178,7 +43204,7 @@ var ts; }; for (var _i = 0, _a = relatedNodes || ts.emptyArray; _i < _a.length; _i++) { var relatedNode = _a[_i]; - _loop_6(relatedNode); + _loop_7(relatedNode); } } function combineSymbolTables(first, second) { @@ -45419,7 +45445,7 @@ var ts; } function forEachSymbolTableInScope(enclosingDeclaration, callback) { var result; - var _loop_7 = function (location) { + var _loop_8 = function (location) { // Locals of a source file are not in scope (because they get merged into the global symbol table) if (location.locals && !isGlobalSourceFile(location)) { if (result = callback(location.locals)) { @@ -45465,7 +45491,7 @@ var ts; } }; for (var location = enclosingDeclaration; location; location = location.parent) { - var state_2 = _loop_7(location); + var state_2 = _loop_8(location); if (typeof state_2 === "object") return state_2.value; } @@ -47475,7 +47501,7 @@ var ts; if (ts.length(reexports) > 1) { var groups = ts.group(reexports, function (decl) { return ts.isStringLiteral(decl.moduleSpecifier) ? ">" + decl.moduleSpecifier.text : ">"; }); if (groups.length !== reexports.length) { - var _loop_8 = function (group_1) { + var _loop_9 = function (group_1) { if (group_1.length > 1) { // remove group members from statements and then merge group members and add back to statements statements = __spreadArrays(ts.filter(statements, function (s) { return group_1.indexOf(s) === -1; }), [ @@ -47488,7 +47514,7 @@ var ts; }; for (var _i = 0, groups_1 = groups; _i < groups_1.length; _i++) { var group_1 = groups_1[_i]; - _loop_8(group_1); + _loop_9(group_1); } } } @@ -51000,7 +51026,7 @@ var ts; // signatures from the type, whose ordering would be non-obvious) var masterList = signatureLists[indexWithLengthOverOne !== undefined ? indexWithLengthOverOne : 0]; var results = masterList.slice(); - var _loop_9 = function (signatures) { + var _loop_10 = function (signatures) { if (signatures !== masterList) { var signature_1 = signatures[0]; ts.Debug.assert(!!signature_1, "getUnionSignatures bails early on empty signature lists and should not have empty lists on second pass"); @@ -51012,7 +51038,7 @@ var ts; }; for (var _b = 0, signatureLists_1 = signatureLists; _b < signatureLists_1.length; _b++) { var signatures = signatureLists_1[_b]; - var state_3 = _loop_9(signatures); + var state_3 = _loop_10(signatures); if (state_3 === "break") break; } @@ -51136,7 +51162,7 @@ var ts; var types = type.types; var mixinFlags = findMixins(types); var mixinCount = ts.countWhere(mixinFlags, function (b) { return b; }); - var _loop_10 = function (i) { + var _loop_11 = function (i) { var t = type.types[i]; // When an intersection type contains mixin constructor types, the construct signatures from // those types are discarded and their return types are mixed into the return types of all @@ -51159,19 +51185,19 @@ var ts; numberIndexInfo = intersectIndexInfos(numberIndexInfo, getIndexInfoOfType(t, 1 /* Number */)); }; for (var i = 0; i < types.length; i++) { - _loop_10(i); + _loop_11(i); } setStructuredTypeMembers(type, emptySymbols, callSignatures || ts.emptyArray, constructSignatures || ts.emptyArray, stringIndexInfo, numberIndexInfo); } function appendSignatures(signatures, newSignatures) { - var _loop_11 = function (sig) { + var _loop_12 = function (sig) { if (!signatures || ts.every(signatures, function (s) { return !compareSignaturesIdentical(s, sig, /*partialMatch*/ false, /*ignoreThisTypes*/ false, /*ignoreReturnTypes*/ false, compareTypesIdentical); })) { signatures = ts.append(signatures, sig); } }; for (var _i = 0, newSignatures_1 = newSignatures; _i < newSignatures_1.length; _i++) { var sig = newSignatures_1[_i]; - _loop_11(sig); + _loop_12(sig); } return signatures; } @@ -53458,7 +53484,7 @@ var ts; var expandedDeclarations = []; var optionalIndex = -1; var restTypes; - var _loop_12 = function (i) { + var _loop_13 = function (i) { var type = elementTypes[i]; var flags = target.elementFlags[i]; if (flags & 8 /* Variadic */) { @@ -53481,7 +53507,7 @@ var ts; } }; for (var i = 0; i < elementTypes.length; i++) { - _loop_12(i); + _loop_13(i); } if (restTypes) { // Create a union of the collected rest element types. @@ -54531,7 +54557,7 @@ var ts; function getConditionalType(root, mapper) { var result; var extraTypes; - var _loop_13 = function () { + var _loop_14 = function () { var checkType = instantiateType(root.checkType, mapper); var checkTypeInstantiable = isGenericObjectType(checkType) || isGenericIndexType(checkType); var extendsType = instantiateType(root.extendsType, mapper); @@ -54605,7 +54631,7 @@ var ts; // types of the form 'A extends B ? X : C extends D ? Y : E extends F ? Z : ...' as a single construct for // purposes of resolution. This means such types aren't subject to the instatiation depth limiter. while (true) { - var state_4 = _loop_13(); + var state_4 = _loop_14(); if (typeof state_4 === "object") return state_4.value; if (state_4 === "break") @@ -57083,7 +57109,7 @@ var ts; reducedTarget = findMatchingDiscriminantType(source, target, isRelatedTo) || filterPrimitivesIfContainsNonPrimitive(target); checkTypes = reducedTarget.flags & 1048576 /* Union */ ? reducedTarget.types : [reducedTarget]; } - var _loop_14 = function (prop) { + var _loop_15 = function (prop) { if (shouldCheckAsExcessProperty(prop, source.symbol) && !isIgnoredJsxProperty(source, prop)) { if (!isKnownProperty(reducedTarget, prop.escapedName, isComparingJsxAttributes)) { if (reportErrors) { @@ -57146,7 +57172,7 @@ var ts; }; for (var _i = 0, _a = getPropertiesOfType(source); _i < _a.length; _i++) { var prop = _a[_i]; - var state_5 = _loop_14(prop); + var state_5 = _loop_15(prop); if (typeof state_5 === "object") return state_5.value; } @@ -57819,11 +57845,11 @@ var ts; // constituents of 'target'. If any combination does not have a match then 'source' is not relatable. var discriminantCombinations = ts.cartesianProduct(sourceDiscriminantTypes); var matchingTypes = []; - var _loop_15 = function (combination) { + var _loop_16 = function (combination) { var hasMatch = false; outer: for (var _i = 0, _a = target.types; _i < _a.length; _i++) { var type = _a[_i]; - var _loop_16 = function (i) { + var _loop_17 = function (i) { var sourceProperty = sourcePropertiesFiltered[i]; var targetProperty = getPropertyOfType(type, sourceProperty.escapedName); if (!targetProperty) @@ -57839,7 +57865,7 @@ var ts; } }; for (var i = 0; i < sourcePropertiesFiltered.length; i++) { - var state_7 = _loop_16(i); + var state_7 = _loop_17(i); switch (state_7) { case "continue-outer": continue outer; } @@ -57853,7 +57879,7 @@ var ts; }; for (var _a = 0, discriminantCombinations_1 = discriminantCombinations; _a < discriminantCombinations_1.length; _a++) { var combination = discriminantCombinations_1[_a]; - var state_6 = _loop_15(combination); + var state_6 = _loop_16(combination); if (typeof state_6 === "object") return state_6.value; } @@ -58495,7 +58521,7 @@ var ts; // The emptyArray singleton is used to signal a recursive invocation. cache.variances = ts.emptyArray; variances = []; - var _loop_17 = function (tp) { + var _loop_18 = function (tp) { var unmeasurable = false; var unreliable = false; var oldHandler = outofbandVarianceMarkerHandler; @@ -58527,7 +58553,7 @@ var ts; }; for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { var tp = typeParameters_1[_i]; - _loop_17(tp); + _loop_18(tp); } cache.variances = variances; } @@ -66010,7 +66036,7 @@ var ts; if (spreadIndex >= 0) { // Create synthetic arguments from spreads of tuple types. var effectiveArgs_1 = args.slice(0, spreadIndex); - var _loop_18 = function (i) { + var _loop_19 = function (i) { var arg = args[i]; // We can call checkExpressionCached because spread expressions never have a contextual type. var spreadType = arg.kind === 217 /* SpreadElement */ && (flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression)); @@ -66027,7 +66053,7 @@ var ts; } }; for (var i = spreadIndex; i < args.length; i++) { - _loop_18(i); + _loop_19(i); } return effectiveArgs_1; } @@ -66329,7 +66355,7 @@ var ts; var min_3 = Number.MAX_VALUE; var minIndex = 0; var i_1 = 0; - var _loop_19 = function (c) { + var _loop_20 = function (c) { var chain_2 = function () { return ts.chainDiagnosticMessages(/*details*/ undefined, ts.Diagnostics.Overload_0_of_1_2_gave_the_following_error, i_1 + 1, candidates.length, signatureToString(c)); }; var diags_2 = getSignatureApplicabilityError(node, args, c, assignableRelation, 0 /* Normal */, /*reportErrors*/ true, chain_2); if (diags_2) { @@ -66347,7 +66373,7 @@ var ts; }; for (var _a = 0, candidatesForArgumentError_1 = candidatesForArgumentError; _a < candidatesForArgumentError_1.length; _a++) { var c = candidatesForArgumentError_1[_a]; - _loop_19(c); + _loop_20(c); } var diags_3 = max > 1 ? allDiagnostics[minIndex] : ts.flatten(allDiagnostics); ts.Debug.assert(diags_3.length > 0, "No errors reported for 3 or fewer overload signatures"); @@ -66481,7 +66507,7 @@ var ts; } var _a = ts.minAndMax(candidates, getNumNonRestParameters), minArgumentCount = _a.min, maxNonRestParam = _a.max; var parameters = []; - var _loop_20 = function (i) { + var _loop_21 = function (i) { var symbols = ts.mapDefined(candidates, function (s) { return signatureHasRestParameter(s) ? i < s.parameters.length - 1 ? s.parameters[i] : ts.last(s.parameters) : i < s.parameters.length ? s.parameters[i] : undefined; }); @@ -66489,7 +66515,7 @@ var ts; parameters.push(createCombinedSymbolFromTypes(symbols, ts.mapDefined(candidates, function (candidate) { return tryGetTypeAtPosition(candidate, i); }))); }; for (var i = 0; i < maxNonRestParam; i++) { - _loop_20(i); + _loop_21(i); } var restParameterSymbols = ts.mapDefined(candidates, function (c) { return signatureHasRestParameter(c) ? ts.last(c.parameters) : undefined; }); var flags = 0 /* None */; @@ -68241,15 +68267,11 @@ var ts; checkExpression(node.expression); return undefinedWideningType; } - function isInTopLevelContext(node) { - var container = ts.getThisContainer(node, /*includeArrowFunctions*/ true); - return ts.isSourceFile(container); - } function checkAwaitExpression(node) { // Grammar checking if (produceDiagnostics) { if (!(node.flags & 32768 /* AwaitContext */)) { - if (isInTopLevelContext(node)) { + if (ts.isInTopLevelContext(node)) { var sourceFile = ts.getSourceFileOfNode(node); if (!hasParseDiagnostics(sourceFile)) { var span = void 0; @@ -73412,7 +73434,7 @@ var ts; function issueMemberSpecificError(node, typeWithThis, baseWithThis, broadDiag) { // iterate over all implemented properties and issue errors on each one which isn't compatible, rather than the class as a whole, if possible var issuedMemberError = false; - var _loop_21 = function (member) { + var _loop_22 = function (member) { if (ts.hasStaticModifier(member)) { return "continue"; } @@ -73431,7 +73453,7 @@ var ts; }; for (var _i = 0, _a = node.members; _i < _a.length; _i++) { var member = _a[_i]; - _loop_21(member); + _loop_22(member); } if (!issuedMemberError) { // check again with diagnostics to generate a less-specific error @@ -74204,7 +74226,6 @@ var ts; } } function checkImportBinding(node) { - checkGrammarAwaitIdentifier(node.name); checkCollisionWithRequireExportsInGeneratedCode(node, node.name); checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name); checkAliasSymbol(node); @@ -75375,10 +75396,10 @@ var ts; // If this is from nested object binding pattern // for ({ skills: { primary, secondary } } = multiRobot, i = 0; i < 1; i++) { if (expr.parent.kind === 285 /* PropertyAssignment */) { - var node_1 = ts.cast(expr.parent.parent, ts.isObjectLiteralExpression); - var typeOfParentObjectLiteral = getTypeOfAssignmentPattern(node_1) || errorType; - var propertyIndex = ts.indexOfNode(node_1.properties, expr.parent); - return checkObjectLiteralDestructuringPropertyAssignment(node_1, typeOfParentObjectLiteral, propertyIndex); + var node_2 = ts.cast(expr.parent.parent, ts.isObjectLiteralExpression); + var typeOfParentObjectLiteral = getTypeOfAssignmentPattern(node_2) || errorType; + var propertyIndex = ts.indexOfNode(node_2.properties, expr.parent); + return checkObjectLiteralDestructuringPropertyAssignment(node_2, typeOfParentObjectLiteral, propertyIndex); } // Array literal assignment - array destructuring pattern var node = ts.cast(expr.parent, ts.isArrayLiteralExpression); @@ -76735,29 +76756,18 @@ var ts; } return false; } - function checkGrammarAwaitIdentifier(name) { - if (name && ts.isIdentifier(name) && name.originalKeywordKind === 130 /* AwaitKeyword */ && isInTopLevelContext(name.parent)) { - var file = ts.getSourceFileOfNode(name); - if (!file.isDeclarationFile && ts.isExternalModule(file)) { - return grammarErrorOnNode(name, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, ts.idText(name)); - } - } - return false; - } function checkGrammarFunctionLikeDeclaration(node) { // Prevent cascading error by short-circuit var file = ts.getSourceFileOfNode(node); return checkGrammarDecoratorsAndModifiers(node) || checkGrammarTypeParameterList(node.typeParameters, file) || - (ts.isFunctionDeclaration(node) && checkGrammarAwaitIdentifier(node.name)) || checkGrammarParameterList(node.parameters) || checkGrammarArrowFunction(node, file) || (ts.isFunctionLikeDeclaration(node) && checkGrammarForUseStrictSimpleParameterList(node)); } function checkGrammarClassLikeDeclaration(node) { var file = ts.getSourceFileOfNode(node); - return (ts.isClassDeclaration(node) && checkGrammarAwaitIdentifier(node.name)) || - checkGrammarClassDeclarationHeritageClauses(node) || + return checkGrammarClassDeclarationHeritageClauses(node) || checkGrammarTypeParameterList(node.typeParameters, file); } function checkGrammarArrowFunction(node, file) { @@ -77327,9 +77337,6 @@ var ts; return grammarErrorOnNode(node.name, ts.Diagnostics.A_rest_element_cannot_have_a_property_name); } } - if (ts.isIdentifier(node.name) && checkGrammarAwaitIdentifier(node.name)) { - return true; - } if (node.dotDotDotToken && node.initializer) { // Error on equals token which immediately precedes the initializer return grammarErrorAtPos(node, node.initializer.pos - 1, 1, ts.Diagnostics.A_rest_element_cannot_have_an_initializer); @@ -77386,9 +77393,6 @@ var ts; } } } - if (ts.isIdentifier(node.name) && checkGrammarAwaitIdentifier(node.name)) { - return true; - } if (node.exclamationToken && (node.parent.parent.kind !== 229 /* VariableStatement */ || !node.type || node.initializer || node.flags & 8388608 /* Ambient */)) { return grammarErrorOnNode(node.exclamationToken, ts.Diagnostics.Definite_assignment_assertions_can_only_be_used_along_with_a_type_annotation); } @@ -107351,7 +107355,7 @@ var ts; }); // Sort by paths closest to importing file Name directory var sortedPaths = []; - var _loop_22 = function (directory) { + var _loop_23 = function (directory) { var directoryStart = ts.ensureTrailingDirectorySeparator(directory); var pathsInDirectory; allFileNames.forEach(function (canonicalFileName, fileName) { @@ -107377,7 +107381,7 @@ var ts; }; var out_directory_1; for (var directory = ts.getDirectoryPath(ts.toPath(importingFileName, cwd, getCanonicalFileName)); allFileNames.size !== 0;) { - var state_8 = _loop_22(directory); + var state_8 = _loop_23(directory); directory = out_directory_1; if (state_8 === "break") break; diff --git a/lib/typescript.js b/lib/typescript.js index 756858b64d1bb..8c20b729ed7eb 100644 --- a/lib/typescript.js +++ b/lib/typescript.js @@ -13972,6 +13972,15 @@ var ts; } } ts.getThisContainer = getThisContainer; + function isInTopLevelContext(node) { + // The name of a class or function declaration is a BindingIdentifier in its surrounding scope. + if (ts.isIdentifier(node) && (ts.isClassDeclaration(node.parent) || ts.isFunctionDeclaration(node.parent)) && node.parent.name === node) { + node = node.parent; + } + var container = getThisContainer(node, /*includeArrowFunctions*/ true); + return ts.isSourceFile(container); + } + ts.isInTopLevelContext = isInTopLevelContext; function getNewTargetContainer(node) { var container = getThisContainer(node, /*includeArrowFunctions*/ false); if (container) { @@ -15169,13 +15178,7 @@ var ts; return parent.name === node; case 156 /* QualifiedName */: // Name on right hand side of dot in a type query or type reference - if (parent.right === node) { - while (parent.kind === 156 /* QualifiedName */) { - parent = parent.parent; - } - return parent.kind === 175 /* TypeQuery */ || parent.kind === 172 /* TypeReference */; - } - return false; + return parent.right === node; case 195 /* BindingElement */: case 262 /* ImportSpecifier */: // Property name in binding element or import specifier @@ -27532,31 +27535,6 @@ var ts; createBaseNode: function (kind) { return countNode(new NodeConstructor(kind, /*pos*/ 0, /*end*/ 0)); } }; var factory = ts.createNodeFactory(1 /* NoParenthesizerRules */ | 2 /* NoNodeConverters */ | 8 /* NoOriginalNode */, baseNodeFactory); - var reparseContext = { - get factory() { return factory; }, - enableEmitNotification: ts.notImplemented, - enableSubstitution: ts.notImplemented, - endLexicalEnvironment: ts.returnUndefined, - getCompilerOptions: ts.notImplemented, - getEmitHost: ts.notImplemented, - getEmitResolver: ts.notImplemented, - getEmitHelperFactory: ts.notImplemented, - setLexicalEnvironmentFlags: ts.noop, - getLexicalEnvironmentFlags: function () { return 0; }, - hoistFunctionDeclaration: ts.notImplemented, - hoistVariableDeclaration: ts.notImplemented, - addInitializationStatement: ts.notImplemented, - isEmitNotificationEnabled: ts.notImplemented, - isSubstitutionEnabled: ts.notImplemented, - onEmitNode: ts.notImplemented, - onSubstituteNode: ts.notImplemented, - readEmitHelpers: ts.notImplemented, - requestEmitHelper: ts.notImplemented, - resumeLexicalEnvironment: ts.noop, - startLexicalEnvironment: ts.noop, - suspendLexicalEnvironment: ts.noop, - addDiagnostic: ts.notImplemented, - }; var fileName; var sourceFlags; var sourceText; @@ -27620,6 +27598,8 @@ var ts; // parsing. These context flags are naturally stored and restored through normal recursive // descent parsing and unwinding. var contextFlags; + // Indicates whether we are currently parsing top-level statements. + var topLevel = true; // Whether or not we've had a parse error since creating the last AST node. If we have // encountered an error, it will be stored on the next AST node we create. Parse errors // can be broken down into three categories: @@ -27763,6 +27743,7 @@ var ts; identifierCount = 0; nodeCount = 0; sourceFlags = 0; + topLevel = true; switch (scriptKind) { case 1 /* JS */: case 2 /* JSX */: @@ -27799,6 +27780,7 @@ var ts; parsingContext = 0; identifiers = undefined; notParenthesizedArrow = undefined; + topLevel = true; } function parseSourceFileWorker(languageVersion, setParentNodes, scriptKind) { var isDeclarationFile = isDeclarationFileName(fileName); @@ -27847,107 +27829,97 @@ var ts; return node; } function reparseTopLevelAwait(sourceFile) { - return ts.visitEachChild(sourceFile, visitor, reparseContext); - function visitor(node) { - if (!(node.transformFlags & 8388608 /* ContainsPossibleTopLevelAwait */)) { - return node; - } - // We explicitly visit each non-Expression node that has an immediate Expression child so that - // we can reparse the Expression in an Await context - switch (node.kind) { - case 160 /* Decorator */: return reparseDecorator(node); - case 157 /* ComputedPropertyName */: return reparseComputedPropertyName(node); - case 220 /* ExpressionWithTypeArguments */: return reparseExpressionWithTypeArguments(node); - case 230 /* ExpressionStatement */: return reparseExpressionStatement(node); - case 231 /* IfStatement */: return reparseIfStatement(node); - case 241 /* SwitchStatement */: return reparseSwitchStatement(node); - case 240 /* WithStatement */: return reparseWithStatement(node); - case 232 /* DoStatement */: return reparseDoStatement(node); - case 233 /* WhileStatement */: return reparseWhileStatement(node); - case 234 /* ForStatement */: return reparseForStatement(node); - case 235 /* ForInStatement */: return reparseForInStatement(node); - case 236 /* ForOfStatement */: return reparseForOfStatement(node); - case 239 /* ReturnStatement */: return reparseReturnStatement(node); - case 243 /* ThrowStatement */: return reparseThrowStatement(node); - case 263 /* ExportAssignment */: return reparseExportAssignment(node); - case 246 /* VariableDeclaration */: return reparseVariableDeclaration(node); - case 195 /* BindingElement */: return reparseBindingElement(node); - default: return ts.visitEachChild(node, visitor, reparseContext); - } - } - function reparse(node, parse) { - if (node && node.transformFlags & 8388608 /* ContainsPossibleTopLevelAwait */) { - if (ts.isExpression(node)) { - return speculationHelper(function () { - scanner.setTextPos(node.pos); - var savedContextFlags = contextFlags; - contextFlags = node.flags & 25358336 /* ContextFlags */; + var savedSyntaxCursor = syntaxCursor; + var baseSyntaxCursor = IncrementalParser.createSyntaxCursor(sourceFile); + syntaxCursor = { currentNode: currentNode }; + var statements = []; + var savedParseDiagnostics = parseDiagnostics; + parseDiagnostics = []; + var pos = 0; + var start = findNextStatementWithAwait(sourceFile.statements, 0); + var _loop_3 = function () { + // append all statements between pos and start + var prevStatement = sourceFile.statements[pos]; + var nextStatement = sourceFile.statements[start]; + ts.addRange(statements, sourceFile.statements, pos, start); + pos = findNextStatementWithoutAwait(sourceFile.statements, start); + // append all diagnostics associated with the copied range + var diagnosticStart = ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= prevStatement.pos; }); + var diagnosticEnd = diagnosticStart >= 0 ? ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= nextStatement.pos; }, diagnosticStart) : -1; + if (diagnosticStart >= 0) { + ts.addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart, diagnosticEnd >= 0 ? diagnosticEnd : undefined); + } + // reparse all statements between start and pos. We skip existing diagnostics for the same range and allow the parser to generate new ones. + speculationHelper(function () { + var savedContextFlags = contextFlags; + contextFlags |= 32768 /* AwaitContext */; + scanner.setTextPos(nextStatement.pos); + nextToken(); + while (token() !== 1 /* EndOfFileToken */) { + var startPos = scanner.getStartPos(); + var statement = parseListElement(0 /* SourceElements */, parseStatement); + statements.push(statement); + if (startPos === scanner.getStartPos()) { nextToken(); - var result = doInAwaitContext(parse); - contextFlags = savedContextFlags; - return result; - }, 2 /* Reparse */); + } + if (pos >= 0) { + var nonAwaitStatement = sourceFile.statements[pos]; + if (statement.end === nonAwaitStatement.pos) { + // done reparsing this section + break; + } + if (statement.end > nonAwaitStatement.pos) { + // we ate into the next statement, so we must reparse it. + pos = findNextStatementWithoutAwait(sourceFile.statements, pos + 1); + } + } } - return ts.visitEachChild(node, visitor, reparseContext); - } - return node; + contextFlags = savedContextFlags; + }, 2 /* Reparse */); + // find the next statement containing an `await` + start = pos >= 0 ? findNextStatementWithAwait(sourceFile.statements, pos) : -1; + }; + while (start !== -1) { + _loop_3(); } - function update(updated, original) { - if (updated !== original) { - ts.setNodeFlags(updated, updated.flags | 32768 /* AwaitContext */); + // append all statements between pos and the end of the list + if (pos >= 0) { + var prevStatement_1 = sourceFile.statements[pos]; + ts.addRange(statements, sourceFile.statements, pos); + // append all diagnostics associated with the copied range + var diagnosticStart = ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= prevStatement_1.pos; }); + if (diagnosticStart >= 0) { + ts.addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart); } - return updated; - } - function reparseExpressionStatement(node) { - return update(factory.updateExpressionStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseReturnStatement(node) { - return update(factory.updateReturnStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseThrowStatement(node) { - return update(factory.updateThrowStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseIfStatement(node) { - return update(factory.updateIfStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.thenStatement, visitor), ts.visitNode(node.elseStatement, visitor)), node); } - function reparseSwitchStatement(node) { - return update(factory.updateSwitchStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.caseBlock, visitor)), node); + syntaxCursor = savedSyntaxCursor; + return factory.updateSourceFile(sourceFile, ts.setTextRange(factory.createNodeArray(statements), sourceFile.statements)); + function containsPossibleTopLevelAwait(node) { + return !(node.flags & 32768 /* AwaitContext */) + && !!(node.transformFlags & 8388608 /* ContainsPossibleTopLevelAwait */); } - function reparseWithStatement(node) { - return update(factory.updateWithStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseDoStatement(node) { - return update(factory.updateDoStatement(node, ts.visitNode(node.statement, visitor), reparse(node.expression, parseExpression)), node); - } - function reparseWhileStatement(node) { - return update(factory.updateWhileStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseForStatement(node) { - return update(factory.updateForStatement(node, reparse(node.initializer, parseExpression), reparse(node.condition, parseExpression), reparse(node.incrementor, parseExpression), ts.visitNode(node, visitor)), node); - } - function reparseForInStatement(node) { - return update(factory.updateForInStatement(node, reparse(node.initializer, parseExpression), reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseForOfStatement(node) { - return update(factory.updateForOfStatement(node, node.awaitModifier, reparse(node.initializer, parseExpression), reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseExportAssignment(node) { - return update(factory.updateExportAssignment(node, ts.visitNodes(node.decorators, visitor), node.modifiers, reparse(node.expression, parseExpression)), node); - } - function reparseExpressionWithTypeArguments(node) { - return update(factory.updateExpressionWithTypeArguments(node, reparse(node.expression, parseLeftHandSideExpressionOrHigher), node.typeArguments), node); - } - function reparseDecorator(node) { - return update(factory.updateDecorator(node, reparse(node.expression, parseLeftHandSideExpressionOrHigher)), node); - } - function reparseComputedPropertyName(node) { - return update(factory.updateComputedPropertyName(node, reparse(node.expression, parseExpression)), node); + function findNextStatementWithAwait(statements, start) { + for (var i = start; i < statements.length; i++) { + if (containsPossibleTopLevelAwait(statements[i])) { + return i; + } + } + return -1; } - function reparseVariableDeclaration(node) { - return update(factory.updateVariableDeclaration(node, ts.visitNode(node.name, visitor), node.exclamationToken, node.type, reparse(node.initializer, parseExpression)), node); + function findNextStatementWithoutAwait(statements, start) { + for (var i = start; i < statements.length; i++) { + if (!containsPossibleTopLevelAwait(statements[i])) { + return i; + } + } + return -1; } - function reparseBindingElement(node) { - return update(factory.updateBindingElement(node, node.dotDotDotToken, ts.visitNode(node.propertyName, visitor), ts.visitNode(node.name, visitor), reparse(node.initializer, parseExpression)), node); + function currentNode(position) { + var node = baseSyntaxCursor.currentNode(position); + if (topLevel && node && containsPossibleTopLevelAwait(node)) { + node.intersectsChange = true; + } + return node; } } function fixupParentReferences(rootNode) { @@ -28198,6 +28170,12 @@ var ts; function tryParse(callback) { return speculationHelper(callback, 0 /* TryParse */); } + function isBindingIdentifier() { + if (token() === 78 /* Identifier */) { + return true; + } + return token() > 115 /* LastReservedWord */; + } // Ignore strict mode flag because we will report an error in type checker instead. function isIdentifier() { if (token() === 78 /* Identifier */) { @@ -28367,6 +28345,9 @@ var ts; ts.Diagnostics.Identifier_expected; return createMissingNode(78 /* Identifier */, reportAtCurrentPosition, diagnosticMessage || defaultMessage, msgArg); } + function parseBindingIdentifier(privateIdentifierDiagnosticMessage) { + return createIdentifier(isBindingIdentifier(), /*diagnosticMessage*/ undefined, privateIdentifierDiagnosticMessage); + } function parseIdentifier(diagnosticMessage, privateIdentifierDiagnosticMessage) { return createIdentifier(isIdentifier(), diagnosticMessage, privateIdentifierDiagnosticMessage); } @@ -28544,9 +28525,9 @@ var ts; return isIdentifier() && !isHeritageClauseExtendsOrImplementsKeyword(); } case 8 /* VariableDeclarations */: - return isIdentifierOrPrivateIdentifierOrPattern(); + return isBindingIdentifierOrPrivateIdentifierOrPattern(); case 10 /* ArrayBindingElements */: - return token() === 27 /* CommaToken */ || token() === 25 /* DotDotDotToken */ || isIdentifierOrPrivateIdentifierOrPattern(); + return token() === 27 /* CommaToken */ || token() === 25 /* DotDotDotToken */ || isBindingIdentifierOrPrivateIdentifierOrPattern(); case 19 /* TypeParameters */: return isIdentifier(); case 15 /* ArrayLiteralMembers */: @@ -29388,7 +29369,7 @@ var ts; } function isStartOfParameter(isJSDocParameter) { return token() === 25 /* DotDotDotToken */ || - isIdentifierOrPrivateIdentifierOrPattern() || + isBindingIdentifierOrPrivateIdentifierOrPattern() || ts.isModifierKind(token()) || token() === 59 /* AtToken */ || isStartOfType(/*inStartOfParameter*/ !isJSDocParameter); @@ -29410,22 +29391,34 @@ var ts; } return name; } + function parseParameterInOuterAwaitContext() { + return parseParameterWorker(/*inOuterAwaitContext*/ true); + } function parseParameter() { + return parseParameterWorker(/*inOuterAwaitContext*/ false); + } + function parseParameterWorker(inOuterAwaitContext) { var pos = getNodePos(); var hasJSDoc = hasPrecedingJSDocComment(); if (token() === 107 /* ThisKeyword */) { - var node = factory.createParameterDeclaration( + var node_1 = factory.createParameterDeclaration( /*decorators*/ undefined, /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, createIdentifier(/*isIdentifier*/ true), /*questionToken*/ undefined, parseTypeAnnotation(), /*initializer*/ undefined); - return withJSDoc(finishNode(node, pos), hasJSDoc); + return withJSDoc(finishNode(node_1, pos), hasJSDoc); } // FormalParameter [Yield,Await]: // BindingElement[?Yield,?Await] - var modifiers; - return withJSDoc(finishNode(factory.createParameterDeclaration(parseDecorators(), modifiers = parseModifiers(), parseOptionalToken(25 /* DotDotDotToken */), parseNameOfParameter(modifiers), parseOptionalToken(57 /* QuestionToken */), parseTypeAnnotation(), parseInitializer()), pos), hasJSDoc); + // Decorators are parsed in the outer [Await] context, the rest of the parameter is parsed in the function's [Await] context. + var decorators = inOuterAwaitContext ? doInAwaitContext(parseDecorators) : parseDecorators(); + var savedTopLevel = topLevel; + topLevel = false; + var modifiers = parseModifiers(); + var node = withJSDoc(finishNode(factory.createParameterDeclaration(decorators, modifiers, parseOptionalToken(25 /* DotDotDotToken */), parseNameOfParameter(modifiers), parseOptionalToken(57 /* QuestionToken */), parseTypeAnnotation(), parseInitializer()), pos), hasJSDoc); + topLevel = savedTopLevel; + return node; } function parseReturnType(returnToken, isType) { if (shouldParseReturnType(returnToken, isType)) { @@ -29468,7 +29461,7 @@ var ts; setAwaitContext(!!(flags & 2 /* Await */)); var parameters = flags & 32 /* JSDoc */ ? parseDelimitedList(17 /* JSDocParameters */, parseJSDocParameter) : - parseDelimitedList(16 /* Parameters */, parseParameter); + parseDelimitedList(16 /* Parameters */, savedAwaitContext ? parseParameterInOuterAwaitContext : parseParameter); setYieldContext(savedYieldContext); setAwaitContext(savedAwaitContext); return parameters; @@ -30597,9 +30590,13 @@ var ts; // Note: even when 'IgnoreMissingOpenBrace' is passed, parseBody will still error. return parseFunctionBlock(16 /* IgnoreMissingOpenBrace */ | (isAsync ? 2 /* Await */ : 0 /* None */)); } - return isAsync + var savedTopLevel = topLevel; + topLevel = false; + var node = isAsync ? doInAwaitContext(parseAssignmentExpressionOrHigher) : doOutsideOfAwaitContext(parseAssignmentExpressionOrHigher); + topLevel = savedTopLevel; + return node; } function parseConditionalExpressionRest(leftOperand, pos) { // Note: we are passed in an expression which was produced from parseBinaryExpressionOrHigher. @@ -31590,10 +31587,10 @@ var ts; var asteriskToken = parseOptionalToken(41 /* AsteriskToken */); var isGenerator = asteriskToken ? 1 /* Yield */ : 0 /* None */; var isAsync = ts.some(modifiers, ts.isAsyncModifier) ? 2 /* Await */ : 0 /* None */; - var name = isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalIdentifier) : - isGenerator ? doInYieldContext(parseOptionalIdentifier) : - isAsync ? doInAwaitContext(parseOptionalIdentifier) : - parseOptionalIdentifier(); + var name = isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalBindingIdentifier) : + isGenerator ? doInYieldContext(parseOptionalBindingIdentifier) : + isAsync ? doInAwaitContext(parseOptionalBindingIdentifier) : + parseOptionalBindingIdentifier(); var typeParameters = parseTypeParameters(); var parameters = parseParameters(isGenerator | isAsync); var type = parseReturnType(58 /* ColonToken */, /*isType*/ false); @@ -31604,8 +31601,8 @@ var ts; var node = factory.createFunctionExpression(modifiers, asteriskToken, name, typeParameters, parameters, type, body); return withJSDoc(finishNode(node, pos), hasJSDoc); } - function parseOptionalIdentifier() { - return isIdentifier() ? parseIdentifier() : undefined; + function parseOptionalBindingIdentifier() { + return isBindingIdentifier() ? parseBindingIdentifier() : undefined; } function parseNewExpressionOrNewDotTarget() { var pos = getNodePos(); @@ -31661,6 +31658,8 @@ var ts; setYieldContext(!!(flags & 1 /* Yield */)); var savedAwaitContext = inAwaitContext(); setAwaitContext(!!(flags & 2 /* Await */)); + var savedTopLevel = topLevel; + topLevel = false; // We may be in a [Decorator] context when parsing a function expression or // arrow function. The body of the function is not in [Decorator] context. var saveDecoratorContext = inDecoratorContext(); @@ -31671,6 +31670,7 @@ var ts; if (saveDecoratorContext) { setDecoratorContext(/*val*/ true); } + topLevel = savedTopLevel; setYieldContext(savedYieldContext); setAwaitContext(savedAwaitContext); return block; @@ -32229,7 +32229,7 @@ var ts; function parseObjectBindingElement() { var pos = getNodePos(); var dotDotDotToken = parseOptionalToken(25 /* DotDotDotToken */); - var tokenIsIdentifier = isIdentifier(); + var tokenIsIdentifier = isBindingIdentifier(); var propertyName = parsePropertyName(); var name; if (tokenIsIdentifier && token() !== 58 /* ColonToken */) { @@ -32257,11 +32257,11 @@ var ts; parseExpected(23 /* CloseBracketToken */); return finishNode(factory.createArrayBindingPattern(elements), pos); } - function isIdentifierOrPrivateIdentifierOrPattern() { + function isBindingIdentifierOrPrivateIdentifierOrPattern() { return token() === 18 /* OpenBraceToken */ || token() === 22 /* OpenBracketToken */ || token() === 79 /* PrivateIdentifier */ - || isIdentifier(); + || isBindingIdentifier(); } function parseIdentifierOrPattern(privateIdentifierDiagnosticMessage) { if (token() === 22 /* OpenBracketToken */) { @@ -32270,7 +32270,7 @@ var ts; if (token() === 18 /* OpenBraceToken */) { return parseObjectBindingPattern(); } - return parseIdentifier(/*diagnosticMessage*/ undefined, privateIdentifierDiagnosticMessage); + return parseBindingIdentifier(privateIdentifierDiagnosticMessage); } function parseVariableDeclarationAllowExclamation() { return parseVariableDeclaration(/*allowExclamation*/ true); @@ -32342,7 +32342,7 @@ var ts; parseExpected(97 /* FunctionKeyword */); var asteriskToken = parseOptionalToken(41 /* AsteriskToken */); // We don't parse the name here in await context, instead we will report a grammar error in the checker. - var name = modifierFlags & 512 /* Default */ ? parseOptionalIdentifier() : parseIdentifier(); + var name = modifierFlags & 512 /* Default */ ? parseOptionalBindingIdentifier() : parseBindingIdentifier(); var isGenerator = asteriskToken ? 1 /* Yield */ : 0 /* None */; var isAsync = modifierFlags & 256 /* Async */ ? 2 /* Await */ : 0 /* None */; var typeParameters = parseTypeParameters(); @@ -32486,12 +32486,24 @@ var ts; } return false; } + function parseDecoratorExpression() { + if (inAwaitContext() && token() === 130 /* AwaitKeyword */) { + // `@await` is is disallowed in an [Await] context, but can cause parsing to go off the rails + // This simply parses the missing identifier and moves on. + var pos = getNodePos(); + var awaitExpression = parseIdentifier(ts.Diagnostics.Expression_expected); + nextToken(); + var memberExpression = parseMemberExpressionRest(pos, awaitExpression, /*allowOptionalChain*/ true); + return parseCallExpressionRest(pos, memberExpression); + } + return parseLeftHandSideExpressionOrHigher(); + } function tryParseDecorator() { var pos = getNodePos(); if (!parseOptional(59 /* AtToken */)) { return undefined; } - var expression = doInDecoratorContext(parseLeftHandSideExpressionOrHigher); + var expression = doInDecoratorContext(parseDecoratorExpression); return finishNode(factory.createDecorator(expression), pos); } function parseDecorators() { @@ -32632,8 +32644,8 @@ var ts; // - class expression with omitted name, 'implements' starts heritage clause // - class with name 'implements' // 'isImplementsClause' helps to disambiguate between these two cases - return isIdentifier() && !isImplementsClause() - ? parseIdentifier() + return isBindingIdentifier() && !isImplementsClause() + ? createIdentifier(isBindingIdentifier()) : undefined; } function isImplementsClause() { @@ -34429,6 +34441,7 @@ var ts; } } } + IncrementalParser.createSyntaxCursor = createSyntaxCursor; var InvalidPosition; (function (InvalidPosition) { InvalidPosition[InvalidPosition["Value"] = -1] = "Value"; @@ -36215,7 +36228,7 @@ var ts; } function convertObjectLiteralExpressionToJson(node, knownOptions, extraKeyDiagnostics, parentOption) { var result = returnValue ? {} : undefined; - var _loop_3 = function (element) { + var _loop_4 = function (element) { if (element.kind !== 285 /* PropertyAssignment */) { errors.push(ts.createDiagnosticForNodeInSourceFile(sourceFile, element, ts.Diagnostics.Property_assignment_expected)); return "continue"; @@ -36268,7 +36281,7 @@ var ts; }; for (var _i = 0, _a = node.properties; _i < _a.length; _i++) { var element = _a[_i]; - _loop_3(element); + _loop_4(element); } return result; } @@ -36451,7 +36464,7 @@ var ts; var optionsNameMap = _a.optionsNameMap; var result = ts.createMap(); var getCanonicalFileName = pathOptions && ts.createGetCanonicalFileName(pathOptions.useCaseSensitiveFileNames); - var _loop_4 = function (name) { + var _loop_5 = function (name) { if (ts.hasProperty(options, name)) { // tsconfig only options cannot be specified via command line, // so we can assume that only types that can appear here string | number | boolean @@ -36485,7 +36498,7 @@ var ts; } }; for (var name in options) { - _loop_4(name); + _loop_5(name); } return result; } @@ -37246,7 +37259,7 @@ var ts; } var jsonOnlyIncludeRegexes; if (validatedIncludeSpecs && validatedIncludeSpecs.length > 0) { - var _loop_5 = function (file) { + var _loop_6 = function (file) { if (ts.fileExtensionIs(file, ".json" /* Json */)) { // Valid only if *.json specified if (!jsonOnlyIncludeRegexes) { @@ -37284,7 +37297,7 @@ var ts; }; for (var _a = 0, _b = host.readDirectory(basePath, supportedExtensionsWithJsonIfResolveJsonModule, validatedExcludeSpecs, validatedIncludeSpecs, /*depth*/ undefined); _a < _b.length; _a++) { var file = _b[_a]; - _loop_5(file); + _loop_6(file); } } var literalFiles = ts.arrayFrom(literalFileMap.values()); @@ -40691,18 +40704,31 @@ var ts; currentFlow = saveCurrentFlow; } // The binder visits every node in the syntax tree so it is a convenient place to perform a single localized - // check for reserved words used as identifiers in strict mode code. - function checkStrictModeIdentifier(node) { - if (inStrictMode && - node.originalKeywordKind >= 116 /* FirstFutureReservedWord */ && - node.originalKeywordKind <= 124 /* LastFutureReservedWord */ && - !ts.isIdentifierName(node) && + // check for reserved words used as identifiers in strict mode code, as well as `yield` or `await` in + // [Yield] or [Await] contexts, respectively. + function checkContextualIdentifier(node) { + // Report error only if there are no parse errors in file + if (!file.parseDiagnostics.length && !(node.flags & 8388608 /* Ambient */) && - !(node.flags & 4194304 /* JSDoc */)) { - // Report error only if there are no parse errors in file - if (!file.parseDiagnostics.length) { + !(node.flags & 4194304 /* JSDoc */) && + !ts.isIdentifierName(node)) { + // strict mode identifiers + if (inStrictMode && + node.originalKeywordKind >= 116 /* FirstFutureReservedWord */ && + node.originalKeywordKind <= 124 /* LastFutureReservedWord */) { file.bindDiagnostics.push(createDiagnosticForNode(node, getStrictModeIdentifierMessage(node), ts.declarationNameToString(node))); } + else if (node.originalKeywordKind === 130 /* AwaitKeyword */) { + if (ts.isExternalModule(file) && ts.isInTopLevelContext(node)) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, ts.declarationNameToString(node))); + } + else if (node.flags & 32768 /* AwaitContext */) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, ts.declarationNameToString(node))); + } + } + else if (node.originalKeywordKind === 124 /* YieldKeyword */ && node.flags & 8192 /* YieldContext */) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, ts.declarationNameToString(node))); + } } } function getStrictModeIdentifierMessage(node) { @@ -40969,7 +40995,7 @@ var ts; if (currentFlow && (ts.isExpression(node) || parent.kind === 286 /* ShorthandPropertyAssignment */)) { node.flowNode = currentFlow; } - return checkStrictModeIdentifier(node); + return checkContextualIdentifier(node); case 105 /* SuperKeyword */: node.flowNode = currentFlow; break; @@ -43165,7 +43191,7 @@ var ts; function addDuplicateDeclarationError(node, message, symbolName, relatedNodes) { var errorNode = (ts.getExpandoInitializer(node, /*isPrototypeAssignment*/ false) ? ts.getNameOfExpando(node) : ts.getNameOfDeclaration(node)) || node; var err = lookupOrIssueError(errorNode, message, symbolName); - var _loop_6 = function (relatedNode) { + var _loop_7 = function (relatedNode) { var adjustedNode = (ts.getExpandoInitializer(relatedNode, /*isPrototypeAssignment*/ false) ? ts.getNameOfExpando(relatedNode) : ts.getNameOfDeclaration(relatedNode)) || relatedNode; if (adjustedNode === errorNode) return "continue"; @@ -43178,7 +43204,7 @@ var ts; }; for (var _i = 0, _a = relatedNodes || ts.emptyArray; _i < _a.length; _i++) { var relatedNode = _a[_i]; - _loop_6(relatedNode); + _loop_7(relatedNode); } } function combineSymbolTables(first, second) { @@ -45419,7 +45445,7 @@ var ts; } function forEachSymbolTableInScope(enclosingDeclaration, callback) { var result; - var _loop_7 = function (location) { + var _loop_8 = function (location) { // Locals of a source file are not in scope (because they get merged into the global symbol table) if (location.locals && !isGlobalSourceFile(location)) { if (result = callback(location.locals)) { @@ -45465,7 +45491,7 @@ var ts; } }; for (var location = enclosingDeclaration; location; location = location.parent) { - var state_2 = _loop_7(location); + var state_2 = _loop_8(location); if (typeof state_2 === "object") return state_2.value; } @@ -47475,7 +47501,7 @@ var ts; if (ts.length(reexports) > 1) { var groups = ts.group(reexports, function (decl) { return ts.isStringLiteral(decl.moduleSpecifier) ? ">" + decl.moduleSpecifier.text : ">"; }); if (groups.length !== reexports.length) { - var _loop_8 = function (group_1) { + var _loop_9 = function (group_1) { if (group_1.length > 1) { // remove group members from statements and then merge group members and add back to statements statements = __spreadArrays(ts.filter(statements, function (s) { return group_1.indexOf(s) === -1; }), [ @@ -47488,7 +47514,7 @@ var ts; }; for (var _i = 0, groups_1 = groups; _i < groups_1.length; _i++) { var group_1 = groups_1[_i]; - _loop_8(group_1); + _loop_9(group_1); } } } @@ -51000,7 +51026,7 @@ var ts; // signatures from the type, whose ordering would be non-obvious) var masterList = signatureLists[indexWithLengthOverOne !== undefined ? indexWithLengthOverOne : 0]; var results = masterList.slice(); - var _loop_9 = function (signatures) { + var _loop_10 = function (signatures) { if (signatures !== masterList) { var signature_1 = signatures[0]; ts.Debug.assert(!!signature_1, "getUnionSignatures bails early on empty signature lists and should not have empty lists on second pass"); @@ -51012,7 +51038,7 @@ var ts; }; for (var _b = 0, signatureLists_1 = signatureLists; _b < signatureLists_1.length; _b++) { var signatures = signatureLists_1[_b]; - var state_3 = _loop_9(signatures); + var state_3 = _loop_10(signatures); if (state_3 === "break") break; } @@ -51136,7 +51162,7 @@ var ts; var types = type.types; var mixinFlags = findMixins(types); var mixinCount = ts.countWhere(mixinFlags, function (b) { return b; }); - var _loop_10 = function (i) { + var _loop_11 = function (i) { var t = type.types[i]; // When an intersection type contains mixin constructor types, the construct signatures from // those types are discarded and their return types are mixed into the return types of all @@ -51159,19 +51185,19 @@ var ts; numberIndexInfo = intersectIndexInfos(numberIndexInfo, getIndexInfoOfType(t, 1 /* Number */)); }; for (var i = 0; i < types.length; i++) { - _loop_10(i); + _loop_11(i); } setStructuredTypeMembers(type, emptySymbols, callSignatures || ts.emptyArray, constructSignatures || ts.emptyArray, stringIndexInfo, numberIndexInfo); } function appendSignatures(signatures, newSignatures) { - var _loop_11 = function (sig) { + var _loop_12 = function (sig) { if (!signatures || ts.every(signatures, function (s) { return !compareSignaturesIdentical(s, sig, /*partialMatch*/ false, /*ignoreThisTypes*/ false, /*ignoreReturnTypes*/ false, compareTypesIdentical); })) { signatures = ts.append(signatures, sig); } }; for (var _i = 0, newSignatures_1 = newSignatures; _i < newSignatures_1.length; _i++) { var sig = newSignatures_1[_i]; - _loop_11(sig); + _loop_12(sig); } return signatures; } @@ -53458,7 +53484,7 @@ var ts; var expandedDeclarations = []; var optionalIndex = -1; var restTypes; - var _loop_12 = function (i) { + var _loop_13 = function (i) { var type = elementTypes[i]; var flags = target.elementFlags[i]; if (flags & 8 /* Variadic */) { @@ -53481,7 +53507,7 @@ var ts; } }; for (var i = 0; i < elementTypes.length; i++) { - _loop_12(i); + _loop_13(i); } if (restTypes) { // Create a union of the collected rest element types. @@ -54531,7 +54557,7 @@ var ts; function getConditionalType(root, mapper) { var result; var extraTypes; - var _loop_13 = function () { + var _loop_14 = function () { var checkType = instantiateType(root.checkType, mapper); var checkTypeInstantiable = isGenericObjectType(checkType) || isGenericIndexType(checkType); var extendsType = instantiateType(root.extendsType, mapper); @@ -54605,7 +54631,7 @@ var ts; // types of the form 'A extends B ? X : C extends D ? Y : E extends F ? Z : ...' as a single construct for // purposes of resolution. This means such types aren't subject to the instatiation depth limiter. while (true) { - var state_4 = _loop_13(); + var state_4 = _loop_14(); if (typeof state_4 === "object") return state_4.value; if (state_4 === "break") @@ -57083,7 +57109,7 @@ var ts; reducedTarget = findMatchingDiscriminantType(source, target, isRelatedTo) || filterPrimitivesIfContainsNonPrimitive(target); checkTypes = reducedTarget.flags & 1048576 /* Union */ ? reducedTarget.types : [reducedTarget]; } - var _loop_14 = function (prop) { + var _loop_15 = function (prop) { if (shouldCheckAsExcessProperty(prop, source.symbol) && !isIgnoredJsxProperty(source, prop)) { if (!isKnownProperty(reducedTarget, prop.escapedName, isComparingJsxAttributes)) { if (reportErrors) { @@ -57146,7 +57172,7 @@ var ts; }; for (var _i = 0, _a = getPropertiesOfType(source); _i < _a.length; _i++) { var prop = _a[_i]; - var state_5 = _loop_14(prop); + var state_5 = _loop_15(prop); if (typeof state_5 === "object") return state_5.value; } @@ -57819,11 +57845,11 @@ var ts; // constituents of 'target'. If any combination does not have a match then 'source' is not relatable. var discriminantCombinations = ts.cartesianProduct(sourceDiscriminantTypes); var matchingTypes = []; - var _loop_15 = function (combination) { + var _loop_16 = function (combination) { var hasMatch = false; outer: for (var _i = 0, _a = target.types; _i < _a.length; _i++) { var type = _a[_i]; - var _loop_16 = function (i) { + var _loop_17 = function (i) { var sourceProperty = sourcePropertiesFiltered[i]; var targetProperty = getPropertyOfType(type, sourceProperty.escapedName); if (!targetProperty) @@ -57839,7 +57865,7 @@ var ts; } }; for (var i = 0; i < sourcePropertiesFiltered.length; i++) { - var state_7 = _loop_16(i); + var state_7 = _loop_17(i); switch (state_7) { case "continue-outer": continue outer; } @@ -57853,7 +57879,7 @@ var ts; }; for (var _a = 0, discriminantCombinations_1 = discriminantCombinations; _a < discriminantCombinations_1.length; _a++) { var combination = discriminantCombinations_1[_a]; - var state_6 = _loop_15(combination); + var state_6 = _loop_16(combination); if (typeof state_6 === "object") return state_6.value; } @@ -58495,7 +58521,7 @@ var ts; // The emptyArray singleton is used to signal a recursive invocation. cache.variances = ts.emptyArray; variances = []; - var _loop_17 = function (tp) { + var _loop_18 = function (tp) { var unmeasurable = false; var unreliable = false; var oldHandler = outofbandVarianceMarkerHandler; @@ -58527,7 +58553,7 @@ var ts; }; for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { var tp = typeParameters_1[_i]; - _loop_17(tp); + _loop_18(tp); } cache.variances = variances; } @@ -66010,7 +66036,7 @@ var ts; if (spreadIndex >= 0) { // Create synthetic arguments from spreads of tuple types. var effectiveArgs_1 = args.slice(0, spreadIndex); - var _loop_18 = function (i) { + var _loop_19 = function (i) { var arg = args[i]; // We can call checkExpressionCached because spread expressions never have a contextual type. var spreadType = arg.kind === 217 /* SpreadElement */ && (flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression)); @@ -66027,7 +66053,7 @@ var ts; } }; for (var i = spreadIndex; i < args.length; i++) { - _loop_18(i); + _loop_19(i); } return effectiveArgs_1; } @@ -66329,7 +66355,7 @@ var ts; var min_3 = Number.MAX_VALUE; var minIndex = 0; var i_1 = 0; - var _loop_19 = function (c) { + var _loop_20 = function (c) { var chain_2 = function () { return ts.chainDiagnosticMessages(/*details*/ undefined, ts.Diagnostics.Overload_0_of_1_2_gave_the_following_error, i_1 + 1, candidates.length, signatureToString(c)); }; var diags_2 = getSignatureApplicabilityError(node, args, c, assignableRelation, 0 /* Normal */, /*reportErrors*/ true, chain_2); if (diags_2) { @@ -66347,7 +66373,7 @@ var ts; }; for (var _a = 0, candidatesForArgumentError_1 = candidatesForArgumentError; _a < candidatesForArgumentError_1.length; _a++) { var c = candidatesForArgumentError_1[_a]; - _loop_19(c); + _loop_20(c); } var diags_3 = max > 1 ? allDiagnostics[minIndex] : ts.flatten(allDiagnostics); ts.Debug.assert(diags_3.length > 0, "No errors reported for 3 or fewer overload signatures"); @@ -66481,7 +66507,7 @@ var ts; } var _a = ts.minAndMax(candidates, getNumNonRestParameters), minArgumentCount = _a.min, maxNonRestParam = _a.max; var parameters = []; - var _loop_20 = function (i) { + var _loop_21 = function (i) { var symbols = ts.mapDefined(candidates, function (s) { return signatureHasRestParameter(s) ? i < s.parameters.length - 1 ? s.parameters[i] : ts.last(s.parameters) : i < s.parameters.length ? s.parameters[i] : undefined; }); @@ -66489,7 +66515,7 @@ var ts; parameters.push(createCombinedSymbolFromTypes(symbols, ts.mapDefined(candidates, function (candidate) { return tryGetTypeAtPosition(candidate, i); }))); }; for (var i = 0; i < maxNonRestParam; i++) { - _loop_20(i); + _loop_21(i); } var restParameterSymbols = ts.mapDefined(candidates, function (c) { return signatureHasRestParameter(c) ? ts.last(c.parameters) : undefined; }); var flags = 0 /* None */; @@ -68241,15 +68267,11 @@ var ts; checkExpression(node.expression); return undefinedWideningType; } - function isInTopLevelContext(node) { - var container = ts.getThisContainer(node, /*includeArrowFunctions*/ true); - return ts.isSourceFile(container); - } function checkAwaitExpression(node) { // Grammar checking if (produceDiagnostics) { if (!(node.flags & 32768 /* AwaitContext */)) { - if (isInTopLevelContext(node)) { + if (ts.isInTopLevelContext(node)) { var sourceFile = ts.getSourceFileOfNode(node); if (!hasParseDiagnostics(sourceFile)) { var span = void 0; @@ -73412,7 +73434,7 @@ var ts; function issueMemberSpecificError(node, typeWithThis, baseWithThis, broadDiag) { // iterate over all implemented properties and issue errors on each one which isn't compatible, rather than the class as a whole, if possible var issuedMemberError = false; - var _loop_21 = function (member) { + var _loop_22 = function (member) { if (ts.hasStaticModifier(member)) { return "continue"; } @@ -73431,7 +73453,7 @@ var ts; }; for (var _i = 0, _a = node.members; _i < _a.length; _i++) { var member = _a[_i]; - _loop_21(member); + _loop_22(member); } if (!issuedMemberError) { // check again with diagnostics to generate a less-specific error @@ -74204,7 +74226,6 @@ var ts; } } function checkImportBinding(node) { - checkGrammarAwaitIdentifier(node.name); checkCollisionWithRequireExportsInGeneratedCode(node, node.name); checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name); checkAliasSymbol(node); @@ -75375,10 +75396,10 @@ var ts; // If this is from nested object binding pattern // for ({ skills: { primary, secondary } } = multiRobot, i = 0; i < 1; i++) { if (expr.parent.kind === 285 /* PropertyAssignment */) { - var node_1 = ts.cast(expr.parent.parent, ts.isObjectLiteralExpression); - var typeOfParentObjectLiteral = getTypeOfAssignmentPattern(node_1) || errorType; - var propertyIndex = ts.indexOfNode(node_1.properties, expr.parent); - return checkObjectLiteralDestructuringPropertyAssignment(node_1, typeOfParentObjectLiteral, propertyIndex); + var node_2 = ts.cast(expr.parent.parent, ts.isObjectLiteralExpression); + var typeOfParentObjectLiteral = getTypeOfAssignmentPattern(node_2) || errorType; + var propertyIndex = ts.indexOfNode(node_2.properties, expr.parent); + return checkObjectLiteralDestructuringPropertyAssignment(node_2, typeOfParentObjectLiteral, propertyIndex); } // Array literal assignment - array destructuring pattern var node = ts.cast(expr.parent, ts.isArrayLiteralExpression); @@ -76735,29 +76756,18 @@ var ts; } return false; } - function checkGrammarAwaitIdentifier(name) { - if (name && ts.isIdentifier(name) && name.originalKeywordKind === 130 /* AwaitKeyword */ && isInTopLevelContext(name.parent)) { - var file = ts.getSourceFileOfNode(name); - if (!file.isDeclarationFile && ts.isExternalModule(file)) { - return grammarErrorOnNode(name, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, ts.idText(name)); - } - } - return false; - } function checkGrammarFunctionLikeDeclaration(node) { // Prevent cascading error by short-circuit var file = ts.getSourceFileOfNode(node); return checkGrammarDecoratorsAndModifiers(node) || checkGrammarTypeParameterList(node.typeParameters, file) || - (ts.isFunctionDeclaration(node) && checkGrammarAwaitIdentifier(node.name)) || checkGrammarParameterList(node.parameters) || checkGrammarArrowFunction(node, file) || (ts.isFunctionLikeDeclaration(node) && checkGrammarForUseStrictSimpleParameterList(node)); } function checkGrammarClassLikeDeclaration(node) { var file = ts.getSourceFileOfNode(node); - return (ts.isClassDeclaration(node) && checkGrammarAwaitIdentifier(node.name)) || - checkGrammarClassDeclarationHeritageClauses(node) || + return checkGrammarClassDeclarationHeritageClauses(node) || checkGrammarTypeParameterList(node.typeParameters, file); } function checkGrammarArrowFunction(node, file) { @@ -77327,9 +77337,6 @@ var ts; return grammarErrorOnNode(node.name, ts.Diagnostics.A_rest_element_cannot_have_a_property_name); } } - if (ts.isIdentifier(node.name) && checkGrammarAwaitIdentifier(node.name)) { - return true; - } if (node.dotDotDotToken && node.initializer) { // Error on equals token which immediately precedes the initializer return grammarErrorAtPos(node, node.initializer.pos - 1, 1, ts.Diagnostics.A_rest_element_cannot_have_an_initializer); @@ -77386,9 +77393,6 @@ var ts; } } } - if (ts.isIdentifier(node.name) && checkGrammarAwaitIdentifier(node.name)) { - return true; - } if (node.exclamationToken && (node.parent.parent.kind !== 229 /* VariableStatement */ || !node.type || node.initializer || node.flags & 8388608 /* Ambient */)) { return grammarErrorOnNode(node.exclamationToken, ts.Diagnostics.Definite_assignment_assertions_can_only_be_used_along_with_a_type_annotation); } @@ -107351,7 +107355,7 @@ var ts; }); // Sort by paths closest to importing file Name directory var sortedPaths = []; - var _loop_22 = function (directory) { + var _loop_23 = function (directory) { var directoryStart = ts.ensureTrailingDirectorySeparator(directory); var pathsInDirectory; allFileNames.forEach(function (canonicalFileName, fileName) { @@ -107377,7 +107381,7 @@ var ts; }; var out_directory_1; for (var directory = ts.getDirectoryPath(ts.toPath(importingFileName, cwd, getCanonicalFileName)); allFileNames.size !== 0;) { - var state_8 = _loop_22(directory); + var state_8 = _loop_23(directory); directory = out_directory_1; if (state_8 === "break") break; diff --git a/lib/typescriptServices.js b/lib/typescriptServices.js index 166e171cd3ad2..d3a991cbb9e16 100644 --- a/lib/typescriptServices.js +++ b/lib/typescriptServices.js @@ -13972,6 +13972,15 @@ var ts; } } ts.getThisContainer = getThisContainer; + function isInTopLevelContext(node) { + // The name of a class or function declaration is a BindingIdentifier in its surrounding scope. + if (ts.isIdentifier(node) && (ts.isClassDeclaration(node.parent) || ts.isFunctionDeclaration(node.parent)) && node.parent.name === node) { + node = node.parent; + } + var container = getThisContainer(node, /*includeArrowFunctions*/ true); + return ts.isSourceFile(container); + } + ts.isInTopLevelContext = isInTopLevelContext; function getNewTargetContainer(node) { var container = getThisContainer(node, /*includeArrowFunctions*/ false); if (container) { @@ -15169,13 +15178,7 @@ var ts; return parent.name === node; case 156 /* QualifiedName */: // Name on right hand side of dot in a type query or type reference - if (parent.right === node) { - while (parent.kind === 156 /* QualifiedName */) { - parent = parent.parent; - } - return parent.kind === 175 /* TypeQuery */ || parent.kind === 172 /* TypeReference */; - } - return false; + return parent.right === node; case 195 /* BindingElement */: case 262 /* ImportSpecifier */: // Property name in binding element or import specifier @@ -27532,31 +27535,6 @@ var ts; createBaseNode: function (kind) { return countNode(new NodeConstructor(kind, /*pos*/ 0, /*end*/ 0)); } }; var factory = ts.createNodeFactory(1 /* NoParenthesizerRules */ | 2 /* NoNodeConverters */ | 8 /* NoOriginalNode */, baseNodeFactory); - var reparseContext = { - get factory() { return factory; }, - enableEmitNotification: ts.notImplemented, - enableSubstitution: ts.notImplemented, - endLexicalEnvironment: ts.returnUndefined, - getCompilerOptions: ts.notImplemented, - getEmitHost: ts.notImplemented, - getEmitResolver: ts.notImplemented, - getEmitHelperFactory: ts.notImplemented, - setLexicalEnvironmentFlags: ts.noop, - getLexicalEnvironmentFlags: function () { return 0; }, - hoistFunctionDeclaration: ts.notImplemented, - hoistVariableDeclaration: ts.notImplemented, - addInitializationStatement: ts.notImplemented, - isEmitNotificationEnabled: ts.notImplemented, - isSubstitutionEnabled: ts.notImplemented, - onEmitNode: ts.notImplemented, - onSubstituteNode: ts.notImplemented, - readEmitHelpers: ts.notImplemented, - requestEmitHelper: ts.notImplemented, - resumeLexicalEnvironment: ts.noop, - startLexicalEnvironment: ts.noop, - suspendLexicalEnvironment: ts.noop, - addDiagnostic: ts.notImplemented, - }; var fileName; var sourceFlags; var sourceText; @@ -27620,6 +27598,8 @@ var ts; // parsing. These context flags are naturally stored and restored through normal recursive // descent parsing and unwinding. var contextFlags; + // Indicates whether we are currently parsing top-level statements. + var topLevel = true; // Whether or not we've had a parse error since creating the last AST node. If we have // encountered an error, it will be stored on the next AST node we create. Parse errors // can be broken down into three categories: @@ -27763,6 +27743,7 @@ var ts; identifierCount = 0; nodeCount = 0; sourceFlags = 0; + topLevel = true; switch (scriptKind) { case 1 /* JS */: case 2 /* JSX */: @@ -27799,6 +27780,7 @@ var ts; parsingContext = 0; identifiers = undefined; notParenthesizedArrow = undefined; + topLevel = true; } function parseSourceFileWorker(languageVersion, setParentNodes, scriptKind) { var isDeclarationFile = isDeclarationFileName(fileName); @@ -27847,107 +27829,97 @@ var ts; return node; } function reparseTopLevelAwait(sourceFile) { - return ts.visitEachChild(sourceFile, visitor, reparseContext); - function visitor(node) { - if (!(node.transformFlags & 8388608 /* ContainsPossibleTopLevelAwait */)) { - return node; - } - // We explicitly visit each non-Expression node that has an immediate Expression child so that - // we can reparse the Expression in an Await context - switch (node.kind) { - case 160 /* Decorator */: return reparseDecorator(node); - case 157 /* ComputedPropertyName */: return reparseComputedPropertyName(node); - case 220 /* ExpressionWithTypeArguments */: return reparseExpressionWithTypeArguments(node); - case 230 /* ExpressionStatement */: return reparseExpressionStatement(node); - case 231 /* IfStatement */: return reparseIfStatement(node); - case 241 /* SwitchStatement */: return reparseSwitchStatement(node); - case 240 /* WithStatement */: return reparseWithStatement(node); - case 232 /* DoStatement */: return reparseDoStatement(node); - case 233 /* WhileStatement */: return reparseWhileStatement(node); - case 234 /* ForStatement */: return reparseForStatement(node); - case 235 /* ForInStatement */: return reparseForInStatement(node); - case 236 /* ForOfStatement */: return reparseForOfStatement(node); - case 239 /* ReturnStatement */: return reparseReturnStatement(node); - case 243 /* ThrowStatement */: return reparseThrowStatement(node); - case 263 /* ExportAssignment */: return reparseExportAssignment(node); - case 246 /* VariableDeclaration */: return reparseVariableDeclaration(node); - case 195 /* BindingElement */: return reparseBindingElement(node); - default: return ts.visitEachChild(node, visitor, reparseContext); - } - } - function reparse(node, parse) { - if (node && node.transformFlags & 8388608 /* ContainsPossibleTopLevelAwait */) { - if (ts.isExpression(node)) { - return speculationHelper(function () { - scanner.setTextPos(node.pos); - var savedContextFlags = contextFlags; - contextFlags = node.flags & 25358336 /* ContextFlags */; + var savedSyntaxCursor = syntaxCursor; + var baseSyntaxCursor = IncrementalParser.createSyntaxCursor(sourceFile); + syntaxCursor = { currentNode: currentNode }; + var statements = []; + var savedParseDiagnostics = parseDiagnostics; + parseDiagnostics = []; + var pos = 0; + var start = findNextStatementWithAwait(sourceFile.statements, 0); + var _loop_3 = function () { + // append all statements between pos and start + var prevStatement = sourceFile.statements[pos]; + var nextStatement = sourceFile.statements[start]; + ts.addRange(statements, sourceFile.statements, pos, start); + pos = findNextStatementWithoutAwait(sourceFile.statements, start); + // append all diagnostics associated with the copied range + var diagnosticStart = ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= prevStatement.pos; }); + var diagnosticEnd = diagnosticStart >= 0 ? ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= nextStatement.pos; }, diagnosticStart) : -1; + if (diagnosticStart >= 0) { + ts.addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart, diagnosticEnd >= 0 ? diagnosticEnd : undefined); + } + // reparse all statements between start and pos. We skip existing diagnostics for the same range and allow the parser to generate new ones. + speculationHelper(function () { + var savedContextFlags = contextFlags; + contextFlags |= 32768 /* AwaitContext */; + scanner.setTextPos(nextStatement.pos); + nextToken(); + while (token() !== 1 /* EndOfFileToken */) { + var startPos = scanner.getStartPos(); + var statement = parseListElement(0 /* SourceElements */, parseStatement); + statements.push(statement); + if (startPos === scanner.getStartPos()) { nextToken(); - var result = doInAwaitContext(parse); - contextFlags = savedContextFlags; - return result; - }, 2 /* Reparse */); + } + if (pos >= 0) { + var nonAwaitStatement = sourceFile.statements[pos]; + if (statement.end === nonAwaitStatement.pos) { + // done reparsing this section + break; + } + if (statement.end > nonAwaitStatement.pos) { + // we ate into the next statement, so we must reparse it. + pos = findNextStatementWithoutAwait(sourceFile.statements, pos + 1); + } + } } - return ts.visitEachChild(node, visitor, reparseContext); - } - return node; + contextFlags = savedContextFlags; + }, 2 /* Reparse */); + // find the next statement containing an `await` + start = pos >= 0 ? findNextStatementWithAwait(sourceFile.statements, pos) : -1; + }; + while (start !== -1) { + _loop_3(); } - function update(updated, original) { - if (updated !== original) { - ts.setNodeFlags(updated, updated.flags | 32768 /* AwaitContext */); + // append all statements between pos and the end of the list + if (pos >= 0) { + var prevStatement_1 = sourceFile.statements[pos]; + ts.addRange(statements, sourceFile.statements, pos); + // append all diagnostics associated with the copied range + var diagnosticStart = ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= prevStatement_1.pos; }); + if (diagnosticStart >= 0) { + ts.addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart); } - return updated; - } - function reparseExpressionStatement(node) { - return update(factory.updateExpressionStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseReturnStatement(node) { - return update(factory.updateReturnStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseThrowStatement(node) { - return update(factory.updateThrowStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseIfStatement(node) { - return update(factory.updateIfStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.thenStatement, visitor), ts.visitNode(node.elseStatement, visitor)), node); } - function reparseSwitchStatement(node) { - return update(factory.updateSwitchStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.caseBlock, visitor)), node); + syntaxCursor = savedSyntaxCursor; + return factory.updateSourceFile(sourceFile, ts.setTextRange(factory.createNodeArray(statements), sourceFile.statements)); + function containsPossibleTopLevelAwait(node) { + return !(node.flags & 32768 /* AwaitContext */) + && !!(node.transformFlags & 8388608 /* ContainsPossibleTopLevelAwait */); } - function reparseWithStatement(node) { - return update(factory.updateWithStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseDoStatement(node) { - return update(factory.updateDoStatement(node, ts.visitNode(node.statement, visitor), reparse(node.expression, parseExpression)), node); - } - function reparseWhileStatement(node) { - return update(factory.updateWhileStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseForStatement(node) { - return update(factory.updateForStatement(node, reparse(node.initializer, parseExpression), reparse(node.condition, parseExpression), reparse(node.incrementor, parseExpression), ts.visitNode(node, visitor)), node); - } - function reparseForInStatement(node) { - return update(factory.updateForInStatement(node, reparse(node.initializer, parseExpression), reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseForOfStatement(node) { - return update(factory.updateForOfStatement(node, node.awaitModifier, reparse(node.initializer, parseExpression), reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseExportAssignment(node) { - return update(factory.updateExportAssignment(node, ts.visitNodes(node.decorators, visitor), node.modifiers, reparse(node.expression, parseExpression)), node); - } - function reparseExpressionWithTypeArguments(node) { - return update(factory.updateExpressionWithTypeArguments(node, reparse(node.expression, parseLeftHandSideExpressionOrHigher), node.typeArguments), node); - } - function reparseDecorator(node) { - return update(factory.updateDecorator(node, reparse(node.expression, parseLeftHandSideExpressionOrHigher)), node); - } - function reparseComputedPropertyName(node) { - return update(factory.updateComputedPropertyName(node, reparse(node.expression, parseExpression)), node); + function findNextStatementWithAwait(statements, start) { + for (var i = start; i < statements.length; i++) { + if (containsPossibleTopLevelAwait(statements[i])) { + return i; + } + } + return -1; } - function reparseVariableDeclaration(node) { - return update(factory.updateVariableDeclaration(node, ts.visitNode(node.name, visitor), node.exclamationToken, node.type, reparse(node.initializer, parseExpression)), node); + function findNextStatementWithoutAwait(statements, start) { + for (var i = start; i < statements.length; i++) { + if (!containsPossibleTopLevelAwait(statements[i])) { + return i; + } + } + return -1; } - function reparseBindingElement(node) { - return update(factory.updateBindingElement(node, node.dotDotDotToken, ts.visitNode(node.propertyName, visitor), ts.visitNode(node.name, visitor), reparse(node.initializer, parseExpression)), node); + function currentNode(position) { + var node = baseSyntaxCursor.currentNode(position); + if (topLevel && node && containsPossibleTopLevelAwait(node)) { + node.intersectsChange = true; + } + return node; } } function fixupParentReferences(rootNode) { @@ -28198,6 +28170,12 @@ var ts; function tryParse(callback) { return speculationHelper(callback, 0 /* TryParse */); } + function isBindingIdentifier() { + if (token() === 78 /* Identifier */) { + return true; + } + return token() > 115 /* LastReservedWord */; + } // Ignore strict mode flag because we will report an error in type checker instead. function isIdentifier() { if (token() === 78 /* Identifier */) { @@ -28367,6 +28345,9 @@ var ts; ts.Diagnostics.Identifier_expected; return createMissingNode(78 /* Identifier */, reportAtCurrentPosition, diagnosticMessage || defaultMessage, msgArg); } + function parseBindingIdentifier(privateIdentifierDiagnosticMessage) { + return createIdentifier(isBindingIdentifier(), /*diagnosticMessage*/ undefined, privateIdentifierDiagnosticMessage); + } function parseIdentifier(diagnosticMessage, privateIdentifierDiagnosticMessage) { return createIdentifier(isIdentifier(), diagnosticMessage, privateIdentifierDiagnosticMessage); } @@ -28544,9 +28525,9 @@ var ts; return isIdentifier() && !isHeritageClauseExtendsOrImplementsKeyword(); } case 8 /* VariableDeclarations */: - return isIdentifierOrPrivateIdentifierOrPattern(); + return isBindingIdentifierOrPrivateIdentifierOrPattern(); case 10 /* ArrayBindingElements */: - return token() === 27 /* CommaToken */ || token() === 25 /* DotDotDotToken */ || isIdentifierOrPrivateIdentifierOrPattern(); + return token() === 27 /* CommaToken */ || token() === 25 /* DotDotDotToken */ || isBindingIdentifierOrPrivateIdentifierOrPattern(); case 19 /* TypeParameters */: return isIdentifier(); case 15 /* ArrayLiteralMembers */: @@ -29388,7 +29369,7 @@ var ts; } function isStartOfParameter(isJSDocParameter) { return token() === 25 /* DotDotDotToken */ || - isIdentifierOrPrivateIdentifierOrPattern() || + isBindingIdentifierOrPrivateIdentifierOrPattern() || ts.isModifierKind(token()) || token() === 59 /* AtToken */ || isStartOfType(/*inStartOfParameter*/ !isJSDocParameter); @@ -29410,22 +29391,34 @@ var ts; } return name; } + function parseParameterInOuterAwaitContext() { + return parseParameterWorker(/*inOuterAwaitContext*/ true); + } function parseParameter() { + return parseParameterWorker(/*inOuterAwaitContext*/ false); + } + function parseParameterWorker(inOuterAwaitContext) { var pos = getNodePos(); var hasJSDoc = hasPrecedingJSDocComment(); if (token() === 107 /* ThisKeyword */) { - var node = factory.createParameterDeclaration( + var node_1 = factory.createParameterDeclaration( /*decorators*/ undefined, /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, createIdentifier(/*isIdentifier*/ true), /*questionToken*/ undefined, parseTypeAnnotation(), /*initializer*/ undefined); - return withJSDoc(finishNode(node, pos), hasJSDoc); + return withJSDoc(finishNode(node_1, pos), hasJSDoc); } // FormalParameter [Yield,Await]: // BindingElement[?Yield,?Await] - var modifiers; - return withJSDoc(finishNode(factory.createParameterDeclaration(parseDecorators(), modifiers = parseModifiers(), parseOptionalToken(25 /* DotDotDotToken */), parseNameOfParameter(modifiers), parseOptionalToken(57 /* QuestionToken */), parseTypeAnnotation(), parseInitializer()), pos), hasJSDoc); + // Decorators are parsed in the outer [Await] context, the rest of the parameter is parsed in the function's [Await] context. + var decorators = inOuterAwaitContext ? doInAwaitContext(parseDecorators) : parseDecorators(); + var savedTopLevel = topLevel; + topLevel = false; + var modifiers = parseModifiers(); + var node = withJSDoc(finishNode(factory.createParameterDeclaration(decorators, modifiers, parseOptionalToken(25 /* DotDotDotToken */), parseNameOfParameter(modifiers), parseOptionalToken(57 /* QuestionToken */), parseTypeAnnotation(), parseInitializer()), pos), hasJSDoc); + topLevel = savedTopLevel; + return node; } function parseReturnType(returnToken, isType) { if (shouldParseReturnType(returnToken, isType)) { @@ -29468,7 +29461,7 @@ var ts; setAwaitContext(!!(flags & 2 /* Await */)); var parameters = flags & 32 /* JSDoc */ ? parseDelimitedList(17 /* JSDocParameters */, parseJSDocParameter) : - parseDelimitedList(16 /* Parameters */, parseParameter); + parseDelimitedList(16 /* Parameters */, savedAwaitContext ? parseParameterInOuterAwaitContext : parseParameter); setYieldContext(savedYieldContext); setAwaitContext(savedAwaitContext); return parameters; @@ -30597,9 +30590,13 @@ var ts; // Note: even when 'IgnoreMissingOpenBrace' is passed, parseBody will still error. return parseFunctionBlock(16 /* IgnoreMissingOpenBrace */ | (isAsync ? 2 /* Await */ : 0 /* None */)); } - return isAsync + var savedTopLevel = topLevel; + topLevel = false; + var node = isAsync ? doInAwaitContext(parseAssignmentExpressionOrHigher) : doOutsideOfAwaitContext(parseAssignmentExpressionOrHigher); + topLevel = savedTopLevel; + return node; } function parseConditionalExpressionRest(leftOperand, pos) { // Note: we are passed in an expression which was produced from parseBinaryExpressionOrHigher. @@ -31590,10 +31587,10 @@ var ts; var asteriskToken = parseOptionalToken(41 /* AsteriskToken */); var isGenerator = asteriskToken ? 1 /* Yield */ : 0 /* None */; var isAsync = ts.some(modifiers, ts.isAsyncModifier) ? 2 /* Await */ : 0 /* None */; - var name = isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalIdentifier) : - isGenerator ? doInYieldContext(parseOptionalIdentifier) : - isAsync ? doInAwaitContext(parseOptionalIdentifier) : - parseOptionalIdentifier(); + var name = isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalBindingIdentifier) : + isGenerator ? doInYieldContext(parseOptionalBindingIdentifier) : + isAsync ? doInAwaitContext(parseOptionalBindingIdentifier) : + parseOptionalBindingIdentifier(); var typeParameters = parseTypeParameters(); var parameters = parseParameters(isGenerator | isAsync); var type = parseReturnType(58 /* ColonToken */, /*isType*/ false); @@ -31604,8 +31601,8 @@ var ts; var node = factory.createFunctionExpression(modifiers, asteriskToken, name, typeParameters, parameters, type, body); return withJSDoc(finishNode(node, pos), hasJSDoc); } - function parseOptionalIdentifier() { - return isIdentifier() ? parseIdentifier() : undefined; + function parseOptionalBindingIdentifier() { + return isBindingIdentifier() ? parseBindingIdentifier() : undefined; } function parseNewExpressionOrNewDotTarget() { var pos = getNodePos(); @@ -31661,6 +31658,8 @@ var ts; setYieldContext(!!(flags & 1 /* Yield */)); var savedAwaitContext = inAwaitContext(); setAwaitContext(!!(flags & 2 /* Await */)); + var savedTopLevel = topLevel; + topLevel = false; // We may be in a [Decorator] context when parsing a function expression or // arrow function. The body of the function is not in [Decorator] context. var saveDecoratorContext = inDecoratorContext(); @@ -31671,6 +31670,7 @@ var ts; if (saveDecoratorContext) { setDecoratorContext(/*val*/ true); } + topLevel = savedTopLevel; setYieldContext(savedYieldContext); setAwaitContext(savedAwaitContext); return block; @@ -32229,7 +32229,7 @@ var ts; function parseObjectBindingElement() { var pos = getNodePos(); var dotDotDotToken = parseOptionalToken(25 /* DotDotDotToken */); - var tokenIsIdentifier = isIdentifier(); + var tokenIsIdentifier = isBindingIdentifier(); var propertyName = parsePropertyName(); var name; if (tokenIsIdentifier && token() !== 58 /* ColonToken */) { @@ -32257,11 +32257,11 @@ var ts; parseExpected(23 /* CloseBracketToken */); return finishNode(factory.createArrayBindingPattern(elements), pos); } - function isIdentifierOrPrivateIdentifierOrPattern() { + function isBindingIdentifierOrPrivateIdentifierOrPattern() { return token() === 18 /* OpenBraceToken */ || token() === 22 /* OpenBracketToken */ || token() === 79 /* PrivateIdentifier */ - || isIdentifier(); + || isBindingIdentifier(); } function parseIdentifierOrPattern(privateIdentifierDiagnosticMessage) { if (token() === 22 /* OpenBracketToken */) { @@ -32270,7 +32270,7 @@ var ts; if (token() === 18 /* OpenBraceToken */) { return parseObjectBindingPattern(); } - return parseIdentifier(/*diagnosticMessage*/ undefined, privateIdentifierDiagnosticMessage); + return parseBindingIdentifier(privateIdentifierDiagnosticMessage); } function parseVariableDeclarationAllowExclamation() { return parseVariableDeclaration(/*allowExclamation*/ true); @@ -32342,7 +32342,7 @@ var ts; parseExpected(97 /* FunctionKeyword */); var asteriskToken = parseOptionalToken(41 /* AsteriskToken */); // We don't parse the name here in await context, instead we will report a grammar error in the checker. - var name = modifierFlags & 512 /* Default */ ? parseOptionalIdentifier() : parseIdentifier(); + var name = modifierFlags & 512 /* Default */ ? parseOptionalBindingIdentifier() : parseBindingIdentifier(); var isGenerator = asteriskToken ? 1 /* Yield */ : 0 /* None */; var isAsync = modifierFlags & 256 /* Async */ ? 2 /* Await */ : 0 /* None */; var typeParameters = parseTypeParameters(); @@ -32486,12 +32486,24 @@ var ts; } return false; } + function parseDecoratorExpression() { + if (inAwaitContext() && token() === 130 /* AwaitKeyword */) { + // `@await` is is disallowed in an [Await] context, but can cause parsing to go off the rails + // This simply parses the missing identifier and moves on. + var pos = getNodePos(); + var awaitExpression = parseIdentifier(ts.Diagnostics.Expression_expected); + nextToken(); + var memberExpression = parseMemberExpressionRest(pos, awaitExpression, /*allowOptionalChain*/ true); + return parseCallExpressionRest(pos, memberExpression); + } + return parseLeftHandSideExpressionOrHigher(); + } function tryParseDecorator() { var pos = getNodePos(); if (!parseOptional(59 /* AtToken */)) { return undefined; } - var expression = doInDecoratorContext(parseLeftHandSideExpressionOrHigher); + var expression = doInDecoratorContext(parseDecoratorExpression); return finishNode(factory.createDecorator(expression), pos); } function parseDecorators() { @@ -32632,8 +32644,8 @@ var ts; // - class expression with omitted name, 'implements' starts heritage clause // - class with name 'implements' // 'isImplementsClause' helps to disambiguate between these two cases - return isIdentifier() && !isImplementsClause() - ? parseIdentifier() + return isBindingIdentifier() && !isImplementsClause() + ? createIdentifier(isBindingIdentifier()) : undefined; } function isImplementsClause() { @@ -34429,6 +34441,7 @@ var ts; } } } + IncrementalParser.createSyntaxCursor = createSyntaxCursor; var InvalidPosition; (function (InvalidPosition) { InvalidPosition[InvalidPosition["Value"] = -1] = "Value"; @@ -36215,7 +36228,7 @@ var ts; } function convertObjectLiteralExpressionToJson(node, knownOptions, extraKeyDiagnostics, parentOption) { var result = returnValue ? {} : undefined; - var _loop_3 = function (element) { + var _loop_4 = function (element) { if (element.kind !== 285 /* PropertyAssignment */) { errors.push(ts.createDiagnosticForNodeInSourceFile(sourceFile, element, ts.Diagnostics.Property_assignment_expected)); return "continue"; @@ -36268,7 +36281,7 @@ var ts; }; for (var _i = 0, _a = node.properties; _i < _a.length; _i++) { var element = _a[_i]; - _loop_3(element); + _loop_4(element); } return result; } @@ -36451,7 +36464,7 @@ var ts; var optionsNameMap = _a.optionsNameMap; var result = ts.createMap(); var getCanonicalFileName = pathOptions && ts.createGetCanonicalFileName(pathOptions.useCaseSensitiveFileNames); - var _loop_4 = function (name) { + var _loop_5 = function (name) { if (ts.hasProperty(options, name)) { // tsconfig only options cannot be specified via command line, // so we can assume that only types that can appear here string | number | boolean @@ -36485,7 +36498,7 @@ var ts; } }; for (var name in options) { - _loop_4(name); + _loop_5(name); } return result; } @@ -37246,7 +37259,7 @@ var ts; } var jsonOnlyIncludeRegexes; if (validatedIncludeSpecs && validatedIncludeSpecs.length > 0) { - var _loop_5 = function (file) { + var _loop_6 = function (file) { if (ts.fileExtensionIs(file, ".json" /* Json */)) { // Valid only if *.json specified if (!jsonOnlyIncludeRegexes) { @@ -37284,7 +37297,7 @@ var ts; }; for (var _a = 0, _b = host.readDirectory(basePath, supportedExtensionsWithJsonIfResolveJsonModule, validatedExcludeSpecs, validatedIncludeSpecs, /*depth*/ undefined); _a < _b.length; _a++) { var file = _b[_a]; - _loop_5(file); + _loop_6(file); } } var literalFiles = ts.arrayFrom(literalFileMap.values()); @@ -40691,18 +40704,31 @@ var ts; currentFlow = saveCurrentFlow; } // The binder visits every node in the syntax tree so it is a convenient place to perform a single localized - // check for reserved words used as identifiers in strict mode code. - function checkStrictModeIdentifier(node) { - if (inStrictMode && - node.originalKeywordKind >= 116 /* FirstFutureReservedWord */ && - node.originalKeywordKind <= 124 /* LastFutureReservedWord */ && - !ts.isIdentifierName(node) && + // check for reserved words used as identifiers in strict mode code, as well as `yield` or `await` in + // [Yield] or [Await] contexts, respectively. + function checkContextualIdentifier(node) { + // Report error only if there are no parse errors in file + if (!file.parseDiagnostics.length && !(node.flags & 8388608 /* Ambient */) && - !(node.flags & 4194304 /* JSDoc */)) { - // Report error only if there are no parse errors in file - if (!file.parseDiagnostics.length) { + !(node.flags & 4194304 /* JSDoc */) && + !ts.isIdentifierName(node)) { + // strict mode identifiers + if (inStrictMode && + node.originalKeywordKind >= 116 /* FirstFutureReservedWord */ && + node.originalKeywordKind <= 124 /* LastFutureReservedWord */) { file.bindDiagnostics.push(createDiagnosticForNode(node, getStrictModeIdentifierMessage(node), ts.declarationNameToString(node))); } + else if (node.originalKeywordKind === 130 /* AwaitKeyword */) { + if (ts.isExternalModule(file) && ts.isInTopLevelContext(node)) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, ts.declarationNameToString(node))); + } + else if (node.flags & 32768 /* AwaitContext */) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, ts.declarationNameToString(node))); + } + } + else if (node.originalKeywordKind === 124 /* YieldKeyword */ && node.flags & 8192 /* YieldContext */) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, ts.declarationNameToString(node))); + } } } function getStrictModeIdentifierMessage(node) { @@ -40969,7 +40995,7 @@ var ts; if (currentFlow && (ts.isExpression(node) || parent.kind === 286 /* ShorthandPropertyAssignment */)) { node.flowNode = currentFlow; } - return checkStrictModeIdentifier(node); + return checkContextualIdentifier(node); case 105 /* SuperKeyword */: node.flowNode = currentFlow; break; @@ -43165,7 +43191,7 @@ var ts; function addDuplicateDeclarationError(node, message, symbolName, relatedNodes) { var errorNode = (ts.getExpandoInitializer(node, /*isPrototypeAssignment*/ false) ? ts.getNameOfExpando(node) : ts.getNameOfDeclaration(node)) || node; var err = lookupOrIssueError(errorNode, message, symbolName); - var _loop_6 = function (relatedNode) { + var _loop_7 = function (relatedNode) { var adjustedNode = (ts.getExpandoInitializer(relatedNode, /*isPrototypeAssignment*/ false) ? ts.getNameOfExpando(relatedNode) : ts.getNameOfDeclaration(relatedNode)) || relatedNode; if (adjustedNode === errorNode) return "continue"; @@ -43178,7 +43204,7 @@ var ts; }; for (var _i = 0, _a = relatedNodes || ts.emptyArray; _i < _a.length; _i++) { var relatedNode = _a[_i]; - _loop_6(relatedNode); + _loop_7(relatedNode); } } function combineSymbolTables(first, second) { @@ -45419,7 +45445,7 @@ var ts; } function forEachSymbolTableInScope(enclosingDeclaration, callback) { var result; - var _loop_7 = function (location) { + var _loop_8 = function (location) { // Locals of a source file are not in scope (because they get merged into the global symbol table) if (location.locals && !isGlobalSourceFile(location)) { if (result = callback(location.locals)) { @@ -45465,7 +45491,7 @@ var ts; } }; for (var location = enclosingDeclaration; location; location = location.parent) { - var state_2 = _loop_7(location); + var state_2 = _loop_8(location); if (typeof state_2 === "object") return state_2.value; } @@ -47475,7 +47501,7 @@ var ts; if (ts.length(reexports) > 1) { var groups = ts.group(reexports, function (decl) { return ts.isStringLiteral(decl.moduleSpecifier) ? ">" + decl.moduleSpecifier.text : ">"; }); if (groups.length !== reexports.length) { - var _loop_8 = function (group_1) { + var _loop_9 = function (group_1) { if (group_1.length > 1) { // remove group members from statements and then merge group members and add back to statements statements = __spreadArrays(ts.filter(statements, function (s) { return group_1.indexOf(s) === -1; }), [ @@ -47488,7 +47514,7 @@ var ts; }; for (var _i = 0, groups_1 = groups; _i < groups_1.length; _i++) { var group_1 = groups_1[_i]; - _loop_8(group_1); + _loop_9(group_1); } } } @@ -51000,7 +51026,7 @@ var ts; // signatures from the type, whose ordering would be non-obvious) var masterList = signatureLists[indexWithLengthOverOne !== undefined ? indexWithLengthOverOne : 0]; var results = masterList.slice(); - var _loop_9 = function (signatures) { + var _loop_10 = function (signatures) { if (signatures !== masterList) { var signature_1 = signatures[0]; ts.Debug.assert(!!signature_1, "getUnionSignatures bails early on empty signature lists and should not have empty lists on second pass"); @@ -51012,7 +51038,7 @@ var ts; }; for (var _b = 0, signatureLists_1 = signatureLists; _b < signatureLists_1.length; _b++) { var signatures = signatureLists_1[_b]; - var state_3 = _loop_9(signatures); + var state_3 = _loop_10(signatures); if (state_3 === "break") break; } @@ -51136,7 +51162,7 @@ var ts; var types = type.types; var mixinFlags = findMixins(types); var mixinCount = ts.countWhere(mixinFlags, function (b) { return b; }); - var _loop_10 = function (i) { + var _loop_11 = function (i) { var t = type.types[i]; // When an intersection type contains mixin constructor types, the construct signatures from // those types are discarded and their return types are mixed into the return types of all @@ -51159,19 +51185,19 @@ var ts; numberIndexInfo = intersectIndexInfos(numberIndexInfo, getIndexInfoOfType(t, 1 /* Number */)); }; for (var i = 0; i < types.length; i++) { - _loop_10(i); + _loop_11(i); } setStructuredTypeMembers(type, emptySymbols, callSignatures || ts.emptyArray, constructSignatures || ts.emptyArray, stringIndexInfo, numberIndexInfo); } function appendSignatures(signatures, newSignatures) { - var _loop_11 = function (sig) { + var _loop_12 = function (sig) { if (!signatures || ts.every(signatures, function (s) { return !compareSignaturesIdentical(s, sig, /*partialMatch*/ false, /*ignoreThisTypes*/ false, /*ignoreReturnTypes*/ false, compareTypesIdentical); })) { signatures = ts.append(signatures, sig); } }; for (var _i = 0, newSignatures_1 = newSignatures; _i < newSignatures_1.length; _i++) { var sig = newSignatures_1[_i]; - _loop_11(sig); + _loop_12(sig); } return signatures; } @@ -53458,7 +53484,7 @@ var ts; var expandedDeclarations = []; var optionalIndex = -1; var restTypes; - var _loop_12 = function (i) { + var _loop_13 = function (i) { var type = elementTypes[i]; var flags = target.elementFlags[i]; if (flags & 8 /* Variadic */) { @@ -53481,7 +53507,7 @@ var ts; } }; for (var i = 0; i < elementTypes.length; i++) { - _loop_12(i); + _loop_13(i); } if (restTypes) { // Create a union of the collected rest element types. @@ -54531,7 +54557,7 @@ var ts; function getConditionalType(root, mapper) { var result; var extraTypes; - var _loop_13 = function () { + var _loop_14 = function () { var checkType = instantiateType(root.checkType, mapper); var checkTypeInstantiable = isGenericObjectType(checkType) || isGenericIndexType(checkType); var extendsType = instantiateType(root.extendsType, mapper); @@ -54605,7 +54631,7 @@ var ts; // types of the form 'A extends B ? X : C extends D ? Y : E extends F ? Z : ...' as a single construct for // purposes of resolution. This means such types aren't subject to the instatiation depth limiter. while (true) { - var state_4 = _loop_13(); + var state_4 = _loop_14(); if (typeof state_4 === "object") return state_4.value; if (state_4 === "break") @@ -57083,7 +57109,7 @@ var ts; reducedTarget = findMatchingDiscriminantType(source, target, isRelatedTo) || filterPrimitivesIfContainsNonPrimitive(target); checkTypes = reducedTarget.flags & 1048576 /* Union */ ? reducedTarget.types : [reducedTarget]; } - var _loop_14 = function (prop) { + var _loop_15 = function (prop) { if (shouldCheckAsExcessProperty(prop, source.symbol) && !isIgnoredJsxProperty(source, prop)) { if (!isKnownProperty(reducedTarget, prop.escapedName, isComparingJsxAttributes)) { if (reportErrors) { @@ -57146,7 +57172,7 @@ var ts; }; for (var _i = 0, _a = getPropertiesOfType(source); _i < _a.length; _i++) { var prop = _a[_i]; - var state_5 = _loop_14(prop); + var state_5 = _loop_15(prop); if (typeof state_5 === "object") return state_5.value; } @@ -57819,11 +57845,11 @@ var ts; // constituents of 'target'. If any combination does not have a match then 'source' is not relatable. var discriminantCombinations = ts.cartesianProduct(sourceDiscriminantTypes); var matchingTypes = []; - var _loop_15 = function (combination) { + var _loop_16 = function (combination) { var hasMatch = false; outer: for (var _i = 0, _a = target.types; _i < _a.length; _i++) { var type = _a[_i]; - var _loop_16 = function (i) { + var _loop_17 = function (i) { var sourceProperty = sourcePropertiesFiltered[i]; var targetProperty = getPropertyOfType(type, sourceProperty.escapedName); if (!targetProperty) @@ -57839,7 +57865,7 @@ var ts; } }; for (var i = 0; i < sourcePropertiesFiltered.length; i++) { - var state_7 = _loop_16(i); + var state_7 = _loop_17(i); switch (state_7) { case "continue-outer": continue outer; } @@ -57853,7 +57879,7 @@ var ts; }; for (var _a = 0, discriminantCombinations_1 = discriminantCombinations; _a < discriminantCombinations_1.length; _a++) { var combination = discriminantCombinations_1[_a]; - var state_6 = _loop_15(combination); + var state_6 = _loop_16(combination); if (typeof state_6 === "object") return state_6.value; } @@ -58495,7 +58521,7 @@ var ts; // The emptyArray singleton is used to signal a recursive invocation. cache.variances = ts.emptyArray; variances = []; - var _loop_17 = function (tp) { + var _loop_18 = function (tp) { var unmeasurable = false; var unreliable = false; var oldHandler = outofbandVarianceMarkerHandler; @@ -58527,7 +58553,7 @@ var ts; }; for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { var tp = typeParameters_1[_i]; - _loop_17(tp); + _loop_18(tp); } cache.variances = variances; } @@ -66010,7 +66036,7 @@ var ts; if (spreadIndex >= 0) { // Create synthetic arguments from spreads of tuple types. var effectiveArgs_1 = args.slice(0, spreadIndex); - var _loop_18 = function (i) { + var _loop_19 = function (i) { var arg = args[i]; // We can call checkExpressionCached because spread expressions never have a contextual type. var spreadType = arg.kind === 217 /* SpreadElement */ && (flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression)); @@ -66027,7 +66053,7 @@ var ts; } }; for (var i = spreadIndex; i < args.length; i++) { - _loop_18(i); + _loop_19(i); } return effectiveArgs_1; } @@ -66329,7 +66355,7 @@ var ts; var min_3 = Number.MAX_VALUE; var minIndex = 0; var i_1 = 0; - var _loop_19 = function (c) { + var _loop_20 = function (c) { var chain_2 = function () { return ts.chainDiagnosticMessages(/*details*/ undefined, ts.Diagnostics.Overload_0_of_1_2_gave_the_following_error, i_1 + 1, candidates.length, signatureToString(c)); }; var diags_2 = getSignatureApplicabilityError(node, args, c, assignableRelation, 0 /* Normal */, /*reportErrors*/ true, chain_2); if (diags_2) { @@ -66347,7 +66373,7 @@ var ts; }; for (var _a = 0, candidatesForArgumentError_1 = candidatesForArgumentError; _a < candidatesForArgumentError_1.length; _a++) { var c = candidatesForArgumentError_1[_a]; - _loop_19(c); + _loop_20(c); } var diags_3 = max > 1 ? allDiagnostics[minIndex] : ts.flatten(allDiagnostics); ts.Debug.assert(diags_3.length > 0, "No errors reported for 3 or fewer overload signatures"); @@ -66481,7 +66507,7 @@ var ts; } var _a = ts.minAndMax(candidates, getNumNonRestParameters), minArgumentCount = _a.min, maxNonRestParam = _a.max; var parameters = []; - var _loop_20 = function (i) { + var _loop_21 = function (i) { var symbols = ts.mapDefined(candidates, function (s) { return signatureHasRestParameter(s) ? i < s.parameters.length - 1 ? s.parameters[i] : ts.last(s.parameters) : i < s.parameters.length ? s.parameters[i] : undefined; }); @@ -66489,7 +66515,7 @@ var ts; parameters.push(createCombinedSymbolFromTypes(symbols, ts.mapDefined(candidates, function (candidate) { return tryGetTypeAtPosition(candidate, i); }))); }; for (var i = 0; i < maxNonRestParam; i++) { - _loop_20(i); + _loop_21(i); } var restParameterSymbols = ts.mapDefined(candidates, function (c) { return signatureHasRestParameter(c) ? ts.last(c.parameters) : undefined; }); var flags = 0 /* None */; @@ -68241,15 +68267,11 @@ var ts; checkExpression(node.expression); return undefinedWideningType; } - function isInTopLevelContext(node) { - var container = ts.getThisContainer(node, /*includeArrowFunctions*/ true); - return ts.isSourceFile(container); - } function checkAwaitExpression(node) { // Grammar checking if (produceDiagnostics) { if (!(node.flags & 32768 /* AwaitContext */)) { - if (isInTopLevelContext(node)) { + if (ts.isInTopLevelContext(node)) { var sourceFile = ts.getSourceFileOfNode(node); if (!hasParseDiagnostics(sourceFile)) { var span = void 0; @@ -73412,7 +73434,7 @@ var ts; function issueMemberSpecificError(node, typeWithThis, baseWithThis, broadDiag) { // iterate over all implemented properties and issue errors on each one which isn't compatible, rather than the class as a whole, if possible var issuedMemberError = false; - var _loop_21 = function (member) { + var _loop_22 = function (member) { if (ts.hasStaticModifier(member)) { return "continue"; } @@ -73431,7 +73453,7 @@ var ts; }; for (var _i = 0, _a = node.members; _i < _a.length; _i++) { var member = _a[_i]; - _loop_21(member); + _loop_22(member); } if (!issuedMemberError) { // check again with diagnostics to generate a less-specific error @@ -74204,7 +74226,6 @@ var ts; } } function checkImportBinding(node) { - checkGrammarAwaitIdentifier(node.name); checkCollisionWithRequireExportsInGeneratedCode(node, node.name); checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name); checkAliasSymbol(node); @@ -75375,10 +75396,10 @@ var ts; // If this is from nested object binding pattern // for ({ skills: { primary, secondary } } = multiRobot, i = 0; i < 1; i++) { if (expr.parent.kind === 285 /* PropertyAssignment */) { - var node_1 = ts.cast(expr.parent.parent, ts.isObjectLiteralExpression); - var typeOfParentObjectLiteral = getTypeOfAssignmentPattern(node_1) || errorType; - var propertyIndex = ts.indexOfNode(node_1.properties, expr.parent); - return checkObjectLiteralDestructuringPropertyAssignment(node_1, typeOfParentObjectLiteral, propertyIndex); + var node_2 = ts.cast(expr.parent.parent, ts.isObjectLiteralExpression); + var typeOfParentObjectLiteral = getTypeOfAssignmentPattern(node_2) || errorType; + var propertyIndex = ts.indexOfNode(node_2.properties, expr.parent); + return checkObjectLiteralDestructuringPropertyAssignment(node_2, typeOfParentObjectLiteral, propertyIndex); } // Array literal assignment - array destructuring pattern var node = ts.cast(expr.parent, ts.isArrayLiteralExpression); @@ -76735,29 +76756,18 @@ var ts; } return false; } - function checkGrammarAwaitIdentifier(name) { - if (name && ts.isIdentifier(name) && name.originalKeywordKind === 130 /* AwaitKeyword */ && isInTopLevelContext(name.parent)) { - var file = ts.getSourceFileOfNode(name); - if (!file.isDeclarationFile && ts.isExternalModule(file)) { - return grammarErrorOnNode(name, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, ts.idText(name)); - } - } - return false; - } function checkGrammarFunctionLikeDeclaration(node) { // Prevent cascading error by short-circuit var file = ts.getSourceFileOfNode(node); return checkGrammarDecoratorsAndModifiers(node) || checkGrammarTypeParameterList(node.typeParameters, file) || - (ts.isFunctionDeclaration(node) && checkGrammarAwaitIdentifier(node.name)) || checkGrammarParameterList(node.parameters) || checkGrammarArrowFunction(node, file) || (ts.isFunctionLikeDeclaration(node) && checkGrammarForUseStrictSimpleParameterList(node)); } function checkGrammarClassLikeDeclaration(node) { var file = ts.getSourceFileOfNode(node); - return (ts.isClassDeclaration(node) && checkGrammarAwaitIdentifier(node.name)) || - checkGrammarClassDeclarationHeritageClauses(node) || + return checkGrammarClassDeclarationHeritageClauses(node) || checkGrammarTypeParameterList(node.typeParameters, file); } function checkGrammarArrowFunction(node, file) { @@ -77327,9 +77337,6 @@ var ts; return grammarErrorOnNode(node.name, ts.Diagnostics.A_rest_element_cannot_have_a_property_name); } } - if (ts.isIdentifier(node.name) && checkGrammarAwaitIdentifier(node.name)) { - return true; - } if (node.dotDotDotToken && node.initializer) { // Error on equals token which immediately precedes the initializer return grammarErrorAtPos(node, node.initializer.pos - 1, 1, ts.Diagnostics.A_rest_element_cannot_have_an_initializer); @@ -77386,9 +77393,6 @@ var ts; } } } - if (ts.isIdentifier(node.name) && checkGrammarAwaitIdentifier(node.name)) { - return true; - } if (node.exclamationToken && (node.parent.parent.kind !== 229 /* VariableStatement */ || !node.type || node.initializer || node.flags & 8388608 /* Ambient */)) { return grammarErrorOnNode(node.exclamationToken, ts.Diagnostics.Definite_assignment_assertions_can_only_be_used_along_with_a_type_annotation); } @@ -107351,7 +107355,7 @@ var ts; }); // Sort by paths closest to importing file Name directory var sortedPaths = []; - var _loop_22 = function (directory) { + var _loop_23 = function (directory) { var directoryStart = ts.ensureTrailingDirectorySeparator(directory); var pathsInDirectory; allFileNames.forEach(function (canonicalFileName, fileName) { @@ -107377,7 +107381,7 @@ var ts; }; var out_directory_1; for (var directory = ts.getDirectoryPath(ts.toPath(importingFileName, cwd, getCanonicalFileName)); allFileNames.size !== 0;) { - var state_8 = _loop_22(directory); + var state_8 = _loop_23(directory); directory = out_directory_1; if (state_8 === "break") break; diff --git a/lib/typingsInstaller.js b/lib/typingsInstaller.js index 7637630c923d9..806c146935c9f 100644 --- a/lib/typingsInstaller.js +++ b/lib/typingsInstaller.js @@ -13811,6 +13811,15 @@ var ts; } } ts.getThisContainer = getThisContainer; + function isInTopLevelContext(node) { + // The name of a class or function declaration is a BindingIdentifier in its surrounding scope. + if (ts.isIdentifier(node) && (ts.isClassDeclaration(node.parent) || ts.isFunctionDeclaration(node.parent)) && node.parent.name === node) { + node = node.parent; + } + var container = getThisContainer(node, /*includeArrowFunctions*/ true); + return ts.isSourceFile(container); + } + ts.isInTopLevelContext = isInTopLevelContext; function getNewTargetContainer(node) { var container = getThisContainer(node, /*includeArrowFunctions*/ false); if (container) { @@ -15008,13 +15017,7 @@ var ts; return parent.name === node; case 156 /* QualifiedName */: // Name on right hand side of dot in a type query or type reference - if (parent.right === node) { - while (parent.kind === 156 /* QualifiedName */) { - parent = parent.parent; - } - return parent.kind === 175 /* TypeQuery */ || parent.kind === 172 /* TypeReference */; - } - return false; + return parent.right === node; case 195 /* BindingElement */: case 262 /* ImportSpecifier */: // Property name in binding element or import specifier @@ -27371,31 +27374,6 @@ var ts; createBaseNode: function (kind) { return countNode(new NodeConstructor(kind, /*pos*/ 0, /*end*/ 0)); } }; var factory = ts.createNodeFactory(1 /* NoParenthesizerRules */ | 2 /* NoNodeConverters */ | 8 /* NoOriginalNode */, baseNodeFactory); - var reparseContext = { - get factory() { return factory; }, - enableEmitNotification: ts.notImplemented, - enableSubstitution: ts.notImplemented, - endLexicalEnvironment: ts.returnUndefined, - getCompilerOptions: ts.notImplemented, - getEmitHost: ts.notImplemented, - getEmitResolver: ts.notImplemented, - getEmitHelperFactory: ts.notImplemented, - setLexicalEnvironmentFlags: ts.noop, - getLexicalEnvironmentFlags: function () { return 0; }, - hoistFunctionDeclaration: ts.notImplemented, - hoistVariableDeclaration: ts.notImplemented, - addInitializationStatement: ts.notImplemented, - isEmitNotificationEnabled: ts.notImplemented, - isSubstitutionEnabled: ts.notImplemented, - onEmitNode: ts.notImplemented, - onSubstituteNode: ts.notImplemented, - readEmitHelpers: ts.notImplemented, - requestEmitHelper: ts.notImplemented, - resumeLexicalEnvironment: ts.noop, - startLexicalEnvironment: ts.noop, - suspendLexicalEnvironment: ts.noop, - addDiagnostic: ts.notImplemented, - }; var fileName; var sourceFlags; var sourceText; @@ -27459,6 +27437,8 @@ var ts; // parsing. These context flags are naturally stored and restored through normal recursive // descent parsing and unwinding. var contextFlags; + // Indicates whether we are currently parsing top-level statements. + var topLevel = true; // Whether or not we've had a parse error since creating the last AST node. If we have // encountered an error, it will be stored on the next AST node we create. Parse errors // can be broken down into three categories: @@ -27602,6 +27582,7 @@ var ts; identifierCount = 0; nodeCount = 0; sourceFlags = 0; + topLevel = true; switch (scriptKind) { case 1 /* JS */: case 2 /* JSX */: @@ -27638,6 +27619,7 @@ var ts; parsingContext = 0; identifiers = undefined; notParenthesizedArrow = undefined; + topLevel = true; } function parseSourceFileWorker(languageVersion, setParentNodes, scriptKind) { var isDeclarationFile = isDeclarationFileName(fileName); @@ -27686,107 +27668,97 @@ var ts; return node; } function reparseTopLevelAwait(sourceFile) { - return ts.visitEachChild(sourceFile, visitor, reparseContext); - function visitor(node) { - if (!(node.transformFlags & 8388608 /* ContainsPossibleTopLevelAwait */)) { - return node; - } - // We explicitly visit each non-Expression node that has an immediate Expression child so that - // we can reparse the Expression in an Await context - switch (node.kind) { - case 160 /* Decorator */: return reparseDecorator(node); - case 157 /* ComputedPropertyName */: return reparseComputedPropertyName(node); - case 220 /* ExpressionWithTypeArguments */: return reparseExpressionWithTypeArguments(node); - case 230 /* ExpressionStatement */: return reparseExpressionStatement(node); - case 231 /* IfStatement */: return reparseIfStatement(node); - case 241 /* SwitchStatement */: return reparseSwitchStatement(node); - case 240 /* WithStatement */: return reparseWithStatement(node); - case 232 /* DoStatement */: return reparseDoStatement(node); - case 233 /* WhileStatement */: return reparseWhileStatement(node); - case 234 /* ForStatement */: return reparseForStatement(node); - case 235 /* ForInStatement */: return reparseForInStatement(node); - case 236 /* ForOfStatement */: return reparseForOfStatement(node); - case 239 /* ReturnStatement */: return reparseReturnStatement(node); - case 243 /* ThrowStatement */: return reparseThrowStatement(node); - case 263 /* ExportAssignment */: return reparseExportAssignment(node); - case 246 /* VariableDeclaration */: return reparseVariableDeclaration(node); - case 195 /* BindingElement */: return reparseBindingElement(node); - default: return ts.visitEachChild(node, visitor, reparseContext); - } - } - function reparse(node, parse) { - if (node && node.transformFlags & 8388608 /* ContainsPossibleTopLevelAwait */) { - if (ts.isExpression(node)) { - return speculationHelper(function () { - scanner.setTextPos(node.pos); - var savedContextFlags = contextFlags; - contextFlags = node.flags & 25358336 /* ContextFlags */; + var savedSyntaxCursor = syntaxCursor; + var baseSyntaxCursor = IncrementalParser.createSyntaxCursor(sourceFile); + syntaxCursor = { currentNode: currentNode }; + var statements = []; + var savedParseDiagnostics = parseDiagnostics; + parseDiagnostics = []; + var pos = 0; + var start = findNextStatementWithAwait(sourceFile.statements, 0); + var _loop_3 = function () { + // append all statements between pos and start + var prevStatement = sourceFile.statements[pos]; + var nextStatement = sourceFile.statements[start]; + ts.addRange(statements, sourceFile.statements, pos, start); + pos = findNextStatementWithoutAwait(sourceFile.statements, start); + // append all diagnostics associated with the copied range + var diagnosticStart = ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= prevStatement.pos; }); + var diagnosticEnd = diagnosticStart >= 0 ? ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= nextStatement.pos; }, diagnosticStart) : -1; + if (diagnosticStart >= 0) { + ts.addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart, diagnosticEnd >= 0 ? diagnosticEnd : undefined); + } + // reparse all statements between start and pos. We skip existing diagnostics for the same range and allow the parser to generate new ones. + speculationHelper(function () { + var savedContextFlags = contextFlags; + contextFlags |= 32768 /* AwaitContext */; + scanner.setTextPos(nextStatement.pos); + nextToken(); + while (token() !== 1 /* EndOfFileToken */) { + var startPos = scanner.getStartPos(); + var statement = parseListElement(0 /* SourceElements */, parseStatement); + statements.push(statement); + if (startPos === scanner.getStartPos()) { nextToken(); - var result = doInAwaitContext(parse); - contextFlags = savedContextFlags; - return result; - }, 2 /* Reparse */); + } + if (pos >= 0) { + var nonAwaitStatement = sourceFile.statements[pos]; + if (statement.end === nonAwaitStatement.pos) { + // done reparsing this section + break; + } + if (statement.end > nonAwaitStatement.pos) { + // we ate into the next statement, so we must reparse it. + pos = findNextStatementWithoutAwait(sourceFile.statements, pos + 1); + } + } } - return ts.visitEachChild(node, visitor, reparseContext); - } - return node; + contextFlags = savedContextFlags; + }, 2 /* Reparse */); + // find the next statement containing an `await` + start = pos >= 0 ? findNextStatementWithAwait(sourceFile.statements, pos) : -1; + }; + while (start !== -1) { + _loop_3(); } - function update(updated, original) { - if (updated !== original) { - ts.setNodeFlags(updated, updated.flags | 32768 /* AwaitContext */); + // append all statements between pos and the end of the list + if (pos >= 0) { + var prevStatement_1 = sourceFile.statements[pos]; + ts.addRange(statements, sourceFile.statements, pos); + // append all diagnostics associated with the copied range + var diagnosticStart = ts.findIndex(savedParseDiagnostics, function (diagnostic) { return diagnostic.start >= prevStatement_1.pos; }); + if (diagnosticStart >= 0) { + ts.addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart); } - return updated; - } - function reparseExpressionStatement(node) { - return update(factory.updateExpressionStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseReturnStatement(node) { - return update(factory.updateReturnStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseThrowStatement(node) { - return update(factory.updateThrowStatement(node, reparse(node.expression, parseExpression)), node); - } - function reparseIfStatement(node) { - return update(factory.updateIfStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.thenStatement, visitor), ts.visitNode(node.elseStatement, visitor)), node); - } - function reparseSwitchStatement(node) { - return update(factory.updateSwitchStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.caseBlock, visitor)), node); - } - function reparseWithStatement(node) { - return update(factory.updateWithStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); } - function reparseDoStatement(node) { - return update(factory.updateDoStatement(node, ts.visitNode(node.statement, visitor), reparse(node.expression, parseExpression)), node); + syntaxCursor = savedSyntaxCursor; + return factory.updateSourceFile(sourceFile, ts.setTextRange(factory.createNodeArray(statements), sourceFile.statements)); + function containsPossibleTopLevelAwait(node) { + return !(node.flags & 32768 /* AwaitContext */) + && !!(node.transformFlags & 8388608 /* ContainsPossibleTopLevelAwait */); } - function reparseWhileStatement(node) { - return update(factory.updateWhileStatement(node, reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseForStatement(node) { - return update(factory.updateForStatement(node, reparse(node.initializer, parseExpression), reparse(node.condition, parseExpression), reparse(node.incrementor, parseExpression), ts.visitNode(node, visitor)), node); - } - function reparseForInStatement(node) { - return update(factory.updateForInStatement(node, reparse(node.initializer, parseExpression), reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseForOfStatement(node) { - return update(factory.updateForOfStatement(node, node.awaitModifier, reparse(node.initializer, parseExpression), reparse(node.expression, parseExpression), ts.visitNode(node.statement, visitor)), node); - } - function reparseExportAssignment(node) { - return update(factory.updateExportAssignment(node, ts.visitNodes(node.decorators, visitor), node.modifiers, reparse(node.expression, parseExpression)), node); - } - function reparseExpressionWithTypeArguments(node) { - return update(factory.updateExpressionWithTypeArguments(node, reparse(node.expression, parseLeftHandSideExpressionOrHigher), node.typeArguments), node); - } - function reparseDecorator(node) { - return update(factory.updateDecorator(node, reparse(node.expression, parseLeftHandSideExpressionOrHigher)), node); - } - function reparseComputedPropertyName(node) { - return update(factory.updateComputedPropertyName(node, reparse(node.expression, parseExpression)), node); + function findNextStatementWithAwait(statements, start) { + for (var i = start; i < statements.length; i++) { + if (containsPossibleTopLevelAwait(statements[i])) { + return i; + } + } + return -1; } - function reparseVariableDeclaration(node) { - return update(factory.updateVariableDeclaration(node, ts.visitNode(node.name, visitor), node.exclamationToken, node.type, reparse(node.initializer, parseExpression)), node); + function findNextStatementWithoutAwait(statements, start) { + for (var i = start; i < statements.length; i++) { + if (!containsPossibleTopLevelAwait(statements[i])) { + return i; + } + } + return -1; } - function reparseBindingElement(node) { - return update(factory.updateBindingElement(node, node.dotDotDotToken, ts.visitNode(node.propertyName, visitor), ts.visitNode(node.name, visitor), reparse(node.initializer, parseExpression)), node); + function currentNode(position) { + var node = baseSyntaxCursor.currentNode(position); + if (topLevel && node && containsPossibleTopLevelAwait(node)) { + node.intersectsChange = true; + } + return node; } } function fixupParentReferences(rootNode) { @@ -28037,6 +28009,12 @@ var ts; function tryParse(callback) { return speculationHelper(callback, 0 /* TryParse */); } + function isBindingIdentifier() { + if (token() === 78 /* Identifier */) { + return true; + } + return token() > 115 /* LastReservedWord */; + } // Ignore strict mode flag because we will report an error in type checker instead. function isIdentifier() { if (token() === 78 /* Identifier */) { @@ -28206,6 +28184,9 @@ var ts; ts.Diagnostics.Identifier_expected; return createMissingNode(78 /* Identifier */, reportAtCurrentPosition, diagnosticMessage || defaultMessage, msgArg); } + function parseBindingIdentifier(privateIdentifierDiagnosticMessage) { + return createIdentifier(isBindingIdentifier(), /*diagnosticMessage*/ undefined, privateIdentifierDiagnosticMessage); + } function parseIdentifier(diagnosticMessage, privateIdentifierDiagnosticMessage) { return createIdentifier(isIdentifier(), diagnosticMessage, privateIdentifierDiagnosticMessage); } @@ -28383,9 +28364,9 @@ var ts; return isIdentifier() && !isHeritageClauseExtendsOrImplementsKeyword(); } case 8 /* VariableDeclarations */: - return isIdentifierOrPrivateIdentifierOrPattern(); + return isBindingIdentifierOrPrivateIdentifierOrPattern(); case 10 /* ArrayBindingElements */: - return token() === 27 /* CommaToken */ || token() === 25 /* DotDotDotToken */ || isIdentifierOrPrivateIdentifierOrPattern(); + return token() === 27 /* CommaToken */ || token() === 25 /* DotDotDotToken */ || isBindingIdentifierOrPrivateIdentifierOrPattern(); case 19 /* TypeParameters */: return isIdentifier(); case 15 /* ArrayLiteralMembers */: @@ -29227,7 +29208,7 @@ var ts; } function isStartOfParameter(isJSDocParameter) { return token() === 25 /* DotDotDotToken */ || - isIdentifierOrPrivateIdentifierOrPattern() || + isBindingIdentifierOrPrivateIdentifierOrPattern() || ts.isModifierKind(token()) || token() === 59 /* AtToken */ || isStartOfType(/*inStartOfParameter*/ !isJSDocParameter); @@ -29249,22 +29230,34 @@ var ts; } return name; } + function parseParameterInOuterAwaitContext() { + return parseParameterWorker(/*inOuterAwaitContext*/ true); + } function parseParameter() { + return parseParameterWorker(/*inOuterAwaitContext*/ false); + } + function parseParameterWorker(inOuterAwaitContext) { var pos = getNodePos(); var hasJSDoc = hasPrecedingJSDocComment(); if (token() === 107 /* ThisKeyword */) { - var node = factory.createParameterDeclaration( + var node_1 = factory.createParameterDeclaration( /*decorators*/ undefined, /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, createIdentifier(/*isIdentifier*/ true), /*questionToken*/ undefined, parseTypeAnnotation(), /*initializer*/ undefined); - return withJSDoc(finishNode(node, pos), hasJSDoc); + return withJSDoc(finishNode(node_1, pos), hasJSDoc); } // FormalParameter [Yield,Await]: // BindingElement[?Yield,?Await] - var modifiers; - return withJSDoc(finishNode(factory.createParameterDeclaration(parseDecorators(), modifiers = parseModifiers(), parseOptionalToken(25 /* DotDotDotToken */), parseNameOfParameter(modifiers), parseOptionalToken(57 /* QuestionToken */), parseTypeAnnotation(), parseInitializer()), pos), hasJSDoc); + // Decorators are parsed in the outer [Await] context, the rest of the parameter is parsed in the function's [Await] context. + var decorators = inOuterAwaitContext ? doInAwaitContext(parseDecorators) : parseDecorators(); + var savedTopLevel = topLevel; + topLevel = false; + var modifiers = parseModifiers(); + var node = withJSDoc(finishNode(factory.createParameterDeclaration(decorators, modifiers, parseOptionalToken(25 /* DotDotDotToken */), parseNameOfParameter(modifiers), parseOptionalToken(57 /* QuestionToken */), parseTypeAnnotation(), parseInitializer()), pos), hasJSDoc); + topLevel = savedTopLevel; + return node; } function parseReturnType(returnToken, isType) { if (shouldParseReturnType(returnToken, isType)) { @@ -29307,7 +29300,7 @@ var ts; setAwaitContext(!!(flags & 2 /* Await */)); var parameters = flags & 32 /* JSDoc */ ? parseDelimitedList(17 /* JSDocParameters */, parseJSDocParameter) : - parseDelimitedList(16 /* Parameters */, parseParameter); + parseDelimitedList(16 /* Parameters */, savedAwaitContext ? parseParameterInOuterAwaitContext : parseParameter); setYieldContext(savedYieldContext); setAwaitContext(savedAwaitContext); return parameters; @@ -30436,9 +30429,13 @@ var ts; // Note: even when 'IgnoreMissingOpenBrace' is passed, parseBody will still error. return parseFunctionBlock(16 /* IgnoreMissingOpenBrace */ | (isAsync ? 2 /* Await */ : 0 /* None */)); } - return isAsync + var savedTopLevel = topLevel; + topLevel = false; + var node = isAsync ? doInAwaitContext(parseAssignmentExpressionOrHigher) : doOutsideOfAwaitContext(parseAssignmentExpressionOrHigher); + topLevel = savedTopLevel; + return node; } function parseConditionalExpressionRest(leftOperand, pos) { // Note: we are passed in an expression which was produced from parseBinaryExpressionOrHigher. @@ -31429,10 +31426,10 @@ var ts; var asteriskToken = parseOptionalToken(41 /* AsteriskToken */); var isGenerator = asteriskToken ? 1 /* Yield */ : 0 /* None */; var isAsync = ts.some(modifiers, ts.isAsyncModifier) ? 2 /* Await */ : 0 /* None */; - var name = isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalIdentifier) : - isGenerator ? doInYieldContext(parseOptionalIdentifier) : - isAsync ? doInAwaitContext(parseOptionalIdentifier) : - parseOptionalIdentifier(); + var name = isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalBindingIdentifier) : + isGenerator ? doInYieldContext(parseOptionalBindingIdentifier) : + isAsync ? doInAwaitContext(parseOptionalBindingIdentifier) : + parseOptionalBindingIdentifier(); var typeParameters = parseTypeParameters(); var parameters = parseParameters(isGenerator | isAsync); var type = parseReturnType(58 /* ColonToken */, /*isType*/ false); @@ -31443,8 +31440,8 @@ var ts; var node = factory.createFunctionExpression(modifiers, asteriskToken, name, typeParameters, parameters, type, body); return withJSDoc(finishNode(node, pos), hasJSDoc); } - function parseOptionalIdentifier() { - return isIdentifier() ? parseIdentifier() : undefined; + function parseOptionalBindingIdentifier() { + return isBindingIdentifier() ? parseBindingIdentifier() : undefined; } function parseNewExpressionOrNewDotTarget() { var pos = getNodePos(); @@ -31500,6 +31497,8 @@ var ts; setYieldContext(!!(flags & 1 /* Yield */)); var savedAwaitContext = inAwaitContext(); setAwaitContext(!!(flags & 2 /* Await */)); + var savedTopLevel = topLevel; + topLevel = false; // We may be in a [Decorator] context when parsing a function expression or // arrow function. The body of the function is not in [Decorator] context. var saveDecoratorContext = inDecoratorContext(); @@ -31510,6 +31509,7 @@ var ts; if (saveDecoratorContext) { setDecoratorContext(/*val*/ true); } + topLevel = savedTopLevel; setYieldContext(savedYieldContext); setAwaitContext(savedAwaitContext); return block; @@ -32068,7 +32068,7 @@ var ts; function parseObjectBindingElement() { var pos = getNodePos(); var dotDotDotToken = parseOptionalToken(25 /* DotDotDotToken */); - var tokenIsIdentifier = isIdentifier(); + var tokenIsIdentifier = isBindingIdentifier(); var propertyName = parsePropertyName(); var name; if (tokenIsIdentifier && token() !== 58 /* ColonToken */) { @@ -32096,11 +32096,11 @@ var ts; parseExpected(23 /* CloseBracketToken */); return finishNode(factory.createArrayBindingPattern(elements), pos); } - function isIdentifierOrPrivateIdentifierOrPattern() { + function isBindingIdentifierOrPrivateIdentifierOrPattern() { return token() === 18 /* OpenBraceToken */ || token() === 22 /* OpenBracketToken */ || token() === 79 /* PrivateIdentifier */ - || isIdentifier(); + || isBindingIdentifier(); } function parseIdentifierOrPattern(privateIdentifierDiagnosticMessage) { if (token() === 22 /* OpenBracketToken */) { @@ -32109,7 +32109,7 @@ var ts; if (token() === 18 /* OpenBraceToken */) { return parseObjectBindingPattern(); } - return parseIdentifier(/*diagnosticMessage*/ undefined, privateIdentifierDiagnosticMessage); + return parseBindingIdentifier(privateIdentifierDiagnosticMessage); } function parseVariableDeclarationAllowExclamation() { return parseVariableDeclaration(/*allowExclamation*/ true); @@ -32181,7 +32181,7 @@ var ts; parseExpected(97 /* FunctionKeyword */); var asteriskToken = parseOptionalToken(41 /* AsteriskToken */); // We don't parse the name here in await context, instead we will report a grammar error in the checker. - var name = modifierFlags & 512 /* Default */ ? parseOptionalIdentifier() : parseIdentifier(); + var name = modifierFlags & 512 /* Default */ ? parseOptionalBindingIdentifier() : parseBindingIdentifier(); var isGenerator = asteriskToken ? 1 /* Yield */ : 0 /* None */; var isAsync = modifierFlags & 256 /* Async */ ? 2 /* Await */ : 0 /* None */; var typeParameters = parseTypeParameters(); @@ -32325,12 +32325,24 @@ var ts; } return false; } + function parseDecoratorExpression() { + if (inAwaitContext() && token() === 130 /* AwaitKeyword */) { + // `@await` is is disallowed in an [Await] context, but can cause parsing to go off the rails + // This simply parses the missing identifier and moves on. + var pos = getNodePos(); + var awaitExpression = parseIdentifier(ts.Diagnostics.Expression_expected); + nextToken(); + var memberExpression = parseMemberExpressionRest(pos, awaitExpression, /*allowOptionalChain*/ true); + return parseCallExpressionRest(pos, memberExpression); + } + return parseLeftHandSideExpressionOrHigher(); + } function tryParseDecorator() { var pos = getNodePos(); if (!parseOptional(59 /* AtToken */)) { return undefined; } - var expression = doInDecoratorContext(parseLeftHandSideExpressionOrHigher); + var expression = doInDecoratorContext(parseDecoratorExpression); return finishNode(factory.createDecorator(expression), pos); } function parseDecorators() { @@ -32471,8 +32483,8 @@ var ts; // - class expression with omitted name, 'implements' starts heritage clause // - class with name 'implements' // 'isImplementsClause' helps to disambiguate between these two cases - return isIdentifier() && !isImplementsClause() - ? parseIdentifier() + return isBindingIdentifier() && !isImplementsClause() + ? createIdentifier(isBindingIdentifier()) : undefined; } function isImplementsClause() { @@ -34268,6 +34280,7 @@ var ts; } } } + IncrementalParser.createSyntaxCursor = createSyntaxCursor; var InvalidPosition; (function (InvalidPosition) { InvalidPosition[InvalidPosition["Value"] = -1] = "Value"; @@ -36054,7 +36067,7 @@ var ts; } function convertObjectLiteralExpressionToJson(node, knownOptions, extraKeyDiagnostics, parentOption) { var result = returnValue ? {} : undefined; - var _loop_3 = function (element) { + var _loop_4 = function (element) { if (element.kind !== 285 /* PropertyAssignment */) { errors.push(ts.createDiagnosticForNodeInSourceFile(sourceFile, element, ts.Diagnostics.Property_assignment_expected)); return "continue"; @@ -36107,7 +36120,7 @@ var ts; }; for (var _i = 0, _a = node.properties; _i < _a.length; _i++) { var element = _a[_i]; - _loop_3(element); + _loop_4(element); } return result; } @@ -36290,7 +36303,7 @@ var ts; var optionsNameMap = _a.optionsNameMap; var result = ts.createMap(); var getCanonicalFileName = pathOptions && ts.createGetCanonicalFileName(pathOptions.useCaseSensitiveFileNames); - var _loop_4 = function (name) { + var _loop_5 = function (name) { if (ts.hasProperty(options, name)) { // tsconfig only options cannot be specified via command line, // so we can assume that only types that can appear here string | number | boolean @@ -36324,7 +36337,7 @@ var ts; } }; for (var name in options) { - _loop_4(name); + _loop_5(name); } return result; } @@ -37085,7 +37098,7 @@ var ts; } var jsonOnlyIncludeRegexes; if (validatedIncludeSpecs && validatedIncludeSpecs.length > 0) { - var _loop_5 = function (file) { + var _loop_6 = function (file) { if (ts.fileExtensionIs(file, ".json" /* Json */)) { // Valid only if *.json specified if (!jsonOnlyIncludeRegexes) { @@ -37123,7 +37136,7 @@ var ts; }; for (var _a = 0, _b = host.readDirectory(basePath, supportedExtensionsWithJsonIfResolveJsonModule, validatedExcludeSpecs, validatedIncludeSpecs, /*depth*/ undefined); _a < _b.length; _a++) { var file = _b[_a]; - _loop_5(file); + _loop_6(file); } } var literalFiles = ts.arrayFrom(literalFileMap.values()); @@ -40530,18 +40543,31 @@ var ts; currentFlow = saveCurrentFlow; } // The binder visits every node in the syntax tree so it is a convenient place to perform a single localized - // check for reserved words used as identifiers in strict mode code. - function checkStrictModeIdentifier(node) { - if (inStrictMode && - node.originalKeywordKind >= 116 /* FirstFutureReservedWord */ && - node.originalKeywordKind <= 124 /* LastFutureReservedWord */ && - !ts.isIdentifierName(node) && + // check for reserved words used as identifiers in strict mode code, as well as `yield` or `await` in + // [Yield] or [Await] contexts, respectively. + function checkContextualIdentifier(node) { + // Report error only if there are no parse errors in file + if (!file.parseDiagnostics.length && !(node.flags & 8388608 /* Ambient */) && - !(node.flags & 4194304 /* JSDoc */)) { - // Report error only if there are no parse errors in file - if (!file.parseDiagnostics.length) { + !(node.flags & 4194304 /* JSDoc */) && + !ts.isIdentifierName(node)) { + // strict mode identifiers + if (inStrictMode && + node.originalKeywordKind >= 116 /* FirstFutureReservedWord */ && + node.originalKeywordKind <= 124 /* LastFutureReservedWord */) { file.bindDiagnostics.push(createDiagnosticForNode(node, getStrictModeIdentifierMessage(node), ts.declarationNameToString(node))); } + else if (node.originalKeywordKind === 130 /* AwaitKeyword */) { + if (ts.isExternalModule(file) && ts.isInTopLevelContext(node)) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, ts.declarationNameToString(node))); + } + else if (node.flags & 32768 /* AwaitContext */) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, ts.declarationNameToString(node))); + } + } + else if (node.originalKeywordKind === 124 /* YieldKeyword */ && node.flags & 8192 /* YieldContext */) { + file.bindDiagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, ts.declarationNameToString(node))); + } } } function getStrictModeIdentifierMessage(node) { @@ -40808,7 +40834,7 @@ var ts; if (currentFlow && (ts.isExpression(node) || parent.kind === 286 /* ShorthandPropertyAssignment */)) { node.flowNode = currentFlow; } - return checkStrictModeIdentifier(node); + return checkContextualIdentifier(node); case 105 /* SuperKeyword */: node.flowNode = currentFlow; break; @@ -43004,7 +43030,7 @@ var ts; function addDuplicateDeclarationError(node, message, symbolName, relatedNodes) { var errorNode = (ts.getExpandoInitializer(node, /*isPrototypeAssignment*/ false) ? ts.getNameOfExpando(node) : ts.getNameOfDeclaration(node)) || node; var err = lookupOrIssueError(errorNode, message, symbolName); - var _loop_6 = function (relatedNode) { + var _loop_7 = function (relatedNode) { var adjustedNode = (ts.getExpandoInitializer(relatedNode, /*isPrototypeAssignment*/ false) ? ts.getNameOfExpando(relatedNode) : ts.getNameOfDeclaration(relatedNode)) || relatedNode; if (adjustedNode === errorNode) return "continue"; @@ -43017,7 +43043,7 @@ var ts; }; for (var _i = 0, _a = relatedNodes || ts.emptyArray; _i < _a.length; _i++) { var relatedNode = _a[_i]; - _loop_6(relatedNode); + _loop_7(relatedNode); } } function combineSymbolTables(first, second) { @@ -45258,7 +45284,7 @@ var ts; } function forEachSymbolTableInScope(enclosingDeclaration, callback) { var result; - var _loop_7 = function (location) { + var _loop_8 = function (location) { // Locals of a source file are not in scope (because they get merged into the global symbol table) if (location.locals && !isGlobalSourceFile(location)) { if (result = callback(location.locals)) { @@ -45304,7 +45330,7 @@ var ts; } }; for (var location = enclosingDeclaration; location; location = location.parent) { - var state_2 = _loop_7(location); + var state_2 = _loop_8(location); if (typeof state_2 === "object") return state_2.value; } @@ -47314,7 +47340,7 @@ var ts; if (ts.length(reexports) > 1) { var groups = ts.group(reexports, function (decl) { return ts.isStringLiteral(decl.moduleSpecifier) ? ">" + decl.moduleSpecifier.text : ">"; }); if (groups.length !== reexports.length) { - var _loop_8 = function (group_1) { + var _loop_9 = function (group_1) { if (group_1.length > 1) { // remove group members from statements and then merge group members and add back to statements statements = __spreadArrays(ts.filter(statements, function (s) { return group_1.indexOf(s) === -1; }), [ @@ -47327,7 +47353,7 @@ var ts; }; for (var _i = 0, groups_1 = groups; _i < groups_1.length; _i++) { var group_1 = groups_1[_i]; - _loop_8(group_1); + _loop_9(group_1); } } } @@ -50839,7 +50865,7 @@ var ts; // signatures from the type, whose ordering would be non-obvious) var masterList = signatureLists[indexWithLengthOverOne !== undefined ? indexWithLengthOverOne : 0]; var results = masterList.slice(); - var _loop_9 = function (signatures) { + var _loop_10 = function (signatures) { if (signatures !== masterList) { var signature_1 = signatures[0]; ts.Debug.assert(!!signature_1, "getUnionSignatures bails early on empty signature lists and should not have empty lists on second pass"); @@ -50851,7 +50877,7 @@ var ts; }; for (var _b = 0, signatureLists_1 = signatureLists; _b < signatureLists_1.length; _b++) { var signatures = signatureLists_1[_b]; - var state_3 = _loop_9(signatures); + var state_3 = _loop_10(signatures); if (state_3 === "break") break; } @@ -50975,7 +51001,7 @@ var ts; var types = type.types; var mixinFlags = findMixins(types); var mixinCount = ts.countWhere(mixinFlags, function (b) { return b; }); - var _loop_10 = function (i) { + var _loop_11 = function (i) { var t = type.types[i]; // When an intersection type contains mixin constructor types, the construct signatures from // those types are discarded and their return types are mixed into the return types of all @@ -50998,19 +51024,19 @@ var ts; numberIndexInfo = intersectIndexInfos(numberIndexInfo, getIndexInfoOfType(t, 1 /* Number */)); }; for (var i = 0; i < types.length; i++) { - _loop_10(i); + _loop_11(i); } setStructuredTypeMembers(type, emptySymbols, callSignatures || ts.emptyArray, constructSignatures || ts.emptyArray, stringIndexInfo, numberIndexInfo); } function appendSignatures(signatures, newSignatures) { - var _loop_11 = function (sig) { + var _loop_12 = function (sig) { if (!signatures || ts.every(signatures, function (s) { return !compareSignaturesIdentical(s, sig, /*partialMatch*/ false, /*ignoreThisTypes*/ false, /*ignoreReturnTypes*/ false, compareTypesIdentical); })) { signatures = ts.append(signatures, sig); } }; for (var _i = 0, newSignatures_1 = newSignatures; _i < newSignatures_1.length; _i++) { var sig = newSignatures_1[_i]; - _loop_11(sig); + _loop_12(sig); } return signatures; } @@ -53297,7 +53323,7 @@ var ts; var expandedDeclarations = []; var optionalIndex = -1; var restTypes; - var _loop_12 = function (i) { + var _loop_13 = function (i) { var type = elementTypes[i]; var flags = target.elementFlags[i]; if (flags & 8 /* Variadic */) { @@ -53320,7 +53346,7 @@ var ts; } }; for (var i = 0; i < elementTypes.length; i++) { - _loop_12(i); + _loop_13(i); } if (restTypes) { // Create a union of the collected rest element types. @@ -54370,7 +54396,7 @@ var ts; function getConditionalType(root, mapper) { var result; var extraTypes; - var _loop_13 = function () { + var _loop_14 = function () { var checkType = instantiateType(root.checkType, mapper); var checkTypeInstantiable = isGenericObjectType(checkType) || isGenericIndexType(checkType); var extendsType = instantiateType(root.extendsType, mapper); @@ -54444,7 +54470,7 @@ var ts; // types of the form 'A extends B ? X : C extends D ? Y : E extends F ? Z : ...' as a single construct for // purposes of resolution. This means such types aren't subject to the instatiation depth limiter. while (true) { - var state_4 = _loop_13(); + var state_4 = _loop_14(); if (typeof state_4 === "object") return state_4.value; if (state_4 === "break") @@ -56922,7 +56948,7 @@ var ts; reducedTarget = findMatchingDiscriminantType(source, target, isRelatedTo) || filterPrimitivesIfContainsNonPrimitive(target); checkTypes = reducedTarget.flags & 1048576 /* Union */ ? reducedTarget.types : [reducedTarget]; } - var _loop_14 = function (prop) { + var _loop_15 = function (prop) { if (shouldCheckAsExcessProperty(prop, source.symbol) && !isIgnoredJsxProperty(source, prop)) { if (!isKnownProperty(reducedTarget, prop.escapedName, isComparingJsxAttributes)) { if (reportErrors) { @@ -56985,7 +57011,7 @@ var ts; }; for (var _i = 0, _a = getPropertiesOfType(source); _i < _a.length; _i++) { var prop = _a[_i]; - var state_5 = _loop_14(prop); + var state_5 = _loop_15(prop); if (typeof state_5 === "object") return state_5.value; } @@ -57658,11 +57684,11 @@ var ts; // constituents of 'target'. If any combination does not have a match then 'source' is not relatable. var discriminantCombinations = ts.cartesianProduct(sourceDiscriminantTypes); var matchingTypes = []; - var _loop_15 = function (combination) { + var _loop_16 = function (combination) { var hasMatch = false; outer: for (var _i = 0, _a = target.types; _i < _a.length; _i++) { var type = _a[_i]; - var _loop_16 = function (i) { + var _loop_17 = function (i) { var sourceProperty = sourcePropertiesFiltered[i]; var targetProperty = getPropertyOfType(type, sourceProperty.escapedName); if (!targetProperty) @@ -57678,7 +57704,7 @@ var ts; } }; for (var i = 0; i < sourcePropertiesFiltered.length; i++) { - var state_7 = _loop_16(i); + var state_7 = _loop_17(i); switch (state_7) { case "continue-outer": continue outer; } @@ -57692,7 +57718,7 @@ var ts; }; for (var _a = 0, discriminantCombinations_1 = discriminantCombinations; _a < discriminantCombinations_1.length; _a++) { var combination = discriminantCombinations_1[_a]; - var state_6 = _loop_15(combination); + var state_6 = _loop_16(combination); if (typeof state_6 === "object") return state_6.value; } @@ -58334,7 +58360,7 @@ var ts; // The emptyArray singleton is used to signal a recursive invocation. cache.variances = ts.emptyArray; variances = []; - var _loop_17 = function (tp) { + var _loop_18 = function (tp) { var unmeasurable = false; var unreliable = false; var oldHandler = outofbandVarianceMarkerHandler; @@ -58366,7 +58392,7 @@ var ts; }; for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { var tp = typeParameters_1[_i]; - _loop_17(tp); + _loop_18(tp); } cache.variances = variances; } @@ -65849,7 +65875,7 @@ var ts; if (spreadIndex >= 0) { // Create synthetic arguments from spreads of tuple types. var effectiveArgs_1 = args.slice(0, spreadIndex); - var _loop_18 = function (i) { + var _loop_19 = function (i) { var arg = args[i]; // We can call checkExpressionCached because spread expressions never have a contextual type. var spreadType = arg.kind === 217 /* SpreadElement */ && (flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression)); @@ -65866,7 +65892,7 @@ var ts; } }; for (var i = spreadIndex; i < args.length; i++) { - _loop_18(i); + _loop_19(i); } return effectiveArgs_1; } @@ -66168,7 +66194,7 @@ var ts; var min_3 = Number.MAX_VALUE; var minIndex = 0; var i_1 = 0; - var _loop_19 = function (c) { + var _loop_20 = function (c) { var chain_2 = function () { return ts.chainDiagnosticMessages(/*details*/ undefined, ts.Diagnostics.Overload_0_of_1_2_gave_the_following_error, i_1 + 1, candidates.length, signatureToString(c)); }; var diags_2 = getSignatureApplicabilityError(node, args, c, assignableRelation, 0 /* Normal */, /*reportErrors*/ true, chain_2); if (diags_2) { @@ -66186,7 +66212,7 @@ var ts; }; for (var _a = 0, candidatesForArgumentError_1 = candidatesForArgumentError; _a < candidatesForArgumentError_1.length; _a++) { var c = candidatesForArgumentError_1[_a]; - _loop_19(c); + _loop_20(c); } var diags_3 = max > 1 ? allDiagnostics[minIndex] : ts.flatten(allDiagnostics); ts.Debug.assert(diags_3.length > 0, "No errors reported for 3 or fewer overload signatures"); @@ -66320,7 +66346,7 @@ var ts; } var _a = ts.minAndMax(candidates, getNumNonRestParameters), minArgumentCount = _a.min, maxNonRestParam = _a.max; var parameters = []; - var _loop_20 = function (i) { + var _loop_21 = function (i) { var symbols = ts.mapDefined(candidates, function (s) { return signatureHasRestParameter(s) ? i < s.parameters.length - 1 ? s.parameters[i] : ts.last(s.parameters) : i < s.parameters.length ? s.parameters[i] : undefined; }); @@ -66328,7 +66354,7 @@ var ts; parameters.push(createCombinedSymbolFromTypes(symbols, ts.mapDefined(candidates, function (candidate) { return tryGetTypeAtPosition(candidate, i); }))); }; for (var i = 0; i < maxNonRestParam; i++) { - _loop_20(i); + _loop_21(i); } var restParameterSymbols = ts.mapDefined(candidates, function (c) { return signatureHasRestParameter(c) ? ts.last(c.parameters) : undefined; }); var flags = 0 /* None */; @@ -68080,15 +68106,11 @@ var ts; checkExpression(node.expression); return undefinedWideningType; } - function isInTopLevelContext(node) { - var container = ts.getThisContainer(node, /*includeArrowFunctions*/ true); - return ts.isSourceFile(container); - } function checkAwaitExpression(node) { // Grammar checking if (produceDiagnostics) { if (!(node.flags & 32768 /* AwaitContext */)) { - if (isInTopLevelContext(node)) { + if (ts.isInTopLevelContext(node)) { var sourceFile = ts.getSourceFileOfNode(node); if (!hasParseDiagnostics(sourceFile)) { var span = void 0; @@ -73251,7 +73273,7 @@ var ts; function issueMemberSpecificError(node, typeWithThis, baseWithThis, broadDiag) { // iterate over all implemented properties and issue errors on each one which isn't compatible, rather than the class as a whole, if possible var issuedMemberError = false; - var _loop_21 = function (member) { + var _loop_22 = function (member) { if (ts.hasStaticModifier(member)) { return "continue"; } @@ -73270,7 +73292,7 @@ var ts; }; for (var _i = 0, _a = node.members; _i < _a.length; _i++) { var member = _a[_i]; - _loop_21(member); + _loop_22(member); } if (!issuedMemberError) { // check again with diagnostics to generate a less-specific error @@ -74043,7 +74065,6 @@ var ts; } } function checkImportBinding(node) { - checkGrammarAwaitIdentifier(node.name); checkCollisionWithRequireExportsInGeneratedCode(node, node.name); checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name); checkAliasSymbol(node); @@ -75214,10 +75235,10 @@ var ts; // If this is from nested object binding pattern // for ({ skills: { primary, secondary } } = multiRobot, i = 0; i < 1; i++) { if (expr.parent.kind === 285 /* PropertyAssignment */) { - var node_1 = ts.cast(expr.parent.parent, ts.isObjectLiteralExpression); - var typeOfParentObjectLiteral = getTypeOfAssignmentPattern(node_1) || errorType; - var propertyIndex = ts.indexOfNode(node_1.properties, expr.parent); - return checkObjectLiteralDestructuringPropertyAssignment(node_1, typeOfParentObjectLiteral, propertyIndex); + var node_2 = ts.cast(expr.parent.parent, ts.isObjectLiteralExpression); + var typeOfParentObjectLiteral = getTypeOfAssignmentPattern(node_2) || errorType; + var propertyIndex = ts.indexOfNode(node_2.properties, expr.parent); + return checkObjectLiteralDestructuringPropertyAssignment(node_2, typeOfParentObjectLiteral, propertyIndex); } // Array literal assignment - array destructuring pattern var node = ts.cast(expr.parent, ts.isArrayLiteralExpression); @@ -76574,29 +76595,18 @@ var ts; } return false; } - function checkGrammarAwaitIdentifier(name) { - if (name && ts.isIdentifier(name) && name.originalKeywordKind === 130 /* AwaitKeyword */ && isInTopLevelContext(name.parent)) { - var file = ts.getSourceFileOfNode(name); - if (!file.isDeclarationFile && ts.isExternalModule(file)) { - return grammarErrorOnNode(name, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, ts.idText(name)); - } - } - return false; - } function checkGrammarFunctionLikeDeclaration(node) { // Prevent cascading error by short-circuit var file = ts.getSourceFileOfNode(node); return checkGrammarDecoratorsAndModifiers(node) || checkGrammarTypeParameterList(node.typeParameters, file) || - (ts.isFunctionDeclaration(node) && checkGrammarAwaitIdentifier(node.name)) || checkGrammarParameterList(node.parameters) || checkGrammarArrowFunction(node, file) || (ts.isFunctionLikeDeclaration(node) && checkGrammarForUseStrictSimpleParameterList(node)); } function checkGrammarClassLikeDeclaration(node) { var file = ts.getSourceFileOfNode(node); - return (ts.isClassDeclaration(node) && checkGrammarAwaitIdentifier(node.name)) || - checkGrammarClassDeclarationHeritageClauses(node) || + return checkGrammarClassDeclarationHeritageClauses(node) || checkGrammarTypeParameterList(node.typeParameters, file); } function checkGrammarArrowFunction(node, file) { @@ -77166,9 +77176,6 @@ var ts; return grammarErrorOnNode(node.name, ts.Diagnostics.A_rest_element_cannot_have_a_property_name); } } - if (ts.isIdentifier(node.name) && checkGrammarAwaitIdentifier(node.name)) { - return true; - } if (node.dotDotDotToken && node.initializer) { // Error on equals token which immediately precedes the initializer return grammarErrorAtPos(node, node.initializer.pos - 1, 1, ts.Diagnostics.A_rest_element_cannot_have_an_initializer); @@ -77225,9 +77232,6 @@ var ts; } } } - if (ts.isIdentifier(node.name) && checkGrammarAwaitIdentifier(node.name)) { - return true; - } if (node.exclamationToken && (node.parent.parent.kind !== 229 /* VariableStatement */ || !node.type || node.initializer || node.flags & 8388608 /* Ambient */)) { return grammarErrorOnNode(node.exclamationToken, ts.Diagnostics.Definite_assignment_assertions_can_only_be_used_along_with_a_type_annotation); } @@ -107190,7 +107194,7 @@ var ts; }); // Sort by paths closest to importing file Name directory var sortedPaths = []; - var _loop_22 = function (directory) { + var _loop_23 = function (directory) { var directoryStart = ts.ensureTrailingDirectorySeparator(directory); var pathsInDirectory; allFileNames.forEach(function (canonicalFileName, fileName) { @@ -107216,7 +107220,7 @@ var ts; }; var out_directory_1; for (var directory = ts.getDirectoryPath(ts.toPath(importingFileName, cwd, getCanonicalFileName)); allFileNames.size !== 0;) { - var state_8 = _loop_22(directory); + var state_8 = _loop_23(directory); directory = out_directory_1; if (state_8 === "break") break;