diff --git a/src/services/refactors/convertStringOrTemplateLiteral.ts b/src/services/refactors/convertStringOrTemplateLiteral.ts index 36468a69cc7..45b8665d308 100644 --- a/src/services/refactors/convertStringOrTemplateLiteral.ts +++ b/src/services/refactors/convertStringOrTemplateLiteral.ts @@ -79,8 +79,8 @@ namespace ts.refactor.convertStringOrTemplateLiteral { if (head.text.length !== 0) arrayOfNodes.unshift(createStringLiteral(head.text)); - const binaryExpression = arrayToTree(arrayOfNodes); - return textChanges.ChangeTracker.with(context, t => t.replaceNode(context.file, templateLiteral, binaryExpression)); + const singleExpressionOrBinary = makeSingleExpressionOrBinary(arrayOfNodes); + return textChanges.ChangeTracker.with(context, t => t.replaceNode(context.file, templateLiteral, singleExpressionOrBinary)); } else { const stringLiteral = createStringLiteral(templateLiteral.text); @@ -105,20 +105,24 @@ namespace ts.refactor.convertStringOrTemplateLiteral { return expr; } - function arrayToTree(nodes: ReadonlyArray, accumulator?: BinaryExpression): BinaryExpression { - if (nodes.length === 0) return accumulator!; - - if (!accumulator) { + function makeSingleExpressionOrBinary(nodes: ReadonlyArray): Expression { + if (nodes.length > 1) { const left = nodes[0]; const right = nodes[1]; const binary = createBinary(left, SyntaxKind.PlusToken, right); - return arrayToTree(nodes.slice(2), binary); + return arrayToTree(nodes, 2, binary); } - const right = nodes[0]; + return nodes[0]; + } + + function arrayToTree(nodes: ReadonlyArray, index: number, accumulator: BinaryExpression): Expression { + if (nodes.length === index) return accumulator; + + const right = nodes[index]; const binary = createBinary(accumulator, SyntaxKind.PlusToken, right); - return arrayToTree(nodes.slice(1), binary); + return arrayToTree(nodes, index + 1, binary); } function isStringConcatenationValid(node: Node): boolean { diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringOnlyExpr.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringOnlyExpr.ts new file mode 100644 index 00000000000..86889395b7d --- /dev/null +++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringOnlyExpr.ts @@ -0,0 +1,13 @@ +/// + +//// const foo = `/*x*/$/*y*/{42}` + +goTo.select("x", "y"); +edit.applyRefactor({ + refactorName: "Convert string concatenation or template literal", + actionName: "Convert to string concatenation", + actionDescription: "Convert to string concatenation", + newContent: +`const foo = 42`, +}); +