From d2ab0bd05a9c62f0f8a1273386b5d4e82ff7fffa Mon Sep 17 00:00:00 2001 From: BigAru Date: Fri, 22 Mar 2019 16:40:15 +0100 Subject: [PATCH] support single quotes when decoding raw string --- .../refactors/convertStringOrTemplateLiteral.ts | 14 +++++++------- ...tStringOrTemplateLiteral_ToStringNestedInner.ts | 4 ++-- ...StringOrTemplateLiteral_ToStringOtherExprSeq.ts | 12 ++++++++++++ ...StringOrTemplateLiteral_ToStringPlusExprSeq.ts} | 0 ...ringOrTemplateLiteral_ToTemplateAvailability.ts | 2 +- ...ringOrTemplateLiteral_ToTemplateOtherExprSeq.ts | 12 ++++++++++++ ...ringOrTemplateLiteral_ToTemplatePlusExprSeq.ts} | 0 ...StringOrTemplateLiteral_ToTemplatePrefixExpr.ts | 4 ++-- ...tringOrTemplateLiteral_ToTemplateSingleQuote.ts | 12 ++++++++++++ 9 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToStringOtherExprSeq.ts rename tests/cases/fourslash/{refactorConvertStringOrTemplateLiteral_ToStringExprInRow.ts => refactorConvertStringOrTemplateLiteral_ToStringPlusExprSeq.ts} (100%) create mode 100644 tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateOtherExprSeq.ts rename tests/cases/fourslash/{refactorConvertStringOrTemplateLiteral_ToTemplateExprInRow.ts => refactorConvertStringOrTemplateLiteral_ToTemplatePlusExprSeq.ts} (100%) create mode 100644 tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateSingleQuote.ts 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\``, +});