diff --git a/src/services/refactors/convertStringOrTemplateLiteral.ts b/src/services/refactors/convertStringOrTemplateLiteral.ts index efd92d5d403..36468a69cc7 100644 --- a/src/services/refactors/convertStringOrTemplateLiteral.ts +++ b/src/services/refactors/convertStringOrTemplateLiteral.ts @@ -33,7 +33,16 @@ namespace ts.refactor.convertStringOrTemplateLiteral { function getNodeOrParentOfParentheses(file: SourceFile, startPosition: number) { const node = getTokenAtPosition(file, startPosition); - if (isParenthesizedExpression(node.parent) && isBinaryExpression(node.parent.parent)) return node.parent.parent; + const nestedBinary = getParentBinaryExpression(node); + const isNonStringBinary = !isStringConcatenationValid(nestedBinary); + + if ( + isNonStringBinary && + isParenthesizedExpression(nestedBinary.parent) && + isBinaryExpression(nestedBinary.parent.parent) + ) { + return nestedBinary.parent.parent; + } return node; } diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateParenthFromExpr.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateParenthFromExpr.ts new file mode 100644 index 00000000000..f79929e9cbe --- /dev/null +++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateParenthFromExpr.ts @@ -0,0 +1,13 @@ +/// + +//// const foo = "foobar is " + (/*x*/42/*y*/ + 6) + " years old" + +goTo.select("x", "y"); +edit.applyRefactor({ + refactorName: "Convert string concatenation or template literal", + actionName: "Convert to template literal", + actionDescription: "Convert to template literal", + newContent: +`const foo = \`foobar is \${42 + 6} years old\``, +}); + diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateExprFromBrace.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateParenthFromOpening.ts similarity index 100% rename from tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateExprFromBrace.ts rename to tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateParenthFromOpening.ts diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateParenthFromStr.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateParenthFromStr.ts new file mode 100644 index 00000000000..47a34a31309 --- /dev/null +++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateParenthFromStr.ts @@ -0,0 +1,13 @@ +/// + +//// const foo = "foobar is " + (/*x*/42/*y*/ + 6 + "str") + " years old" + +goTo.select("x", "y"); +edit.applyRefactor({ + refactorName: "Convert string concatenation or template literal", + actionName: "Convert to template literal", + actionDescription: "Convert to template literal", + newContent: +`const foo = "foobar is " + (\`\${42 + 6}str\`) + " years old"`, +}); +