From 29c026eaf20d2f445c79234e235bb57255e7d394 Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Mon, 28 Oct 2024 19:09:59 +0100 Subject: [PATCH] [java-inspections] IDEA-360880 Replace cast expressions with pattern variable does nothing inside of ternary operator - use PsiStatement as scope instead of PsiIfStatement - more tests GitOrigin-RevId: 2602190296988a80d54520c7a0f15fd0f8e3d942 --- .../PatternVariableCanBeUsedInspection.java | 2 +- .../afterReplaceAfterIf.java | 16 +++++++++++++ .../afterReplaceAfterIfAndElse.java | 24 +++++++++++++++++++ .../afterReplaceAfterIfAndElseIf.java | 17 +++++++++++++ .../afterReplaceInLogicExpression.java | 6 +++++ .../afterReplaceInverseAfterIf.java | 17 +++++++++++++ .../afterReplaceTernary.java | 6 +++++ .../beforeReplaceAfterIf.java | 16 +++++++++++++ .../beforeReplaceAfterIfAndElse.java | 24 +++++++++++++++++++ .../beforeReplaceAfterIfAndElseIf.java | 17 +++++++++++++ .../beforeReplaceInLogicExpression.java | 6 +++++ .../beforeReplaceInverseAfterIf.java | 17 +++++++++++++ .../beforeReplaceTernary.java | 6 +++++ 13 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceAfterIf.java create mode 100644 java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceAfterIfAndElse.java create mode 100644 java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceAfterIfAndElseIf.java create mode 100644 java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceInLogicExpression.java create mode 100644 java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceInverseAfterIf.java create mode 100644 java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceTernary.java create mode 100644 java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceAfterIf.java create mode 100644 java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceAfterIfAndElse.java create mode 100644 java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceAfterIfAndElseIf.java create mode 100644 java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceInLogicExpression.java create mode 100644 java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceInverseAfterIf.java create mode 100644 java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceTernary.java diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/PatternVariableCanBeUsedInspection.java b/java/java-impl-inspections/src/com/intellij/codeInspection/PatternVariableCanBeUsedInspection.java index f98f4ad7484c..c1b1f0b70910 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/PatternVariableCanBeUsedInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/PatternVariableCanBeUsedInspection.java @@ -307,7 +307,7 @@ public final class PatternVariableCanBeUsedInspection extends AbstractBaseJavaLo if (instanceOfType != null && instanceOfType.getType() instanceof PsiClassType classType && !classType.isRaw()) { typeElement = instanceOfType; } - PsiIfStatement psiIfStatement = PsiTreeUtil.getParentOfType(instanceOf, PsiIfStatement.class); + PsiStatement psiIfStatement = PsiTreeUtil.getParentOfType(instanceOf, PsiStatement.class); if (psiIfStatement == null || psiIfStatement.getParent() == null) return; var visitor = new JavaRecursiveElementVisitor() { final List myCasts = new ArrayList<>(); diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceAfterIf.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceAfterIf.java new file mode 100644 index 000000000000..54551c97e793 --- /dev/null +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceAfterIf.java @@ -0,0 +1,16 @@ +// "Replace cast expressions with pattern variable" "true" +public final class A { + private static boolean foo3(Number o, Number n) { + if (!(o instanceof Integer integer)) { + return false; + } + + if (integer.describeConstable().get() == 1) { + return true; + } + if (integer.describeConstable().get() == 2) { + return true; + } + return false; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceAfterIfAndElse.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceAfterIfAndElse.java new file mode 100644 index 000000000000..fe90085e9c6d --- /dev/null +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceAfterIfAndElse.java @@ -0,0 +1,24 @@ +// "Replace cast expressions with pattern variable" "true" +public final class A { + private static Object foo5(Object o) { + return new Runnable() { + @Override + public void run() { + if (!(o instanceof Integer integer)) { + return; + } + final String string = integer.toString(); + if (string.equals("1")) { + return; + } + if (integer.intValue() == 1) { + return; + } + + print(integer); + } + }; + } + + +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceAfterIfAndElseIf.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceAfterIfAndElseIf.java new file mode 100644 index 000000000000..734195aa67fd --- /dev/null +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceAfterIfAndElseIf.java @@ -0,0 +1,17 @@ +// "Replace cast expressions with pattern variable" "true" +public final class A { + private static boolean foo4(Number o, Number n) { + if (!(o instanceof Integer integer)) { + return false; + } else if (integer.describeConstable().get() == 1) { + return true; + } + + if (integer.describeConstable().get() == 2) { + return true; + } + + return integer.describeConstable().get() == 3; + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceInLogicExpression.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceInLogicExpression.java new file mode 100644 index 000000000000..e9cc96b041a4 --- /dev/null +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceInLogicExpression.java @@ -0,0 +1,6 @@ +// "Replace cast expressions with pattern variable" "true" +public final class A { + private static boolean foo2(Number o, Number n) { + return o instanceof Integer integer && o != n && integer.describeConstable().get() == 1; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceInverseAfterIf.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceInverseAfterIf.java new file mode 100644 index 000000000000..734195aa67fd --- /dev/null +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceInverseAfterIf.java @@ -0,0 +1,17 @@ +// "Replace cast expressions with pattern variable" "true" +public final class A { + private static boolean foo4(Number o, Number n) { + if (!(o instanceof Integer integer)) { + return false; + } else if (integer.describeConstable().get() == 1) { + return true; + } + + if (integer.describeConstable().get() == 2) { + return true; + } + + return integer.describeConstable().get() == 3; + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceTernary.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceTernary.java new file mode 100644 index 000000000000..0a8a1b5e273b --- /dev/null +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterReplaceTernary.java @@ -0,0 +1,6 @@ +// "Replace cast expressions with pattern variable" "true" +public final class A { + private static void foo(Object o) { + int x = o instanceof String string ? string.length() : 0; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceAfterIf.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceAfterIf.java new file mode 100644 index 000000000000..fe1a6e5c0cb7 --- /dev/null +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceAfterIf.java @@ -0,0 +1,16 @@ +// "Replace cast expressions with pattern variable" "true" +public final class A { + private static boolean foo3(Number o, Number n) { + if (!(o instanceof Integer)) { + return false; + } + + if (((Integer) o).describeConstable().get() == 1) { + return true; + } + if (((Integer) o).describeConstable().get() == 2) { + return true; + } + return false; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceAfterIfAndElse.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceAfterIfAndElse.java new file mode 100644 index 000000000000..cbfb17eeb54c --- /dev/null +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceAfterIfAndElse.java @@ -0,0 +1,24 @@ +// "Replace cast expressions with pattern variable" "true" +public final class A { + private static Object foo5(Object o) { + return new Runnable() { + @Override + public void run() { + if (!(o instanceof Integer)) { + return; + } + final String string = ((Integer) o).toString(); + if (string.equals("1")) { + return; + } + if (((Integer) o).intValue() == 1) { + return; + } + + print(((Integer) o)); + } + }; + } + + +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceAfterIfAndElseIf.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceAfterIfAndElseIf.java new file mode 100644 index 000000000000..3e8a8ba0b5a6 --- /dev/null +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceAfterIfAndElseIf.java @@ -0,0 +1,17 @@ +// "Replace cast expressions with pattern variable" "true" +public final class A { + private static boolean foo4(Number o, Number n) { + if (!(o instanceof Integer)) { + return false; + } else if (((Integer) o).describeConstable().get() == 1) { + return true; + } + + if (((Integer) o).describeConstable().get() == 2) { + return true; + } + + return ((Integer) o).describeConstable().get() == 3; + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceInLogicExpression.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceInLogicExpression.java new file mode 100644 index 000000000000..e028b97c30ed --- /dev/null +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceInLogicExpression.java @@ -0,0 +1,6 @@ +// "Replace cast expressions with pattern variable" "true" +public final class A { + private static boolean foo2(Number o, Number n) { + return o instanceof Integer && o != n && ((Integer) o).describeConstable().get() == 1; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceInverseAfterIf.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceInverseAfterIf.java new file mode 100644 index 000000000000..3e8a8ba0b5a6 --- /dev/null +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceInverseAfterIf.java @@ -0,0 +1,17 @@ +// "Replace cast expressions with pattern variable" "true" +public final class A { + private static boolean foo4(Number o, Number n) { + if (!(o instanceof Integer)) { + return false; + } else if (((Integer) o).describeConstable().get() == 1) { + return true; + } + + if (((Integer) o).describeConstable().get() == 2) { + return true; + } + + return ((Integer) o).describeConstable().get() == 3; + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceTernary.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceTernary.java new file mode 100644 index 000000000000..649a59b751f0 --- /dev/null +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeReplaceTernary.java @@ -0,0 +1,6 @@ +// "Replace cast expressions with pattern variable" "true" +public final class A { + private static void foo(Object o) { + int x = o instanceof String ? ((String)o).length() : 0; + } +} \ No newline at end of file