From 63cf58bd09289fd4be743fc4267c839f9abf8d9e Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Tue, 22 Mar 2016 16:49:16 -0700 Subject: [PATCH] Fix extra slice in array with spread --- src/compiler/transformers/es6.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/compiler/transformers/es6.ts b/src/compiler/transformers/es6.ts index b53b3602556..84213239371 100644 --- a/src/compiler/transformers/es6.ts +++ b/src/compiler/transformers/es6.ts @@ -1467,7 +1467,7 @@ namespace ts { return createFunctionApply( visitNode(target, visitor, isExpression), visitNode(thisArg, visitor, isExpression), - transformAndSpreadElements(node.arguments, /*needsUniqueCopy*/ false, /*multiLine*/ false) + transformAndSpreadElements(node.arguments, /*needsUniqueCopy*/ false, /*multiLine*/ false, /*hasTrailingComma*/ false) ); } else { @@ -1510,7 +1510,7 @@ namespace ts { createFunctionApply( visitNode(target, visitor, isExpression), thisArg, - transformAndSpreadElements(createNodeArray([createVoidZero(), ...node.arguments]), /*needsUniqueCopy*/ false, /*multiLine*/ false) + transformAndSpreadElements(createNodeArray([createVoidZero(), ...node.arguments]), /*needsUniqueCopy*/ false, /*multiLine*/ false, /*hasTrailingComma*/ false) ), [] ); @@ -1523,7 +1523,7 @@ namespace ts { * @param needsUniqueCopy A value indicating whether to ensure that the result is a fresh array. * @param multiLine A value indicating whether the result should be emitted on multiple lines. */ - function transformAndSpreadElements(elements: NodeArray, needsUniqueCopy: boolean, multiLine: boolean, hasTrailingComma?: boolean): Expression { + function transformAndSpreadElements(elements: NodeArray, needsUniqueCopy: boolean, multiLine: boolean, hasTrailingComma: boolean): Expression { // [source] // [a, ...b, c] // @@ -1540,7 +1540,8 @@ namespace ts { ); if (segments.length === 1) { - return needsUniqueCopy && isSpreadElementExpression(elements[0]) + const firstElement = elements[0]; + return needsUniqueCopy && isSpreadElementExpression(firstElement) && firstElement.expression.kind !== SyntaxKind.ArrayLiteralExpression ? createArraySlice(segments[0]) : segments[0]; }