@@ -2584,7 +2584,7 @@ namespace ts {
25842584 // FormalParameter [Yield,Await]:
25852585 // BindingElement[?Yield,?Await]
25862586 node . name = parseIdentifierOrPattern ( ) ;
2587- if ( getFullWidth ( node . name ) === 0 && ! hasModifiers ( node ) && isModifierKind ( token ( ) ) ) {
2587+ if ( getFullWidth ( node . name ) === 0 && ! node . modifiers && isModifierKind ( token ( ) ) ) {
25882588 // in cases like
25892589 // 'use strict'
25902590 // function foo(static)
@@ -3603,7 +3603,7 @@ namespace ts {
36033603 return undefined ;
36043604 }
36053605
3606- const isAsync = hasModifier ( arrowFunction , ModifierFlags . Async ) ;
3606+ const isAsync = hasModifierOfKind ( arrowFunction , SyntaxKind . AsyncKeyword ) ;
36073607
36083608 // If we have an arrow, then try to parse the body. Even if not, try to parse if we
36093609 // have an opening brace, just in case we're in an error state.
@@ -3809,7 +3809,7 @@ namespace ts {
38093809 function parseParenthesizedArrowFunctionExpressionHead ( allowAmbiguity : boolean ) : ArrowFunction | undefined {
38103810 const node = < ArrowFunction > createNodeWithJSDoc ( SyntaxKind . ArrowFunction ) ;
38113811 node . modifiers = parseModifiersForArrowFunction ( ) ;
3812- const isAsync = hasModifier ( node , ModifierFlags . Async ) ? SignatureFlags . Await : SignatureFlags . None ;
3812+ const isAsync = hasModifierOfKind ( node , SyntaxKind . AsyncKeyword ) ? SignatureFlags . Await : SignatureFlags . None ;
38133813 // Arrow functions are never generators.
38143814 //
38153815 // If we're speculatively parsing a signature for a parenthesized arrow function, then
@@ -5005,7 +5005,7 @@ namespace ts {
50055005 node . asteriskToken = parseOptionalToken ( SyntaxKind . AsteriskToken ) ;
50065006
50075007 const isGenerator = node . asteriskToken ? SignatureFlags . Yield : SignatureFlags . None ;
5008- const isAsync = hasModifier ( node , ModifierFlags . Async ) ? SignatureFlags . Await : SignatureFlags . None ;
5008+ const isAsync = hasModifierOfKind ( node , SyntaxKind . AsyncKeyword ) ? SignatureFlags . Await : SignatureFlags . None ;
50095009 node . name =
50105010 isGenerator && isAsync ? doInYieldAndAwaitContext ( parseOptionalIdentifier ) :
50115011 isGenerator ? doInYieldContext ( parseOptionalIdentifier ) :
@@ -5834,9 +5834,9 @@ namespace ts {
58345834 node . kind = SyntaxKind . FunctionDeclaration ;
58355835 parseExpected ( SyntaxKind . FunctionKeyword ) ;
58365836 node . asteriskToken = parseOptionalToken ( SyntaxKind . AsteriskToken ) ;
5837- node . name = hasModifier ( node , ModifierFlags . Default ) ? parseOptionalIdentifier ( ) : parseIdentifier ( ) ;
5837+ node . name = hasModifierOfKind ( node , SyntaxKind . DefaultKeyword ) ? parseOptionalIdentifier ( ) : parseIdentifier ( ) ;
58385838 const isGenerator = node . asteriskToken ? SignatureFlags . Yield : SignatureFlags . None ;
5839- const isAsync = hasModifier ( node , ModifierFlags . Async ) ? SignatureFlags . Await : SignatureFlags . None ;
5839+ const isAsync = hasModifierOfKind ( node , SyntaxKind . AsyncKeyword ) ? SignatureFlags . Await : SignatureFlags . None ;
58405840 fillSignature ( SyntaxKind . ColonToken , isGenerator | isAsync , node ) ;
58415841 node . body = parseFunctionBlockOrSemicolon ( isGenerator | isAsync , Diagnostics . or_expected ) ;
58425842 return finishNode ( node ) ;
@@ -5869,7 +5869,7 @@ namespace ts {
58695869 node . kind = SyntaxKind . MethodDeclaration ;
58705870 node . asteriskToken = asteriskToken ;
58715871 const isGenerator = asteriskToken ? SignatureFlags . Yield : SignatureFlags . None ;
5872- const isAsync = hasModifier ( node , ModifierFlags . Async ) ? SignatureFlags . Await : SignatureFlags . None ;
5872+ const isAsync = hasModifierOfKind ( node , SyntaxKind . AsyncKeyword ) ? SignatureFlags . Await : SignatureFlags . None ;
58735873 fillSignature ( SyntaxKind . ColonToken , isGenerator | isAsync , node ) ;
58745874 node . body = parseFunctionBlockOrSemicolon ( isGenerator | isAsync , diagnosticMessage ) ;
58755875 return finishNode ( node ) ;
@@ -6511,7 +6511,7 @@ namespace ts {
65116511 }
65126512
65136513 function isAnExternalModuleIndicatorNode ( node : Node ) {
6514- return hasModifier ( node , ModifierFlags . Export )
6514+ return hasModifierOfKind ( node , SyntaxKind . ExportKeyword )
65156515 || node . kind === SyntaxKind . ImportEqualsDeclaration && ( < ImportEqualsDeclaration > node ) . moduleReference . kind === SyntaxKind . ExternalModuleReference
65166516 || node . kind === SyntaxKind . ImportDeclaration
65176517 || node . kind === SyntaxKind . ExportAssignment
@@ -6528,6 +6528,11 @@ namespace ts {
65286528 return isImportMeta ( node ) ? node : forEachChild ( node , walkTreeForExternalModuleIndicators ) ;
65296529 }
65306530
6531+ /** Do not use hasModifier inside the parser; it relies on parent pointers. Use this instead. */
6532+ function hasModifierOfKind ( node : Node , kind : SyntaxKind ) {
6533+ return some ( node . modifiers , m => m . kind === kind ) ;
6534+ }
6535+
65316536 function isImportMeta ( node : Node ) : boolean {
65326537 return isMetaProperty ( node ) && node . keywordToken === SyntaxKind . ImportKeyword && node . name . escapedText === "meta" ;
65336538 }
0 commit comments