@@ -556,14 +556,29 @@ namespace ts {
556
556
decorators ,
557
557
modifiers
558
558
) ;
559
- node . name = asName ( name ) ;
560
- node . transformFlags |=
561
- kind === SyntaxKind . MethodDeclaration ||
562
- kind === SyntaxKind . GetAccessor ||
563
- kind === SyntaxKind . SetAccessor ||
564
- kind === SyntaxKind . PropertyDeclaration ?
565
- propagatePropertyNameFlags ( node . name ) :
566
- propagateChildFlags ( node . name ) ;
559
+ name = asName ( name ) ;
560
+ node . name = name ;
561
+
562
+ // The PropertyName of a member is allowed to be `await`.
563
+ // We don't need to exclude `await` for type signatures since types
564
+ // don't propagate child flags.
565
+ if ( name ) {
566
+ switch ( node . kind ) {
567
+ case SyntaxKind . MethodDeclaration :
568
+ case SyntaxKind . GetAccessor :
569
+ case SyntaxKind . SetAccessor :
570
+ case SyntaxKind . PropertyDeclaration :
571
+ case SyntaxKind . PropertyAssignment :
572
+ if ( isIdentifier ( name ) ) {
573
+ node . transformFlags |= propagateIdentifierNameFlags ( name ) ;
574
+ break ;
575
+ }
576
+ // fall through
577
+ default :
578
+ node . transformFlags |= propagateChildFlags ( name ) ;
579
+ break ;
580
+ }
581
+ }
567
582
return node ;
568
583
}
569
584
@@ -637,7 +652,7 @@ namespace ts {
637
652
type
638
653
) ;
639
654
node . body = body ;
640
- node . transformFlags |= propagateChildFlags ( node . body ) ;
655
+ node . transformFlags |= propagateChildFlags ( node . body ) & ~ TransformFlags . ContainsPossibleTopLevelAwait ;
641
656
if ( ! body ) node . transformFlags |= TransformFlags . ContainsTypeScript ;
642
657
return node ;
643
658
}
@@ -1022,7 +1037,7 @@ namespace ts {
1022
1037
node . right = asName ( right ) ;
1023
1038
node . transformFlags |=
1024
1039
propagateChildFlags ( node . left ) |
1025
- propagateChildFlags ( node . right ) ;
1040
+ propagateIdentifierNameFlags ( node . right ) ;
1026
1041
return node ;
1027
1042
}
1028
1043
@@ -2037,9 +2052,13 @@ namespace ts {
2037
2052
node . propertyName = asName ( propertyName ) ;
2038
2053
node . dotDotDotToken = dotDotDotToken ;
2039
2054
node . transformFlags |=
2040
- propagateChildFlags ( node . propertyName ) |
2041
2055
propagateChildFlags ( node . dotDotDotToken ) |
2042
2056
TransformFlags . ContainsES2015 ;
2057
+ if ( node . propertyName ) {
2058
+ node . transformFlags |= isIdentifier ( node . propertyName ) ?
2059
+ propagateIdentifierNameFlags ( node . propertyName ) :
2060
+ propagateChildFlags ( node . propertyName ) ;
2061
+ }
2043
2062
if ( dotDotDotToken ) node . transformFlags |= TransformFlags . ContainsRestOrSpread ;
2044
2063
return node ;
2045
2064
}
@@ -2103,7 +2122,9 @@ namespace ts {
2103
2122
node . name = asName ( name ) ;
2104
2123
node . transformFlags =
2105
2124
propagateChildFlags ( node . expression ) |
2106
- propagatePropertyNameFlags ( node . name ) ;
2125
+ ( isIdentifier ( node . name ) ?
2126
+ propagateIdentifierNameFlags ( node . name ) :
2127
+ propagateChildFlags ( node . name ) ) ;
2107
2128
if ( isSuperKeyword ( expression ) ) {
2108
2129
// super method calls require a lexical 'this'
2109
2130
// super method calls require 'super' hoisting in ES2017 and ES2018 async functions and async generators
@@ -2133,10 +2154,12 @@ namespace ts {
2133
2154
node . questionDotToken = questionDotToken ;
2134
2155
node . name = asName ( name ) ;
2135
2156
node . transformFlags |=
2157
+ TransformFlags . ContainsES2020 |
2136
2158
propagateChildFlags ( node . expression ) |
2137
2159
propagateChildFlags ( node . questionDotToken ) |
2138
- propagateChildFlags ( node . name ) |
2139
- TransformFlags . ContainsES2020 ;
2160
+ ( isIdentifier ( node . name ) ?
2161
+ propagateIdentifierNameFlags ( node . name ) :
2162
+ propagateChildFlags ( node . name ) ) ;
2140
2163
return node ;
2141
2164
}
2142
2165
@@ -3565,6 +3588,7 @@ namespace ts {
3565
3588
node . transformFlags |=
3566
3589
propagateChildrenFlags ( node . members ) |
3567
3590
TransformFlags . ContainsTypeScript ;
3591
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // Enum declarations cannot contain `await`
3568
3592
return node ;
3569
3593
}
3570
3594
@@ -3608,6 +3632,7 @@ namespace ts {
3608
3632
propagateChildFlags ( node . body ) |
3609
3633
TransformFlags . ContainsTypeScript ;
3610
3634
}
3635
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // Module declarations cannot contain `await`.
3611
3636
return node ;
3612
3637
}
3613
3638
@@ -3692,6 +3717,7 @@ namespace ts {
3692
3717
node . moduleReference = moduleReference ;
3693
3718
node . transformFlags |= propagateChildFlags ( node . moduleReference ) ;
3694
3719
if ( ! isExternalModuleReference ( node . moduleReference ) ) node . transformFlags |= TransformFlags . ContainsTypeScript ;
3720
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // Import= declaration is always parsed in an Await context
3695
3721
return node ;
3696
3722
}
3697
3723
@@ -3728,6 +3754,7 @@ namespace ts {
3728
3754
node . transformFlags |=
3729
3755
propagateChildFlags ( node . importClause ) |
3730
3756
propagateChildFlags ( node . moduleSpecifier ) ;
3757
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3731
3758
return node ;
3732
3759
}
3733
3760
@@ -3759,6 +3786,7 @@ namespace ts {
3759
3786
if ( isTypeOnly ) {
3760
3787
node . transformFlags |= TransformFlags . ContainsTypeScript ;
3761
3788
}
3789
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3762
3790
return node ;
3763
3791
}
3764
3792
@@ -3776,6 +3804,7 @@ namespace ts {
3776
3804
const node = createBaseNode < NamespaceImport > ( SyntaxKind . NamespaceImport ) ;
3777
3805
node . name = name ;
3778
3806
node . transformFlags |= propagateChildFlags ( node . name ) ;
3807
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3779
3808
return node ;
3780
3809
}
3781
3810
@@ -3793,6 +3822,7 @@ namespace ts {
3793
3822
node . transformFlags |=
3794
3823
propagateChildFlags ( node . name ) |
3795
3824
TransformFlags . ContainsESNext ;
3825
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3796
3826
return node ;
3797
3827
}
3798
3828
@@ -3808,6 +3838,7 @@ namespace ts {
3808
3838
const node = createBaseNode < NamedImports > ( SyntaxKind . NamedImports ) ;
3809
3839
node . elements = createNodeArray ( elements ) ;
3810
3840
node . transformFlags |= propagateChildrenFlags ( node . elements ) ;
3841
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3811
3842
return node ;
3812
3843
}
3813
3844
@@ -3826,6 +3857,7 @@ namespace ts {
3826
3857
node . transformFlags |=
3827
3858
propagateChildFlags ( node . propertyName ) |
3828
3859
propagateChildFlags ( node . name ) ;
3860
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3829
3861
return node ;
3830
3862
}
3831
3863
@@ -3854,6 +3886,7 @@ namespace ts {
3854
3886
? parenthesizerRules ( ) . parenthesizeRightSideOfBinary ( SyntaxKind . EqualsToken , /*leftSide*/ undefined , expression )
3855
3887
: parenthesizerRules ( ) . parenthesizeExpressionOfExportDefault ( expression ) ;
3856
3888
node . transformFlags |= propagateChildFlags ( node . expression ) ;
3889
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3857
3890
return node ;
3858
3891
}
3859
3892
@@ -3890,6 +3923,7 @@ namespace ts {
3890
3923
node . transformFlags |=
3891
3924
propagateChildFlags ( node . exportClause ) |
3892
3925
propagateChildFlags ( node . moduleSpecifier ) ;
3926
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3893
3927
return node ;
3894
3928
}
3895
3929
@@ -3916,6 +3950,7 @@ namespace ts {
3916
3950
const node = createBaseNode < NamedExports > ( SyntaxKind . NamedExports ) ;
3917
3951
node . elements = createNodeArray ( elements ) ;
3918
3952
node . transformFlags |= propagateChildrenFlags ( node . elements ) ;
3953
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3919
3954
return node ;
3920
3955
}
3921
3956
@@ -3934,6 +3969,7 @@ namespace ts {
3934
3969
node . transformFlags |=
3935
3970
propagateChildFlags ( node . propertyName ) |
3936
3971
propagateChildFlags ( node . name ) ;
3972
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3937
3973
return node ;
3938
3974
}
3939
3975
@@ -3964,6 +4000,7 @@ namespace ts {
3964
4000
const node = createBaseNode < ExternalModuleReference > ( SyntaxKind . ExternalModuleReference ) ;
3965
4001
node . expression = expression ;
3966
4002
node . transformFlags |= propagateChildFlags ( node . expression ) ;
4003
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3967
4004
return node ;
3968
4005
}
3969
4006
@@ -5786,13 +5823,9 @@ namespace ts {
5786
5823
return tokenValue ;
5787
5824
}
5788
5825
5789
- function propagatePropertyNameFlags ( node : Node | undefined ) {
5790
- if ( ! node ) return TransformFlags . None ;
5791
- // `await` in a property name should not be considered a possible top-level await keyword
5792
- const transformFlags = propagateChildFlags ( node ) ;
5793
- return isIdentifier ( node ) ?
5794
- transformFlags & ~ TransformFlags . ContainsPossibleTopLevelAwait :
5795
- transformFlags ;
5826
+ function propagateIdentifierNameFlags ( node : Identifier ) {
5827
+ // An IdentifierName is allowed to be `await`
5828
+ return propagateChildFlags ( node ) & ~ TransformFlags . ContainsPossibleTopLevelAwait ;
5796
5829
}
5797
5830
5798
5831
function propagatePropertyNameFlagsOfChild ( node : PropertyName , transformFlags : TransformFlags ) {
0 commit comments