From fb2b08592662666edef702b4395f4a3444edc63a Mon Sep 17 00:00:00 2001 From: Emie-Trialer Date: Wed, 15 Oct 2025 23:36:28 +0100 Subject: [PATCH 1/2] Fix: block optional chain refactor inside binary expressions --- src/services/refactors/convertToOptionalChainExpression.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/services/refactors/convertToOptionalChainExpression.ts b/src/services/refactors/convertToOptionalChainExpression.ts index 333e200f6a0b4..d3e00431c20c8 100644 --- a/src/services/refactors/convertToOptionalChainExpression.ts +++ b/src/services/refactors/convertToOptionalChainExpression.ts @@ -138,6 +138,11 @@ function getInfo(context: RefactorContext, considerEmptySpans = true): OptionalC const expression = parent && isValidExpressionOrStatement(parent) ? getExpression(parent) : undefined; if (!expression) return { error: getLocaleSpecificMessage(Diagnostics.Could_not_find_convertible_access_expression) }; + // do not offer refactor inside complex expressions like concatenations... + if (expression.parent && isBinaryExpression(expression.parent)) { + return { error: getLocaleSpecificMessage(Diagnostics.Could_not_find_convertible_access_expression) }; + } + const checker = program.getTypeChecker(); return isConditionalExpression(expression) ? getConditionalInfo(expression, checker) : getBinaryInfo(expression); } From 2bdc1620630e8ada2f4721a0aa0df3d3417a8624 Mon Sep 17 00:00:00 2001 From: Emie-Trialer Date: Thu, 16 Oct 2025 14:18:58 +0100 Subject: [PATCH 2/2] Fix optional chain refactor: block unsafe binary expressions and update tests --- ...hainExpression_SubexpressionWithSuffix1.ts | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/tests/cases/fourslash/refactorConvertToOptionalChainExpression_SubexpressionWithSuffix1.ts b/tests/cases/fourslash/refactorConvertToOptionalChainExpression_SubexpressionWithSuffix1.ts index ab48eb8c85dec..2447db929e2cb 100644 --- a/tests/cases/fourslash/refactorConvertToOptionalChainExpression_SubexpressionWithSuffix1.ts +++ b/tests/cases/fourslash/refactorConvertToOptionalChainExpression_SubexpressionWithSuffix1.ts @@ -7,13 +7,16 @@ // verify that we stop at an invalid suffix sequence. goTo.select("a", "b"); -edit.applyRefactor({ - refactorName: "Convert to optional chain expression", - actionName: "Convert to optional chain expression", - actionDescription: "Convert to optional chain expression", - newContent: -`let a = { b: { c: 0 } }; -let foo; -let bar; -a?.b?.c && foo && bar;` -}); \ No newline at end of file +// edit.applyRefactor({ +// refactorName: "Convert to optional chain expression", +// actionName: "Convert to optional chain expression", +// actionDescription: "Convert to optional chain expression", +// newContent: +// `let a = { b: { c: 0 } }; +// let foo; +// let bar; +// a?.b?.c && foo && bar;` +// }); + +// the refactor should NOT be available +verify.not.refactorAvailable("Convert to optional chain expression"); \ No newline at end of file