@@ -1918,6 +1918,9 @@ namespace ts {
1918
1918
return bindParameter ( < ParameterDeclaration > node ) ;
1919
1919
case SyntaxKind . VariableDeclaration :
1920
1920
case SyntaxKind . BindingElement :
1921
+ if ( ( node as BindingElement ) . dotDotDotToken && node . parent . kind === SyntaxKind . ObjectBindingPattern ) {
1922
+ emitFlags |= NodeFlags . HasRestAttribute ;
1923
+ }
1921
1924
return bindVariableDeclarationOrBindingElement ( < VariableDeclaration | BindingElement > node ) ;
1922
1925
case SyntaxKind . PropertyDeclaration :
1923
1926
case SyntaxKind . PropertySignature :
@@ -1933,7 +1936,19 @@ namespace ts {
1933
1936
1934
1937
case SyntaxKind . SpreadAssignment :
1935
1938
case SyntaxKind . JsxSpreadAttribute :
1936
- emitFlags |= NodeFlags . HasSpreadAttribute ;
1939
+ let root = container ;
1940
+ let hasRest = false ;
1941
+ while ( root . parent ) {
1942
+ if ( root . kind === SyntaxKind . ObjectLiteralExpression &&
1943
+ root . parent . kind === SyntaxKind . BinaryExpression &&
1944
+ ( root . parent as BinaryExpression ) . operatorToken . kind === SyntaxKind . EqualsToken &&
1945
+ ( root . parent as BinaryExpression ) . left === root ) {
1946
+ hasRest = true ;
1947
+ break ;
1948
+ }
1949
+ root = root . parent ;
1950
+ }
1951
+ emitFlags |= hasRest ? NodeFlags . HasRestAttribute : NodeFlags . HasSpreadAttribute ;
1937
1952
return ;
1938
1953
1939
1954
case SyntaxKind . CallSignature :
@@ -2544,10 +2559,13 @@ namespace ts {
2544
2559
const operatorTokenKind = node . operatorToken . kind ;
2545
2560
const leftKind = node . left . kind ;
2546
2561
2547
- if ( operatorTokenKind === SyntaxKind . EqualsToken
2548
- && ( leftKind === SyntaxKind . ObjectLiteralExpression
2549
- || leftKind === SyntaxKind . ArrayLiteralExpression ) ) {
2550
- // Destructuring assignments are ES6 syntax.
2562
+ if ( operatorTokenKind === SyntaxKind . EqualsToken && leftKind === SyntaxKind . ObjectLiteralExpression ) {
2563
+ // Destructuring object assignments with are ES2015 syntax
2564
+ // and possibly ESNext if they contain rest
2565
+ transformFlags |= TransformFlags . AssertESNext | TransformFlags . AssertES2015 | TransformFlags . AssertDestructuringAssignment ;
2566
+ }
2567
+ else if ( operatorTokenKind === SyntaxKind . EqualsToken && leftKind === SyntaxKind . ArrayLiteralExpression ) {
2568
+ // Destructuring assignments are ES2015 syntax.
2551
2569
transformFlags |= TransformFlags . AssertES2015 | TransformFlags . AssertDestructuringAssignment ;
2552
2570
}
2553
2571
else if ( operatorTokenKind === SyntaxKind . AsteriskAsteriskToken
@@ -2581,6 +2599,11 @@ namespace ts {
2581
2599
transformFlags |= TransformFlags . AssertTypeScript | TransformFlags . ContainsParameterPropertyAssignments ;
2582
2600
}
2583
2601
2602
+ // parameters with object rest destructuring are ES Next syntax
2603
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
2604
+ transformFlags |= TransformFlags . AssertESNext ;
2605
+ }
2606
+
2584
2607
// If a parameter has an initializer, a binding pattern or a dotDotDot token, then
2585
2608
// it is ES6 syntax and its container must emit default value assignments or parameter destructuring downlevel.
2586
2609
if ( subtreeFlags & TransformFlags . ContainsBindingPattern || initializer || dotDotDotToken ) {
@@ -2814,6 +2837,11 @@ namespace ts {
2814
2837
transformFlags |= TransformFlags . AssertES2017 ;
2815
2838
}
2816
2839
2840
+ // function declarations with object rest destructuring are ES Next syntax
2841
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
2842
+ transformFlags |= TransformFlags . AssertESNext ;
2843
+ }
2844
+
2817
2845
// If a FunctionDeclaration's subtree has marked the container as needing to capture the
2818
2846
// lexical this, or the function contains parameters with initializers, then this node is
2819
2847
// ES6 syntax.
@@ -2851,6 +2879,12 @@ namespace ts {
2851
2879
transformFlags |= TransformFlags . AssertES2017 ;
2852
2880
}
2853
2881
2882
+ // function expressions with object rest destructuring are ES Next syntax
2883
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
2884
+ transformFlags |= TransformFlags . AssertESNext ;
2885
+ }
2886
+
2887
+
2854
2888
// If a FunctionExpression's subtree has marked the container as needing to capture the
2855
2889
// lexical this, or the function contains parameters with initializers, then this node is
2856
2890
// ES6 syntax.
@@ -2888,6 +2922,11 @@ namespace ts {
2888
2922
transformFlags |= TransformFlags . AssertES2017 ;
2889
2923
}
2890
2924
2925
+ // arrow functions with object rest destructuring are ES Next syntax
2926
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
2927
+ transformFlags |= TransformFlags . AssertESNext ;
2928
+ }
2929
+
2891
2930
// If an ArrowFunction contains a lexical this, its container must capture the lexical this.
2892
2931
if ( subtreeFlags & TransformFlags . ContainsLexicalThis ) {
2893
2932
transformFlags |= TransformFlags . ContainsCapturedLexicalThis ;
@@ -2916,8 +2955,13 @@ namespace ts {
2916
2955
let transformFlags = subtreeFlags ;
2917
2956
const nameKind = node . name . kind ;
2918
2957
2919
- // A VariableDeclaration with a binding pattern is ES6 syntax.
2920
- if ( nameKind === SyntaxKind . ObjectBindingPattern || nameKind === SyntaxKind . ArrayBindingPattern ) {
2958
+ // A VariableDeclaration with an object binding pattern is ES2015 syntax
2959
+ // and possibly ESNext syntax if it contains an object binding pattern
2960
+ if ( nameKind === SyntaxKind . ObjectBindingPattern ) {
2961
+ transformFlags |= TransformFlags . AssertESNext | TransformFlags . AssertES2015 | TransformFlags . ContainsBindingPattern ;
2962
+ }
2963
+ // A VariableDeclaration with an object binding pattern is ES2015 syntax.
2964
+ else if ( nameKind === SyntaxKind . ArrayBindingPattern ) {
2921
2965
transformFlags |= TransformFlags . AssertES2015 | TransformFlags . ContainsBindingPattern ;
2922
2966
}
2923
2967
@@ -3058,14 +3102,17 @@ namespace ts {
3058
3102
transformFlags |= TransformFlags . AssertJsx ;
3059
3103
break ;
3060
3104
3105
+ case SyntaxKind . ForOfStatement :
3106
+ // for-of might be ESNext if it has a rest destructuring
3107
+ transformFlags |= TransformFlags . AssertESNext ;
3108
+ // FALLTHROUGH
3061
3109
case SyntaxKind . NoSubstitutionTemplateLiteral :
3062
3110
case SyntaxKind . TemplateHead :
3063
3111
case SyntaxKind . TemplateMiddle :
3064
3112
case SyntaxKind . TemplateTail :
3065
3113
case SyntaxKind . TemplateExpression :
3066
3114
case SyntaxKind . TaggedTemplateExpression :
3067
3115
case SyntaxKind . ShorthandPropertyAssignment :
3068
- case SyntaxKind . ForOfStatement :
3069
3116
case SyntaxKind . StaticKeyword :
3070
3117
// These nodes are ES6 syntax.
3071
3118
transformFlags |= TransformFlags . AssertES2015 ;
@@ -3131,10 +3178,16 @@ namespace ts {
3131
3178
3132
3179
case SyntaxKind . SpreadElement :
3133
3180
case SyntaxKind . SpreadAssignment :
3134
- // This node is ES6 or ES future syntax, but is handled by a containing node.
3181
+ // This node is ES6 or ES next syntax, but is handled by a containing node.
3135
3182
transformFlags |= TransformFlags . ContainsSpreadExpression ;
3136
3183
break ;
3137
3184
3185
+ case SyntaxKind . BindingElement :
3186
+ if ( ( node as BindingElement ) . dotDotDotToken ) {
3187
+ // this node is ES2015 or ES next syntax, but is handled by a containing node.
3188
+ transformFlags |= TransformFlags . ContainsSpreadExpression ;
3189
+ }
3190
+
3138
3191
case SyntaxKind . SuperKeyword :
3139
3192
// This node is ES6 syntax.
3140
3193
transformFlags |= TransformFlags . AssertES2015 ;
@@ -3147,8 +3200,13 @@ namespace ts {
3147
3200
3148
3201
case SyntaxKind . ObjectBindingPattern :
3149
3202
case SyntaxKind . ArrayBindingPattern :
3150
- // These nodes are ES6 syntax.
3151
- transformFlags |= TransformFlags . AssertES2015 | TransformFlags . ContainsBindingPattern ;
3203
+ // These nodes are ES2015 or ES Next syntax.
3204
+ if ( subtreeFlags & TransformFlags . ContainsSpreadExpression ) {
3205
+ transformFlags |= TransformFlags . AssertESNext | TransformFlags . ContainsBindingPattern ;
3206
+ }
3207
+ else {
3208
+ transformFlags |= TransformFlags . AssertES2015 | TransformFlags . ContainsBindingPattern ;
3209
+ }
3152
3210
break ;
3153
3211
3154
3212
case SyntaxKind . Decorator :
0 commit comments