From 51849dbdf28e558522529c0ce04ffe7b783cb393 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 17 Nov 2023 10:48:43 +0100 Subject: [PATCH] [java-inspections] SimplifyBooleanExpressionFix: retarget to existing pattern variable (IDEA-336123) GitOrigin-RevId: c3e7f12fb11926084fa8a71467394635d1cfc5d9 --- .../SimplifyBooleanExpressionFix.java | 59 +++++++++++-------- .../afterPatternRetargetAnotherPattern.java | 11 ++++ .../beforePatternRetargetAnotherPattern.java | 11 ++++ 3 files changed, 58 insertions(+), 23 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/afterPatternRetargetAnotherPattern.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/beforePatternRetargetAnotherPattern.java diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/SimplifyBooleanExpressionFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/SimplifyBooleanExpressionFix.java index 5f8b4b275dc7..b860facd8fcb 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/SimplifyBooleanExpressionFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/SimplifyBooleanExpressionFix.java @@ -209,30 +209,43 @@ public class SimplifyBooleanExpressionFix extends PsiUpdateModCommandAction variables = JavaPsiPatternUtil.getExposedPatternVariables(subExpression); for (PsiPatternVariable variable : variables) { - List refs = VariableAccessUtils.getVariableReferences(variable, variable.getDeclarationScope()); - if (!refs.isEmpty()) { - PsiInstanceOfExpression target = newTargetForPatternVariable(subExpression, variable); - if (target != null) { - PsiInstanceOfExpression updated = (PsiInstanceOfExpression)JavaPsiFacade.getElementFactory(subExpression.getProject()) - .createExpressionFromText("x instanceof T t", target); - updated.getOperand().replace(target.getOperand()); - PsiTypeTestPattern newPattern = (PsiTypeTestPattern)Objects.requireNonNull(updated.getPattern()); - PsiTypeElement checkType = target.getCheckType(); - if (checkType == null) continue; - Objects.requireNonNull(newPattern.getCheckType()).replace(checkType); - PsiPatternVariable newVariable = (PsiPatternVariable)Objects.requireNonNull(newPattern.getPatternVariable()).replace(variable); - variable.delete(); - String name = new VariableNameGenerator(target, VariableKind.LOCAL_VARIABLE).byName(variable.getName()) - .generate(true); - if (!name.equals(newVariable.getName())) { - newVariable.setName(name); - for (PsiReferenceExpression ref : refs) { - if (ref.isValid()) { - ref.handleElementRename(name); - } - } + retargetPatternVariable(subExpression, variable); + } + } + + private static void retargetPatternVariable(@NotNull PsiExpression subExpression, @NotNull PsiPatternVariable variable) { + List refs = VariableAccessUtils.getVariableReferences(variable, variable.getDeclarationScope()); + if (refs.isEmpty()) return; + PsiInstanceOfExpression target = newTargetForPatternVariable(subExpression, variable); + if (target == null) return; + if (target.getPattern() instanceof PsiTypeTestPattern existingPattern) { + PsiPatternVariable existingVar = existingPattern.getPatternVariable(); + if (existingVar != null) { + for (PsiReferenceExpression ref : refs) { + if (ref.isValid()) { + ref.handleElementRename(existingVar.getName()); } - target.replace(updated); + } + return; + } + } + PsiInstanceOfExpression updated = (PsiInstanceOfExpression)JavaPsiFacade.getElementFactory(subExpression.getProject()) + .createExpressionFromText("x instanceof T t", target); + updated.getOperand().replace(target.getOperand()); + PsiTypeTestPattern newPattern = (PsiTypeTestPattern)Objects.requireNonNull(updated.getPattern()); + PsiTypeElement checkType = target.getCheckType(); + if (checkType == null) return; + Objects.requireNonNull(newPattern.getCheckType()).replace(checkType); + PsiPatternVariable newVariable = (PsiPatternVariable)Objects.requireNonNull(newPattern.getPatternVariable()).replace(variable); + variable.delete(); + target.replace(updated); + String name = new VariableNameGenerator(target, VariableKind.LOCAL_VARIABLE).byName(variable.getName()) + .generate(true); + if (!name.equals(newVariable.getName())) { + newVariable.setName(name); + for (PsiReferenceExpression ref : refs) { + if (ref.isValid()) { + ref.handleElementRename(name); } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/afterPatternRetargetAnotherPattern.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/afterPatternRetargetAnotherPattern.java new file mode 100644 index 000000000000..5b69b9833a36 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/afterPatternRetargetAnotherPattern.java @@ -0,0 +1,11 @@ +// "Simplify 'obj instanceof String str' to true" "true" +class Test { + void test(Object obj) { + if (obj instanceof String s) { + if (s.isEmpty()) { + + } + System.out.println(s); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/beforePatternRetargetAnotherPattern.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/beforePatternRetargetAnotherPattern.java new file mode 100644 index 000000000000..2c2236a8c3c8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/beforePatternRetargetAnotherPattern.java @@ -0,0 +1,11 @@ +// "Simplify 'obj instanceof String str' to true" "true" +class Test { + void test(Object obj) { + if (obj instanceof String s) { + if (obj instanceof String str && str.isEmpty()) { + + } + System.out.println(s); + } + } +} \ No newline at end of file