From eb6ddf6b2921fdb4bdb23370995dc47f673187d1 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Fri, 30 Oct 2020 00:23:11 +0200 Subject: [PATCH] fix(40671): suggest ConvertStringToTemplateLiteral refactoring for string with property/element acceses elements (#40942) --- .../refactors/convertStringOrTemplateLiteral.ts | 17 +++++++++++++---- ...ral_ToTemplateBinaryExprWithElementAccess.ts | 15 +++++++++++++++ ...al_ToTemplateBinaryExprWithPropertyAccess.ts | 15 +++++++++++++++ 3 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateBinaryExprWithElementAccess.ts create mode 100644 tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateBinaryExprWithPropertyAccess.ts diff --git a/src/services/refactors/convertStringOrTemplateLiteral.ts b/src/services/refactors/convertStringOrTemplateLiteral.ts index ebcd13229e..70965a16ed 100644 --- a/src/services/refactors/convertStringOrTemplateLiteral.ts +++ b/src/services/refactors/convertStringOrTemplateLiteral.ts @@ -73,10 +73,19 @@ namespace ts.refactor.convertStringOrTemplateLiteral { } function getParentBinaryExpression(expr: Node) { - while (isBinaryExpression(expr.parent) && isNotEqualsOperator(expr.parent)) { - expr = expr.parent; - } - return expr; + const container = findAncestor(expr.parent, n => { + switch (n.kind) { + case SyntaxKind.PropertyAccessExpression: + case SyntaxKind.ElementAccessExpression: + return false; + case SyntaxKind.BinaryExpression: + return !(isBinaryExpression(n.parent) && isNotEqualsOperator(n.parent)); + default: + return "quit"; + } + }); + + return container || expr; } function isStringConcatenationValid(node: Node): boolean { diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateBinaryExprWithElementAccess.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateBinaryExprWithElementAccess.ts new file mode 100644 index 0000000000..7b54dea2de --- /dev/null +++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateBinaryExprWithElementAccess.ts @@ -0,0 +1,15 @@ +/// + +////const a = { prop: 1 }; +////const b = /*x*/a["prop"]/*y*/ + "a" + "b"; + +goTo.select("x", "y"); +edit.applyRefactor({ + refactorName: "Convert to template string", + actionName: "Convert to template string", + actionDescription: ts.Diagnostics.Convert_to_template_string.message, + newContent: [ + "const a = { prop: 1 };", + "const b = `${a[\"prop\"]}ab`;" + ].join("\n") +}); diff --git a/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateBinaryExprWithPropertyAccess.ts b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateBinaryExprWithPropertyAccess.ts new file mode 100644 index 0000000000..7ecdeb1e7e --- /dev/null +++ b/tests/cases/fourslash/refactorConvertStringOrTemplateLiteral_ToTemplateBinaryExprWithPropertyAccess.ts @@ -0,0 +1,15 @@ +/// + +////const a = { prop: 1 }; +////const b = /*x*/a.prop/*y*/ + "a" + "b"; + +goTo.select("x", "y"); +edit.applyRefactor({ + refactorName: "Convert to template string", + actionName: "Convert to template string", + actionDescription: ts.Diagnostics.Convert_to_template_string.message, + newContent: [ + "const a = { prop: 1 };", + "const b = `${a.prop}ab`;" + ].join("\n") +});