@@ -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
}
@@ -1916,6 +1919,9 @@ namespace ts {
1916
1919
return bindParameter ( < ParameterDeclaration > node ) ;
1917
1920
case SyntaxKind . VariableDeclaration :
1918
1921
case SyntaxKind . BindingElement :
1922
+ if ( ( node as BindingElement ) . dotDotDotToken && node . parent . kind === SyntaxKind . ObjectBindingPattern ) {
1923
+ emitFlags |= NodeFlags . HasRestAttribute ;
1924
+ }
1919
1925
return bindVariableDeclarationOrBindingElement ( < VariableDeclaration | BindingElement > node ) ;
1920
1926
case SyntaxKind . PropertyDeclaration :
1921
1927
case SyntaxKind . PropertySignature :
@@ -1929,8 +1935,21 @@ namespace ts {
1929
1935
case SyntaxKind . EnumMember :
1930
1936
return bindPropertyOrMethodOrAccessor ( < Declaration > node , SymbolFlags . EnumMember , SymbolFlags . EnumMemberExcludes ) ;
1931
1937
1938
+ case SyntaxKind . SpreadAssignment :
1932
1939
case SyntaxKind . JsxSpreadAttribute :
1933
- emitFlags |= NodeFlags . HasJsxSpreadAttributes ;
1940
+ let root = container ;
1941
+ let hasRest = false ;
1942
+ while ( root . parent ) {
1943
+ if ( root . kind === SyntaxKind . ObjectLiteralExpression &&
1944
+ root . parent . kind === SyntaxKind . BinaryExpression &&
1945
+ ( root . parent as BinaryExpression ) . operatorToken . kind === SyntaxKind . EqualsToken &&
1946
+ ( root . parent as BinaryExpression ) . left === root ) {
1947
+ hasRest = true ;
1948
+ break ;
1949
+ }
1950
+ root = root . parent ;
1951
+ }
1952
+ emitFlags |= hasRest ? NodeFlags . HasRestAttribute : NodeFlags . HasSpreadAttribute ;
1934
1953
return ;
1935
1954
1936
1955
case SyntaxKind . CallSignature :
@@ -2495,9 +2514,9 @@ namespace ts {
2495
2514
transformFlags |= TransformFlags . AssertTypeScript ;
2496
2515
}
2497
2516
2498
- if ( subtreeFlags & TransformFlags . ContainsSpreadElementExpression
2517
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression
2499
2518
|| isSuperOrSuperProperty ( expression , expressionKind ) ) {
2500
- // If the this node contains a SpreadElementExpression , or is a super call, then it is an ES6
2519
+ // If the this node contains a SpreadExpression , or is a super call, then it is an ES6
2501
2520
// node.
2502
2521
transformFlags |= TransformFlags . AssertES2015 ;
2503
2522
}
@@ -2526,7 +2545,7 @@ namespace ts {
2526
2545
if ( node . typeArguments ) {
2527
2546
transformFlags |= TransformFlags . AssertTypeScript ;
2528
2547
}
2529
- if ( subtreeFlags & TransformFlags . ContainsSpreadElementExpression ) {
2548
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
2530
2549
// If the this node contains a SpreadElementExpression then it is an ES6
2531
2550
// node.
2532
2551
transformFlags |= TransformFlags . AssertES2015 ;
@@ -2541,10 +2560,13 @@ namespace ts {
2541
2560
const operatorTokenKind = node . operatorToken . kind ;
2542
2561
const leftKind = node . left . kind ;
2543
2562
2544
- if ( operatorTokenKind === SyntaxKind . EqualsToken
2545
- && ( leftKind === SyntaxKind . ObjectLiteralExpression
2546
- || leftKind === SyntaxKind . ArrayLiteralExpression ) ) {
2547
- // Destructuring assignments are ES6 syntax.
2563
+ if ( operatorTokenKind === SyntaxKind . EqualsToken && leftKind === SyntaxKind . ObjectLiteralExpression ) {
2564
+ // Destructuring object assignments with are ES2015 syntax
2565
+ // and possibly ESNext if they contain rest
2566
+ transformFlags |= TransformFlags . AssertESNext | TransformFlags . AssertES2015 | TransformFlags . AssertDestructuringAssignment ;
2567
+ }
2568
+ else if ( operatorTokenKind === SyntaxKind . EqualsToken && leftKind === SyntaxKind . ArrayLiteralExpression ) {
2569
+ // Destructuring assignments are ES2015 syntax.
2548
2570
transformFlags |= TransformFlags . AssertES2015 | TransformFlags . AssertDestructuringAssignment ;
2549
2571
}
2550
2572
else if ( operatorTokenKind === SyntaxKind . AsteriskAsteriskToken
@@ -2578,6 +2600,11 @@ namespace ts {
2578
2600
transformFlags |= TransformFlags . AssertTypeScript | TransformFlags . ContainsParameterPropertyAssignments ;
2579
2601
}
2580
2602
2603
+ // parameters with object rest destructuring are ES Next syntax
2604
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
2605
+ transformFlags |= TransformFlags . AssertESNext ;
2606
+ }
2607
+
2581
2608
// If a parameter has an initializer, a binding pattern or a dotDotDot token, then
2582
2609
// it is ES6 syntax and its container must emit default value assignments or parameter destructuring downlevel.
2583
2610
if ( subtreeFlags & TransformFlags . ContainsBindingPattern || initializer || dotDotDotToken ) {
@@ -2811,6 +2838,11 @@ namespace ts {
2811
2838
transformFlags |= TransformFlags . AssertES2017 ;
2812
2839
}
2813
2840
2841
+ // function declarations with object rest destructuring are ES Next syntax
2842
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
2843
+ transformFlags |= TransformFlags . AssertESNext ;
2844
+ }
2845
+
2814
2846
// If a FunctionDeclaration's subtree has marked the container as needing to capture the
2815
2847
// lexical this, or the function contains parameters with initializers, then this node is
2816
2848
// ES6 syntax.
@@ -2848,6 +2880,12 @@ namespace ts {
2848
2880
transformFlags |= TransformFlags . AssertES2017 ;
2849
2881
}
2850
2882
2883
+ // function expressions with object rest destructuring are ES Next syntax
2884
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
2885
+ transformFlags |= TransformFlags . AssertESNext ;
2886
+ }
2887
+
2888
+
2851
2889
// If a FunctionExpression's subtree has marked the container as needing to capture the
2852
2890
// lexical this, or the function contains parameters with initializers, then this node is
2853
2891
// ES6 syntax.
@@ -2885,6 +2923,11 @@ namespace ts {
2885
2923
transformFlags |= TransformFlags . AssertES2017 ;
2886
2924
}
2887
2925
2926
+ // arrow functions with object rest destructuring are ES Next syntax
2927
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
2928
+ transformFlags |= TransformFlags . AssertESNext ;
2929
+ }
2930
+
2888
2931
// If an ArrowFunction contains a lexical this, its container must capture the lexical this.
2889
2932
if ( subtreeFlags & TransformFlags . ContainsLexicalThis ) {
2890
2933
transformFlags |= TransformFlags . ContainsCapturedLexicalThis ;
@@ -2913,8 +2956,13 @@ namespace ts {
2913
2956
let transformFlags = subtreeFlags ;
2914
2957
const nameKind = node . name . kind ;
2915
2958
2916
- // A VariableDeclaration with a binding pattern is ES6 syntax.
2917
- if ( nameKind === SyntaxKind . ObjectBindingPattern || nameKind === SyntaxKind . ArrayBindingPattern ) {
2959
+ // A VariableDeclaration with an object binding pattern is ES2015 syntax
2960
+ // and possibly ESNext syntax if it contains an object binding pattern
2961
+ if ( nameKind === SyntaxKind . ObjectBindingPattern ) {
2962
+ transformFlags |= TransformFlags . AssertESNext | TransformFlags . AssertES2015 | TransformFlags . ContainsBindingPattern ;
2963
+ }
2964
+ // A VariableDeclaration with an object binding pattern is ES2015 syntax.
2965
+ else if ( nameKind === SyntaxKind . ArrayBindingPattern ) {
2918
2966
transformFlags |= TransformFlags . AssertES2015 | TransformFlags . ContainsBindingPattern ;
2919
2967
}
2920
2968
@@ -3055,14 +3103,17 @@ namespace ts {
3055
3103
transformFlags |= TransformFlags . AssertJsx ;
3056
3104
break ;
3057
3105
3106
+ case SyntaxKind . ForOfStatement :
3107
+ // for-of might be ESNext if it has a rest destructuring
3108
+ transformFlags |= TransformFlags . AssertESNext ;
3109
+ // FALLTHROUGH
3058
3110
case SyntaxKind . NoSubstitutionTemplateLiteral :
3059
3111
case SyntaxKind . TemplateHead :
3060
3112
case SyntaxKind . TemplateMiddle :
3061
3113
case SyntaxKind . TemplateTail :
3062
3114
case SyntaxKind . TemplateExpression :
3063
3115
case SyntaxKind . TaggedTemplateExpression :
3064
3116
case SyntaxKind . ShorthandPropertyAssignment :
3065
- case SyntaxKind . ForOfStatement :
3066
3117
case SyntaxKind . StaticKeyword :
3067
3118
// These nodes are ES6 syntax.
3068
3119
transformFlags |= TransformFlags . AssertES2015 ;
@@ -3126,11 +3177,18 @@ namespace ts {
3126
3177
}
3127
3178
break ;
3128
3179
3129
- case SyntaxKind . SpreadElementExpression :
3130
- // This node is ES6 syntax, but is handled by a containing node.
3131
- transformFlags |= TransformFlags . ContainsSpreadElementExpression ;
3180
+ case SyntaxKind . SpreadElement :
3181
+ case SyntaxKind . SpreadAssignment :
3182
+ // This node is ES6 or ES next syntax, but is handled by a containing node.
3183
+ transformFlags |= TransformFlags . ContainsSpreadExpression ;
3132
3184
break ;
3133
3185
3186
+ case SyntaxKind . BindingElement :
3187
+ if ( ( node as BindingElement ) . dotDotDotToken ) {
3188
+ // this node is ES2015 or ES next syntax, but is handled by a containing node.
3189
+ transformFlags |= TransformFlags . ContainsSpreadExpression ;
3190
+ }
3191
+
3134
3192
case SyntaxKind . SuperKeyword :
3135
3193
// This node is ES6 syntax.
3136
3194
transformFlags |= TransformFlags . AssertES2015 ;
@@ -3143,8 +3201,13 @@ namespace ts {
3143
3201
3144
3202
case SyntaxKind . ObjectBindingPattern :
3145
3203
case SyntaxKind . ArrayBindingPattern :
3146
- // These nodes are ES6 syntax.
3147
- transformFlags |= TransformFlags . AssertES2015 | TransformFlags . ContainsBindingPattern ;
3204
+ // These nodes are ES2015 or ES Next syntax.
3205
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
3206
+ transformFlags |= TransformFlags . AssertESNext | TransformFlags . ContainsBindingPattern ;
3207
+ }
3208
+ else {
3209
+ transformFlags |= TransformFlags . AssertES2015 | TransformFlags . ContainsBindingPattern ;
3210
+ }
3148
3211
break ;
3149
3212
3150
3213
case SyntaxKind . Decorator :
@@ -3166,13 +3229,19 @@ namespace ts {
3166
3229
transformFlags |= TransformFlags . ContainsLexicalThis ;
3167
3230
}
3168
3231
3232
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
3233
+ // If an ObjectLiteralExpression contains a spread element, then it
3234
+ // is an ES next node.
3235
+ transformFlags |= TransformFlags . AssertESNext ;
3236
+ }
3237
+
3169
3238
break ;
3170
3239
3171
3240
case SyntaxKind . ArrayLiteralExpression :
3172
3241
case SyntaxKind . NewExpression :
3173
3242
excludeFlags = TransformFlags . ArrayLiteralOrCallOrNewExcludes ;
3174
- if ( subtreeFlags & TransformFlags . ContainsSpreadElementExpression ) {
3175
- // If the this node contains a SpreadElementExpression , then it is an ES6
3243
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
3244
+ // If the this node contains a SpreadExpression , then it is an ES6
3176
3245
// node.
3177
3246
transformFlags |= TransformFlags . AssertES2015 ;
3178
3247
}
0 commit comments