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"`,
+});
+