diff --git a/src/services/refactors/convertStringOrTemplateLiteral.ts b/src/services/refactors/convertStringOrTemplateLiteral.ts
index 80d5fac3708..75e38ff6d02 100644
--- a/src/services/refactors/convertStringOrTemplateLiteral.ts
+++ b/src/services/refactors/convertStringOrTemplateLiteral.ts
@@ -124,10 +124,10 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
return { nodes: [node], containsString: false, areOperatorsValid: true };
}
- const nodeOperatorValid = node.operatorToken.kind === SyntaxKind.PlusToken;
- const isPlus = leftOperatorValid && nodeOperatorValid && rightOperatorValid;
+ const currentOperatorValid = node.operatorToken.kind === SyntaxKind.PlusToken;
+ const areOperatorsValid = leftOperatorValid && currentOperatorValid && rightOperatorValid;
- return { nodes: leftNodes.concat(rightNodes), containsString: true, areOperatorsValid: isPlus };
+ return { nodes: leftNodes.concat(rightNodes), containsString: true, areOperatorsValid };
}
return { nodes: [node as Expression], containsString: isStringLiteral(node), areOperatorsValid: true };
@@ -179,10 +179,10 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
const octalToUnicode = (_match: string, grp: string) => String.fromCharCode(parseInt(grp, 8));
function decodeRawString(content: string) {
- const outerQuotes = /"((.|\s)*)"/;
- const unicodeEscape = /\\u([\d\w]+)/gi;
- const unicodeEscapeWithBraces = /\\u\{([\d\w]+\})/gi;
- const hexEscape = /\\x([\d\w]+)/gi;
+ const outerQuotes = /["']((.|\s)*)["']/;
+ const unicodeEscape = /\\u(\w+)/gi;
+ const unicodeEscapeWithBraces = /\\u\{(\w+)\}/gi;
+ const hexEscape = /\\x(\w+)/gi;
const octalEscape = /\\([0-7]+)/g;
return content.replace(outerQuotes, (_match, grp) => grp)
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringNestedInner.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringNestedInner.ts
index a094d5847c4..710d0f97489 100644
--- a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringNestedInner.ts
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringNestedInner.ts
@@ -1,7 +1,7 @@
///
//// const age = 42
-//// const foo = `foobar is a ${ age < 18 ? 'child' : /*x*/`/*y*/grown-up ${ age > 40 ? 'who needs probaply assistance' : ''}` }`
+//// const foo = `foobar is a ${ age < 18 ? 'child' : /*x*/`/*y*/grown-up ${ age > 40 ? 'who needs probably assistance' : ''}` }`
goTo.select("x", "y");
edit.applyRefactor({
@@ -10,5 +10,5 @@ edit.applyRefactor({
actionDescription: "Convert to string concatenation",
newContent:
`const age = 42
-const foo = \`foobar is a \${ age < 18 ? 'child' : "grown-up " + (age > 40 ? 'who needs probaply assistance' : '') }\``,
+const foo = \`foobar is a \${ age < 18 ? 'child' : "grown-up " + (age > 40 ? 'who needs probably assistance' : '') }\``,
});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringOtherExprSeq.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringOtherExprSeq.ts
new file mode 100644
index 00000000000..2970dce1895
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringOtherExprSeq.ts
@@ -0,0 +1,12 @@
+///
+
+//// const foo = `/*x*/f/*y*/oobar is ${ 42 * 6 % 4} years old`
+
+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 = "foobar is " + 42 * 6 % 4 + " years old"`,
+});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringExprInRow.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringPlusExprSeq.ts
similarity index 100%
rename from tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringExprInRow.ts
rename to tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringPlusExprSeq.ts
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateAvailability.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateAvailability.ts
index fa58f01392d..deabaa61a40 100644
--- a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateAvailability.ts
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateAvailability.ts
@@ -2,7 +2,7 @@
//// const age = 22
//// const name = "Eddy"
-//// const /*z*/f/*y*/oo = /*x*/"/*w*/M/*v*/r/*u*/ " /*t*/+/*s*/ /*r*/n/*q*/ame + " is " + /*p*/a/*o*/ge + " years old"
+//// const /*z*/f/*y*/oo = /*x*/"/*w*/M/*v*/r/*u*/ " /*t*/+/*s*/ /*r*/n/*q*/ame + " is " + /*p*/a/*o*/ge * 4 / 2 + " years old"
goTo.select("z", "y");
verify.not.refactorAvailable("Convert string concatenation or template literal", "Convert to string concatenation");
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateOtherExprSeq.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateOtherExprSeq.ts
new file mode 100644
index 00000000000..493f724a2bd
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateOtherExprSeq.ts
@@ -0,0 +1,12 @@
+///
+
+//// const foo = "/*x*/f/*y*/oobar is " + 42 * 6 / 4 + " 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 / 4} years old\``,
+});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateExprInRow.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplatePlusExprSeq.ts
similarity index 100%
rename from tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateExprInRow.ts
rename to tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplatePlusExprSeq.ts
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplatePrefixExpr.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplatePrefixExpr.ts
index dfaa3ab8d66..7b8c6244114 100644
--- a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplatePrefixExpr.ts
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplatePrefixExpr.ts
@@ -1,6 +1,6 @@
///
-//// const foo = /*x*/4/*y*/2 + 6 + 23 + 12 +" years old"
+//// const foo = /*x*/4/*y*/2 - 6 * 4 + 23 / 12 +" years old"
goTo.select("x", "y");
edit.applyRefactor({
@@ -8,5 +8,5 @@ edit.applyRefactor({
actionName: "Convert to template literal",
actionDescription: "Convert to template literal",
newContent:
-`const foo = \`\${42 + 6 + 23 + 12} years old\``,
+`const foo = \`\${42 - 6 * 4 + 23 / 12} years old\``,
});
diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateSingleQuote.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateSingleQuote.ts
new file mode 100644
index 00000000000..4a4d2c5b26e
--- /dev/null
+++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateSingleQuote.ts
@@ -0,0 +1,12 @@
+///
+
+//// const foo = '/*x*/f/*y*/oobar rocks'
+
+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 rocks\``,
+});