@@ -558,8 +558,29 @@ namespace ts {
558
558
decorators ,
559
559
modifiers
560
560
) ;
561
- node . name = asName ( name ) ;
562
- node . transformFlags |= propagateChildFlags ( node . name ) ;
561
+ name = asName ( name ) ;
562
+ node . name = name ;
563
+
564
+ // The PropertyName of a member is allowed to be `await`.
565
+ // We don't need to exclude `await` for type signatures since types
566
+ // don't propagate child flags.
567
+ if ( name ) {
568
+ switch ( node . kind ) {
569
+ case SyntaxKind . MethodDeclaration :
570
+ case SyntaxKind . GetAccessor :
571
+ case SyntaxKind . SetAccessor :
572
+ case SyntaxKind . PropertyDeclaration :
573
+ case SyntaxKind . PropertyAssignment :
574
+ if ( isIdentifier ( name ) ) {
575
+ node . transformFlags |= propagateIdentifierNameFlags ( name ) ;
576
+ break ;
577
+ }
578
+ // fall through
579
+ default :
580
+ node . transformFlags |= propagateChildFlags ( name ) ;
581
+ break ;
582
+ }
583
+ }
563
584
return node ;
564
585
}
565
586
@@ -633,7 +654,7 @@ namespace ts {
633
654
type
634
655
) ;
635
656
node . body = body ;
636
- node . transformFlags |= propagateChildFlags ( node . body ) ;
657
+ node . transformFlags |= propagateChildFlags ( node . body ) & ~ TransformFlags . ContainsPossibleTopLevelAwait ;
637
658
if ( ! body ) node . transformFlags |= TransformFlags . ContainsTypeScript ;
638
659
return node ;
639
660
}
@@ -826,6 +847,9 @@ namespace ts {
826
847
// NOTE: we do not use `setChildren` here because typeArguments in an identifier do not contribute to transformations
827
848
node . typeArguments = createNodeArray ( typeArguments ) ;
828
849
}
850
+ if ( node . originalKeywordKind === SyntaxKind . AwaitKeyword ) {
851
+ node . transformFlags |= TransformFlags . ContainsPossibleTopLevelAwait ;
852
+ }
829
853
return node ;
830
854
}
831
855
@@ -1015,7 +1039,7 @@ namespace ts {
1015
1039
node . right = asName ( right ) ;
1016
1040
node . transformFlags |=
1017
1041
propagateChildFlags ( node . left ) |
1018
- propagateChildFlags ( node . right ) ;
1042
+ propagateIdentifierNameFlags ( node . right ) ;
1019
1043
return node ;
1020
1044
}
1021
1045
@@ -2030,9 +2054,13 @@ namespace ts {
2030
2054
node . propertyName = asName ( propertyName ) ;
2031
2055
node . dotDotDotToken = dotDotDotToken ;
2032
2056
node . transformFlags |=
2033
- propagateChildFlags ( node . propertyName ) |
2034
2057
propagateChildFlags ( node . dotDotDotToken ) |
2035
2058
TransformFlags . ContainsES2015 ;
2059
+ if ( node . propertyName ) {
2060
+ node . transformFlags |= isIdentifier ( node . propertyName ) ?
2061
+ propagateIdentifierNameFlags ( node . propertyName ) :
2062
+ propagateChildFlags ( node . propertyName ) ;
2063
+ }
2036
2064
if ( dotDotDotToken ) node . transformFlags |= TransformFlags . ContainsRestOrSpread ;
2037
2065
return node ;
2038
2066
}
@@ -2096,7 +2124,9 @@ namespace ts {
2096
2124
node . name = asName ( name ) ;
2097
2125
node . transformFlags =
2098
2126
propagateChildFlags ( node . expression ) |
2099
- propagateChildFlags ( node . name ) ;
2127
+ ( isIdentifier ( node . name ) ?
2128
+ propagateIdentifierNameFlags ( node . name ) :
2129
+ propagateChildFlags ( node . name ) ) ;
2100
2130
if ( isSuperKeyword ( expression ) ) {
2101
2131
// super method calls require a lexical 'this'
2102
2132
// super method calls require 'super' hoisting in ES2017 and ES2018 async functions and async generators
@@ -2126,10 +2156,12 @@ namespace ts {
2126
2156
node . questionDotToken = questionDotToken ;
2127
2157
node . name = asName ( name ) ;
2128
2158
node . transformFlags |=
2159
+ TransformFlags . ContainsES2020 |
2129
2160
propagateChildFlags ( node . expression ) |
2130
2161
propagateChildFlags ( node . questionDotToken ) |
2131
- propagateChildFlags ( node . name ) |
2132
- TransformFlags . ContainsES2020 ;
2162
+ ( isIdentifier ( node . name ) ?
2163
+ propagateIdentifierNameFlags ( node . name ) :
2164
+ propagateChildFlags ( node . name ) ) ;
2133
2165
return node ;
2134
2166
}
2135
2167
@@ -3558,6 +3590,7 @@ namespace ts {
3558
3590
node . transformFlags |=
3559
3591
propagateChildrenFlags ( node . members ) |
3560
3592
TransformFlags . ContainsTypeScript ;
3593
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // Enum declarations cannot contain `await`
3561
3594
return node ;
3562
3595
}
3563
3596
@@ -3601,6 +3634,7 @@ namespace ts {
3601
3634
propagateChildFlags ( node . body ) |
3602
3635
TransformFlags . ContainsTypeScript ;
3603
3636
}
3637
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // Module declarations cannot contain `await`.
3604
3638
return node ;
3605
3639
}
3606
3640
@@ -3685,6 +3719,7 @@ namespace ts {
3685
3719
node . moduleReference = moduleReference ;
3686
3720
node . transformFlags |= propagateChildFlags ( node . moduleReference ) ;
3687
3721
if ( ! isExternalModuleReference ( node . moduleReference ) ) node . transformFlags |= TransformFlags . ContainsTypeScript ;
3722
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // Import= declaration is always parsed in an Await context
3688
3723
return node ;
3689
3724
}
3690
3725
@@ -3721,6 +3756,7 @@ namespace ts {
3721
3756
node . transformFlags |=
3722
3757
propagateChildFlags ( node . importClause ) |
3723
3758
propagateChildFlags ( node . moduleSpecifier ) ;
3759
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3724
3760
return node ;
3725
3761
}
3726
3762
@@ -3752,6 +3788,7 @@ namespace ts {
3752
3788
if ( isTypeOnly ) {
3753
3789
node . transformFlags |= TransformFlags . ContainsTypeScript ;
3754
3790
}
3791
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3755
3792
return node ;
3756
3793
}
3757
3794
@@ -3769,6 +3806,7 @@ namespace ts {
3769
3806
const node = createBaseNode < NamespaceImport > ( SyntaxKind . NamespaceImport ) ;
3770
3807
node . name = name ;
3771
3808
node . transformFlags |= propagateChildFlags ( node . name ) ;
3809
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3772
3810
return node ;
3773
3811
}
3774
3812
@@ -3786,6 +3824,7 @@ namespace ts {
3786
3824
node . transformFlags |=
3787
3825
propagateChildFlags ( node . name ) |
3788
3826
TransformFlags . ContainsESNext ;
3827
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3789
3828
return node ;
3790
3829
}
3791
3830
@@ -3801,6 +3840,7 @@ namespace ts {
3801
3840
const node = createBaseNode < NamedImports > ( SyntaxKind . NamedImports ) ;
3802
3841
node . elements = createNodeArray ( elements ) ;
3803
3842
node . transformFlags |= propagateChildrenFlags ( node . elements ) ;
3843
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3804
3844
return node ;
3805
3845
}
3806
3846
@@ -3819,6 +3859,7 @@ namespace ts {
3819
3859
node . transformFlags |=
3820
3860
propagateChildFlags ( node . propertyName ) |
3821
3861
propagateChildFlags ( node . name ) ;
3862
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3822
3863
return node ;
3823
3864
}
3824
3865
@@ -3847,6 +3888,7 @@ namespace ts {
3847
3888
? parenthesizerRules ( ) . parenthesizeRightSideOfBinary ( SyntaxKind . EqualsToken , /*leftSide*/ undefined , expression )
3848
3889
: parenthesizerRules ( ) . parenthesizeExpressionOfExportDefault ( expression ) ;
3849
3890
node . transformFlags |= propagateChildFlags ( node . expression ) ;
3891
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3850
3892
return node ;
3851
3893
}
3852
3894
@@ -3883,6 +3925,7 @@ namespace ts {
3883
3925
node . transformFlags |=
3884
3926
propagateChildFlags ( node . exportClause ) |
3885
3927
propagateChildFlags ( node . moduleSpecifier ) ;
3928
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3886
3929
return node ;
3887
3930
}
3888
3931
@@ -3909,6 +3952,7 @@ namespace ts {
3909
3952
const node = createBaseNode < NamedExports > ( SyntaxKind . NamedExports ) ;
3910
3953
node . elements = createNodeArray ( elements ) ;
3911
3954
node . transformFlags |= propagateChildrenFlags ( node . elements ) ;
3955
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3912
3956
return node ;
3913
3957
}
3914
3958
@@ -3927,6 +3971,7 @@ namespace ts {
3927
3971
node . transformFlags |=
3928
3972
propagateChildFlags ( node . propertyName ) |
3929
3973
propagateChildFlags ( node . name ) ;
3974
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3930
3975
return node ;
3931
3976
}
3932
3977
@@ -3957,6 +4002,7 @@ namespace ts {
3957
4002
const node = createBaseNode < ExternalModuleReference > ( SyntaxKind . ExternalModuleReference ) ;
3958
4003
node . expression = expression ;
3959
4004
node . transformFlags |= propagateChildFlags ( node . expression ) ;
4005
+ node . transformFlags &= ~ TransformFlags . ContainsPossibleTopLevelAwait ; // always parsed in an Await context
3960
4006
return node ;
3961
4007
}
3962
4008
@@ -5781,14 +5827,19 @@ namespace ts {
5781
5827
return tokenValue ;
5782
5828
}
5783
5829
5784
- function propagatePropertyNameFlags ( node : PropertyName , transformFlags : TransformFlags ) {
5830
+ function propagateIdentifierNameFlags ( node : Identifier ) {
5831
+ // An IdentifierName is allowed to be `await`
5832
+ return propagateChildFlags ( node ) & ~ TransformFlags . ContainsPossibleTopLevelAwait ;
5833
+ }
5834
+
5835
+ function propagatePropertyNameFlagsOfChild ( node : PropertyName , transformFlags : TransformFlags ) {
5785
5836
return transformFlags | ( node . transformFlags & TransformFlags . PropertyNamePropagatingFlags ) ;
5786
5837
}
5787
5838
5788
5839
function propagateChildFlags ( child : Node | undefined ) : TransformFlags {
5789
5840
if ( ! child ) return TransformFlags . None ;
5790
5841
const childFlags = child . transformFlags & ~ getTransformFlagsSubtreeExclusions ( child . kind ) ;
5791
- return isNamedDeclaration ( child ) && isPropertyName ( child . name ) ? propagatePropertyNameFlags ( child . name , childFlags ) : childFlags ;
5842
+ return isNamedDeclaration ( child ) && isPropertyName ( child . name ) ? propagatePropertyNameFlagsOfChild ( child . name , childFlags ) : childFlags ;
5792
5843
}
5793
5844
5794
5845
function propagateChildrenFlags ( children : NodeArray < Node > | undefined ) : TransformFlags {
0 commit comments