@@ -2740,6 +2740,9 @@ namespace ts {
27402740 case SyntaxKind . PropertyAccessExpression :
27412741 return computePropertyAccess ( < PropertyAccessExpression > node , subtreeFlags ) ;
27422742
2743+ case SyntaxKind . ElementAccessExpression :
2744+ return computeElementAccess ( < ElementAccessExpression > node , subtreeFlags ) ;
2745+
27432746 default :
27442747 return computeOther ( node , kind , subtreeFlags ) ;
27452748 }
@@ -2748,17 +2751,21 @@ namespace ts {
27482751 function computeCallExpression ( node : CallExpression , subtreeFlags : TransformFlags ) {
27492752 let transformFlags = subtreeFlags ;
27502753 const expression = node . expression ;
2751- const expressionKind = expression . kind ;
27522754
27532755 if ( node . typeArguments ) {
27542756 transformFlags |= TransformFlags . AssertTypeScript ;
27552757 }
27562758
27572759 if ( subtreeFlags & TransformFlags . ContainsSpread
2758- || isSuperOrSuperProperty ( expression , expressionKind ) ) {
2760+ || ( expression . transformFlags & ( TransformFlags . Super | TransformFlags . ContainsSuper ) ) ) {
27592761 // If the this node contains a SpreadExpression, or is a super call, then it is an ES6
27602762 // node.
27612763 transformFlags |= TransformFlags . AssertES2015 ;
2764+ // super property or element accesses could be inside lambdas, etc, and need a captured `this`,
2765+ // while super keyword for super calls (indicated by TransformFlags.Super) does not (since it can only be top-level in a constructor)
2766+ if ( expression . transformFlags & TransformFlags . ContainsSuper ) {
2767+ transformFlags |= TransformFlags . ContainsLexicalThis ;
2768+ }
27622769 }
27632770
27642771 if ( expression . kind === SyntaxKind . ImportKeyword ) {
@@ -2775,21 +2782,6 @@ namespace ts {
27752782 return transformFlags & ~ TransformFlags . ArrayLiteralOrCallOrNewExcludes ;
27762783 }
27772784
2778- function isSuperOrSuperProperty ( node : Node , kind : SyntaxKind ) {
2779- switch ( kind ) {
2780- case SyntaxKind . SuperKeyword :
2781- return true ;
2782-
2783- case SyntaxKind . PropertyAccessExpression :
2784- case SyntaxKind . ElementAccessExpression :
2785- const expression = ( < PropertyAccessExpression | ElementAccessExpression > node ) . expression ;
2786- const expressionKind = expression . kind ;
2787- return expressionKind === SyntaxKind . SuperKeyword ;
2788- }
2789-
2790- return false ;
2791- }
2792-
27932785 function computeNewExpression ( node : NewExpression , subtreeFlags : TransformFlags ) {
27942786 let transformFlags = subtreeFlags ;
27952787 if ( node . typeArguments ) {
@@ -2884,7 +2876,7 @@ namespace ts {
28842876 }
28852877
28862878 node . transformFlags = transformFlags | TransformFlags . HasComputedFlags ;
2887- return transformFlags & ~ TransformFlags . NodeExcludes ;
2879+ return transformFlags & ~ TransformFlags . OuterExpressionExcludes ;
28882880 }
28892881
28902882 function computeClassDeclaration ( node : ClassDeclaration , subtreeFlags : TransformFlags ) {
@@ -3203,17 +3195,32 @@ namespace ts {
32033195
32043196 function computePropertyAccess ( node : PropertyAccessExpression , subtreeFlags : TransformFlags ) {
32053197 let transformFlags = subtreeFlags ;
3206- const expression = node . expression ;
3207- const expressionKind = expression . kind ;
32083198
32093199 // If a PropertyAccessExpression starts with a super keyword, then it is
32103200 // ES6 syntax, and requires a lexical `this` binding.
3211- if ( expressionKind === SyntaxKind . SuperKeyword ) {
3212- transformFlags |= TransformFlags . ContainsLexicalThis ;
3201+ if ( transformFlags & TransformFlags . Super ) {
3202+ transformFlags ^= TransformFlags . Super ;
3203+ transformFlags |= TransformFlags . ContainsSuper ;
32133204 }
32143205
32153206 node . transformFlags = transformFlags | TransformFlags . HasComputedFlags ;
3216- return transformFlags & ~ TransformFlags . NodeExcludes ;
3207+ return transformFlags & ~ TransformFlags . PropertyAccessExcludes ;
3208+ }
3209+
3210+ function computeElementAccess ( node : ElementAccessExpression , subtreeFlags : TransformFlags ) {
3211+ let transformFlags = subtreeFlags ;
3212+ const expression = node . expression ;
3213+ const expressionFlags = expression . transformFlags ; // We do not want to aggregate flags from the argument expression for super/this capturing
3214+
3215+ // If an ElementAccessExpression starts with a super keyword, then it is
3216+ // ES6 syntax, and requires a lexical `this` binding.
3217+ if ( expressionFlags & TransformFlags . Super ) {
3218+ transformFlags &= ~ TransformFlags . Super ;
3219+ transformFlags |= TransformFlags . ContainsSuper ;
3220+ }
3221+
3222+ node . transformFlags = transformFlags | TransformFlags . HasComputedFlags ;
3223+ return transformFlags & ~ TransformFlags . PropertyAccessExcludes ;
32173224 }
32183225
32193226 function computeVariableDeclaration ( node : VariableDeclaration , subtreeFlags : TransformFlags ) {
@@ -3333,6 +3340,13 @@ namespace ts {
33333340 transformFlags |= TransformFlags . AssertESNext | TransformFlags . AssertES2017 ;
33343341 break ;
33353342
3343+ case SyntaxKind . TypeAssertionExpression :
3344+ case SyntaxKind . AsExpression :
3345+ case SyntaxKind . PartiallyEmittedExpression :
3346+ // These nodes are TypeScript syntax.
3347+ transformFlags |= TransformFlags . AssertTypeScript ;
3348+ excludeFlags = TransformFlags . OuterExpressionExcludes ;
3349+ break ;
33363350 case SyntaxKind . PublicKeyword :
33373351 case SyntaxKind . PrivateKeyword :
33383352 case SyntaxKind . ProtectedKeyword :
@@ -3341,8 +3355,6 @@ namespace ts {
33413355 case SyntaxKind . ConstKeyword :
33423356 case SyntaxKind . EnumDeclaration :
33433357 case SyntaxKind . EnumMember :
3344- case SyntaxKind . TypeAssertionExpression :
3345- case SyntaxKind . AsExpression :
33463358 case SyntaxKind . NonNullExpression :
33473359 case SyntaxKind . ReadonlyKeyword :
33483360 // These nodes are TypeScript syntax.
@@ -3470,7 +3482,8 @@ namespace ts {
34703482
34713483 case SyntaxKind . SuperKeyword :
34723484 // This node is ES6 syntax.
3473- transformFlags |= TransformFlags . AssertES2015 ;
3485+ transformFlags |= TransformFlags . AssertES2015 | TransformFlags . Super ;
3486+ excludeFlags = TransformFlags . OuterExpressionExcludes ; // must be set to persist `Super`
34743487 break ;
34753488
34763489 case SyntaxKind . ThisKeyword :
@@ -3627,6 +3640,15 @@ namespace ts {
36273640 case SyntaxKind . ObjectBindingPattern :
36283641 case SyntaxKind . ArrayBindingPattern :
36293642 return TransformFlags . BindingPatternExcludes ;
3643+ case SyntaxKind . TypeAssertionExpression :
3644+ case SyntaxKind . AsExpression :
3645+ case SyntaxKind . PartiallyEmittedExpression :
3646+ case SyntaxKind . ParenthesizedExpression :
3647+ case SyntaxKind . SuperKeyword :
3648+ return TransformFlags . OuterExpressionExcludes ;
3649+ case SyntaxKind . PropertyAccessExpression :
3650+ case SyntaxKind . ElementAccessExpression :
3651+ return TransformFlags . PropertyAccessExcludes ;
36303652 default :
36313653 return TransformFlags . NodeExcludes ;
36323654 }
0 commit comments