@@ -1139,8 +1139,8 @@ namespace ts {
1139
1139
}
1140
1140
else if ( node . kind === SyntaxKind . ArrayLiteralExpression ) {
1141
1141
for ( const e of ( < ArrayLiteralExpression > node ) . elements ) {
1142
- if ( e . kind === SyntaxKind . SpreadElementExpression ) {
1143
- bindAssignmentTargetFlow ( ( < SpreadElementExpression > e ) . expression ) ;
1142
+ if ( e . kind === SyntaxKind . SpreadElement ) {
1143
+ bindAssignmentTargetFlow ( ( < SpreadElement > e ) . expression ) ;
1144
1144
}
1145
1145
else {
1146
1146
bindDestructuringTargetFlow ( e ) ;
@@ -1155,6 +1155,9 @@ namespace ts {
1155
1155
else if ( p . kind === SyntaxKind . ShorthandPropertyAssignment ) {
1156
1156
bindAssignmentTargetFlow ( ( < ShorthandPropertyAssignment > p ) . name ) ;
1157
1157
}
1158
+ else if ( p . kind === SyntaxKind . SpreadAssignment ) {
1159
+ bindAssignmentTargetFlow ( ( < SpreadAssignment > p ) . expression ) ;
1160
+ }
1158
1161
}
1159
1162
}
1160
1163
}
@@ -1918,6 +1921,9 @@ namespace ts {
1918
1921
return bindParameter ( < ParameterDeclaration > node ) ;
1919
1922
case SyntaxKind . VariableDeclaration :
1920
1923
case SyntaxKind . BindingElement :
1924
+ if ( ( node as BindingElement ) . dotDotDotToken && node . parent . kind === SyntaxKind . ObjectBindingPattern ) {
1925
+ emitFlags |= NodeFlags . HasRestAttribute ;
1926
+ }
1921
1927
return bindVariableDeclarationOrBindingElement ( < VariableDeclaration | BindingElement > node ) ;
1922
1928
case SyntaxKind . PropertyDeclaration :
1923
1929
case SyntaxKind . PropertySignature :
@@ -1931,8 +1937,21 @@ namespace ts {
1931
1937
case SyntaxKind . EnumMember :
1932
1938
return bindPropertyOrMethodOrAccessor ( < Declaration > node , SymbolFlags . EnumMember , SymbolFlags . EnumMemberExcludes ) ;
1933
1939
1940
+ case SyntaxKind . SpreadAssignment :
1934
1941
case SyntaxKind . JsxSpreadAttribute :
1935
- emitFlags |= NodeFlags . HasJsxSpreadAttributes ;
1942
+ let root = container ;
1943
+ let hasRest = false ;
1944
+ while ( root . parent ) {
1945
+ if ( root . kind === SyntaxKind . ObjectLiteralExpression &&
1946
+ root . parent . kind === SyntaxKind . BinaryExpression &&
1947
+ ( root . parent as BinaryExpression ) . operatorToken . kind === SyntaxKind . EqualsToken &&
1948
+ ( root . parent as BinaryExpression ) . left === root ) {
1949
+ hasRest = true ;
1950
+ break ;
1951
+ }
1952
+ root = root . parent ;
1953
+ }
1954
+ emitFlags |= hasRest ? NodeFlags . HasRestAttribute : NodeFlags . HasSpreadAttribute ;
1936
1955
return ;
1937
1956
1938
1957
case SyntaxKind . CallSignature :
@@ -2498,9 +2517,9 @@ namespace ts {
2498
2517
transformFlags |= TransformFlags . AssertTypeScript ;
2499
2518
}
2500
2519
2501
- if ( subtreeFlags & TransformFlags . ContainsSpreadElementExpression
2520
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression
2502
2521
|| isSuperOrSuperProperty ( expression , expressionKind ) ) {
2503
- // If the this node contains a SpreadElementExpression , or is a super call, then it is an ES6
2522
+ // If the this node contains a SpreadExpression , or is a super call, then it is an ES6
2504
2523
// node.
2505
2524
transformFlags |= TransformFlags . AssertES2015 ;
2506
2525
}
@@ -2529,7 +2548,7 @@ namespace ts {
2529
2548
if ( node . typeArguments ) {
2530
2549
transformFlags |= TransformFlags . AssertTypeScript ;
2531
2550
}
2532
- if ( subtreeFlags & TransformFlags . ContainsSpreadElementExpression ) {
2551
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
2533
2552
// If the this node contains a SpreadElementExpression then it is an ES6
2534
2553
// node.
2535
2554
transformFlags |= TransformFlags . AssertES2015 ;
@@ -2544,10 +2563,13 @@ namespace ts {
2544
2563
const operatorTokenKind = node . operatorToken . kind ;
2545
2564
const leftKind = node . left . kind ;
2546
2565
2547
- if ( operatorTokenKind === SyntaxKind . EqualsToken
2548
- && ( leftKind === SyntaxKind . ObjectLiteralExpression
2549
- || leftKind === SyntaxKind . ArrayLiteralExpression ) ) {
2550
- // Destructuring assignments are ES6 syntax.
2566
+ if ( operatorTokenKind === SyntaxKind . EqualsToken && leftKind === SyntaxKind . ObjectLiteralExpression ) {
2567
+ // Destructuring object assignments with are ES2015 syntax
2568
+ // and possibly ESNext if they contain rest
2569
+ transformFlags |= TransformFlags . AssertESNext | TransformFlags . AssertES2015 | TransformFlags . AssertDestructuringAssignment ;
2570
+ }
2571
+ else if ( operatorTokenKind === SyntaxKind . EqualsToken && leftKind === SyntaxKind . ArrayLiteralExpression ) {
2572
+ // Destructuring assignments are ES2015 syntax.
2551
2573
transformFlags |= TransformFlags . AssertES2015 | TransformFlags . AssertDestructuringAssignment ;
2552
2574
}
2553
2575
else if ( operatorTokenKind === SyntaxKind . AsteriskAsteriskToken
@@ -2581,6 +2603,11 @@ namespace ts {
2581
2603
transformFlags |= TransformFlags . AssertTypeScript | TransformFlags . ContainsParameterPropertyAssignments ;
2582
2604
}
2583
2605
2606
+ // parameters with object rest destructuring are ES Next syntax
2607
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
2608
+ transformFlags |= TransformFlags . AssertESNext ;
2609
+ }
2610
+
2584
2611
// If a parameter has an initializer, a binding pattern or a dotDotDot token, then
2585
2612
// it is ES6 syntax and its container must emit default value assignments or parameter destructuring downlevel.
2586
2613
if ( subtreeFlags & TransformFlags . ContainsBindingPattern || initializer || dotDotDotToken ) {
@@ -2814,6 +2841,11 @@ namespace ts {
2814
2841
transformFlags |= TransformFlags . AssertES2017 ;
2815
2842
}
2816
2843
2844
+ // function declarations with object rest destructuring are ES Next syntax
2845
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
2846
+ transformFlags |= TransformFlags . AssertESNext ;
2847
+ }
2848
+
2817
2849
// If a FunctionDeclaration's subtree has marked the container as needing to capture the
2818
2850
// lexical this, or the function contains parameters with initializers, then this node is
2819
2851
// ES6 syntax.
@@ -2851,6 +2883,12 @@ namespace ts {
2851
2883
transformFlags |= TransformFlags . AssertES2017 ;
2852
2884
}
2853
2885
2886
+ // function expressions with object rest destructuring are ES Next syntax
2887
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
2888
+ transformFlags |= TransformFlags . AssertESNext ;
2889
+ }
2890
+
2891
+
2854
2892
// If a FunctionExpression's subtree has marked the container as needing to capture the
2855
2893
// lexical this, or the function contains parameters with initializers, then this node is
2856
2894
// ES6 syntax.
@@ -2888,6 +2926,11 @@ namespace ts {
2888
2926
transformFlags |= TransformFlags . AssertES2017 ;
2889
2927
}
2890
2928
2929
+ // arrow functions with object rest destructuring are ES Next syntax
2930
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
2931
+ transformFlags |= TransformFlags . AssertESNext ;
2932
+ }
2933
+
2891
2934
// If an ArrowFunction contains a lexical this, its container must capture the lexical this.
2892
2935
if ( subtreeFlags & TransformFlags . ContainsLexicalThis ) {
2893
2936
transformFlags |= TransformFlags . ContainsCapturedLexicalThis ;
@@ -2916,8 +2959,13 @@ namespace ts {
2916
2959
let transformFlags = subtreeFlags ;
2917
2960
const nameKind = node . name . kind ;
2918
2961
2919
- // A VariableDeclaration with a binding pattern is ES6 syntax.
2920
- if ( nameKind === SyntaxKind . ObjectBindingPattern || nameKind === SyntaxKind . ArrayBindingPattern ) {
2962
+ // A VariableDeclaration with an object binding pattern is ES2015 syntax
2963
+ // and possibly ESNext syntax if it contains an object binding pattern
2964
+ if ( nameKind === SyntaxKind . ObjectBindingPattern ) {
2965
+ transformFlags |= TransformFlags . AssertESNext | TransformFlags . AssertES2015 | TransformFlags . ContainsBindingPattern ;
2966
+ }
2967
+ // A VariableDeclaration with an object binding pattern is ES2015 syntax.
2968
+ else if ( nameKind === SyntaxKind . ArrayBindingPattern ) {
2921
2969
transformFlags |= TransformFlags . AssertES2015 | TransformFlags . ContainsBindingPattern ;
2922
2970
}
2923
2971
@@ -3058,14 +3106,17 @@ namespace ts {
3058
3106
transformFlags |= TransformFlags . AssertJsx ;
3059
3107
break ;
3060
3108
3109
+ case SyntaxKind . ForOfStatement :
3110
+ // for-of might be ESNext if it has a rest destructuring
3111
+ transformFlags |= TransformFlags . AssertESNext ;
3112
+ // FALLTHROUGH
3061
3113
case SyntaxKind . NoSubstitutionTemplateLiteral :
3062
3114
case SyntaxKind . TemplateHead :
3063
3115
case SyntaxKind . TemplateMiddle :
3064
3116
case SyntaxKind . TemplateTail :
3065
3117
case SyntaxKind . TemplateExpression :
3066
3118
case SyntaxKind . TaggedTemplateExpression :
3067
3119
case SyntaxKind . ShorthandPropertyAssignment :
3068
- case SyntaxKind . ForOfStatement :
3069
3120
case SyntaxKind . StaticKeyword :
3070
3121
// These nodes are ES6 syntax.
3071
3122
transformFlags |= TransformFlags . AssertES2015 ;
@@ -3130,11 +3181,18 @@ namespace ts {
3130
3181
}
3131
3182
break ;
3132
3183
3133
- case SyntaxKind . SpreadElementExpression :
3134
- // This node is ES6 syntax, but is handled by a containing node.
3135
- transformFlags |= TransformFlags . ContainsSpreadElementExpression ;
3184
+ case SyntaxKind . SpreadElement :
3185
+ case SyntaxKind . SpreadAssignment :
3186
+ // This node is ES6 or ES next syntax, but is handled by a containing node.
3187
+ transformFlags |= TransformFlags . ContainsSpreadExpression ;
3136
3188
break ;
3137
3189
3190
+ case SyntaxKind . BindingElement :
3191
+ if ( ( node as BindingElement ) . dotDotDotToken ) {
3192
+ // this node is ES2015 or ES next syntax, but is handled by a containing node.
3193
+ transformFlags |= TransformFlags . ContainsSpreadExpression ;
3194
+ }
3195
+
3138
3196
case SyntaxKind . SuperKeyword :
3139
3197
// This node is ES6 syntax.
3140
3198
transformFlags |= TransformFlags . AssertES2015 ;
@@ -3147,8 +3205,13 @@ namespace ts {
3147
3205
3148
3206
case SyntaxKind . ObjectBindingPattern :
3149
3207
case SyntaxKind . ArrayBindingPattern :
3150
- // These nodes are ES6 syntax.
3151
- transformFlags |= TransformFlags . AssertES2015 | TransformFlags . ContainsBindingPattern ;
3208
+ // These nodes are ES2015 or ES Next syntax.
3209
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
3210
+ transformFlags |= TransformFlags . AssertESNext | TransformFlags . ContainsBindingPattern ;
3211
+ }
3212
+ else {
3213
+ transformFlags |= TransformFlags . AssertES2015 | TransformFlags . ContainsBindingPattern ;
3214
+ }
3152
3215
break ;
3153
3216
3154
3217
case SyntaxKind . Decorator :
@@ -3170,13 +3233,19 @@ namespace ts {
3170
3233
transformFlags |= TransformFlags . ContainsLexicalThis ;
3171
3234
}
3172
3235
3236
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
3237
+ // If an ObjectLiteralExpression contains a spread element, then it
3238
+ // is an ES next node.
3239
+ transformFlags |= TransformFlags . AssertESNext ;
3240
+ }
3241
+
3173
3242
break ;
3174
3243
3175
3244
case SyntaxKind . ArrayLiteralExpression :
3176
3245
case SyntaxKind . NewExpression :
3177
3246
excludeFlags = TransformFlags . ArrayLiteralOrCallOrNewExcludes ;
3178
- if ( subtreeFlags & TransformFlags . ContainsSpreadElementExpression ) {
3179
- // If the this node contains a SpreadElementExpression , then it is an ES6
3247
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
3248
+ // If the this node contains a SpreadExpression , then it is an ES6
3180
3249
// node.
3181
3250
transformFlags |= TransformFlags . AssertES2015 ;
3182
3251
}
0 commit comments