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 a5a8e9382175..0cac6dabbc9f 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/PatternVariableCanBeUsedInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/PatternVariableCanBeUsedInspection.java @@ -34,11 +34,12 @@ public class PatternVariableCanBeUsedInspection extends AbstractBaseJavaLocalIns @Override public void visitMethodCallExpression(@NotNull PsiMethodCallExpression call) { if (!HighlightingFeature.PATTERN_GUARDS_AND_RECORD_PATTERNS.isAvailable(holder.getFile())) return; - PsiReferenceExpression qualifier = getQualifierReferenceExpression(call); - if (qualifier == null) return; - if (qualifier.resolve() instanceof PsiPatternVariable variable && - variable.getPattern() instanceof PsiDeconstructionPattern deconstruction) { - if (!isFinalOrEffectivelyFinal(variable)) return; + PsiTypeCastExpression qualifier = getQualifierReferenceExpression(call); + if(qualifier==null) return; + PsiInstanceOfExpression candidate = InstanceOfUtils.findPatternCandidate(qualifier); + if (candidate == null) return; + PsiPrimaryPattern pattern = candidate.getPattern(); + if (pattern instanceof PsiDeconstructionPattern deconstruction) { PsiPatternVariable existingPatternVariable = findExistingPatternVariable(qualifier, deconstruction, call); if (existingPatternVariable == null) return; if (!isFinalOrEffectivelyFinal(existingPatternVariable)) return; @@ -74,12 +75,12 @@ public class PatternVariableCanBeUsedInspection extends AbstractBaseJavaLocalIns } @Nullable - private static PsiReferenceExpression getQualifierReferenceExpression(@NotNull PsiMethodCallExpression call) { + private static PsiTypeCastExpression getQualifierReferenceExpression(@NotNull PsiMethodCallExpression call) { while (true) { if (!call.getArgumentList().isEmpty()) return null; PsiExpression qualifier = PsiUtil.skipParenthesizedExprDown(call.getMethodExpression().getQualifierExpression()); PsiMethodCallExpression qualifierMethodCall = ObjectUtils.tryCast(qualifier, PsiMethodCallExpression.class); - if (qualifierMethodCall == null) return ObjectUtils.tryCast(qualifier, PsiReferenceExpression.class); + if (qualifierMethodCall == null) return ObjectUtils.tryCast(qualifier, PsiTypeCastExpression.class); call = qualifierMethodCall; } } @@ -189,6 +190,10 @@ public class PatternVariableCanBeUsedInspection extends AbstractBaseJavaLocalIns if (!myName.endsWith("()")) { PsiLocalVariable variable = PsiTreeUtil.getParentOfType(element, PsiLocalVariable.class); if (variable == null) return; + if (VariableAccessUtils.variableIsAssigned(variable)) { + new CommentTracker().replace(element, myPatternName); + return; + } List references = VariableAccessUtils.getVariableReferences(variable, PsiUtil.getVariableCodeBlock(variable, null)); for (PsiReferenceExpression ref : references) { diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPattern1.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPattern1.java index 2b01c63f9f45..654dbfe9f8d8 100644 --- a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPattern1.java +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPattern1.java @@ -1,10 +1,11 @@ // "Fix all 'Pattern variable can be used' problems in file" "true" class Main { void foo(Object obj) { - if (obj instanceof Rect(Point(double x1, double y1) point1, Point(double x2, double y2) point2) rect) { + if (obj instanceof Rect(Point(double x1, double y1), Point(double x2, double y2))) { double s = x2 + y2; - System.out.println(point1); - System.out.println(point2); + Point p1 = ((Rect) obj).point1(); + System.out.println(p1); + System.out.println(((Rect) obj).point2()); System.out.println(x1 + x1 + y1 + x2 + y2); System.out.println(y1 + x1 + y1); System.out.println(x2 + s); diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPattern2.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPattern2.java index 0574b91eb107..7e371663ea13 100644 --- a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPattern2.java +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPattern2.java @@ -1,7 +1,7 @@ // "Fix all 'Pattern variable can be used' problems in file" "true" class Main { void foo(Object obj) { - if (obj instanceof Rect(Point(double x1, double y1), Point(double x2, double y2)) rect) { + if (obj instanceof Rect(Point(double x1, double y1), Point(double x2, double y2))) { double s = ((x2)) + y2; System.out.println(x1 + x1 + y1 + y2); System.out.println(y1 + x1 + y2); diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPattern3.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPattern3.java index 64901d4fb0ba..410b9487779c 100644 --- a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPattern3.java +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterRecordPattern3.java @@ -1,17 +1,17 @@ // "Fix all 'Pattern variable can be used' problems in file" "true" class Main { void foo(Object obj) { - if (obj instanceof Rect(Point(double x1, double y1) point1, Point(final double x2, double y2)) rect) { + if (obj instanceof Rect(Point(double x1, double y1), Point(final double x2, double y2))) { System.out.println(x2); double x = x1; - Point p1 = rect.point2(); - System.out.println(rect.point2().z()); - System.out.println(rect.point1().y()); - System.out.println(rect.point1().z()); + Point p1 = ((Rect) obj).point2(); + System.out.println(((Rect) obj).point2().z()); + System.out.println(((Rect) obj).point1().y()); + System.out.println(((Rect) obj).point1().z()); y2 = 0.0; - System.out.println(rect.point2().y()); - point1 = new Point(100.0, 200.0); - System.out.println(point1.y()); + System.out.println(((Rect) obj).point2().y()); + p1 = new Point(100.0, 200.0); + System.out.println(p1.y()); double d = x2; d = 10.0; } diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPattern1.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPattern1.java index ab621a2d22ec..d8a589fbe616 100644 --- a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPattern1.java +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPattern1.java @@ -1,23 +1,23 @@ // "Fix all 'Pattern variable can be used' problems in file" "true" class Main { void foo(Object obj) { - if (obj instanceof Rect(Point(double x1, double y1) point1, Point(double x2, double y2) point2) rect) { - double a1 = rect.point1().x(); - double b1 = rect.point1().y(); - double a2 = ((((((rect)).point2())).x())); - double b2 = rect.point2().y(); - double k1 = point1.x(); - double l1 = point1.y(); - double s = point2.x() + point2.y(); - Point p1 = rect.point1(); + if (obj instanceof Rect(Point(double x1, double y1), Point(double x2, double y2))) { + double a1 = ((Rect) obj).point1().x(); + double b1 = ((Rect) obj).point1().y(); + double a2 = ((((((((Rect) obj))).point2())).x())); + double b2 = ((Rect) obj).point2().y(); + double k1 = ((Rect) obj).point1().x(); + double l1 = ((Rect) obj).point1().y(); + double s = ((Rect) obj).point2().x() + ((Rect) obj).point2().y(); + Point p1 = ((Rect) obj).point1(); System.out.println(p1); - System.out.println(rect.point2()); - System.out.println(rect.point1().x() + a1 + b1 + a2 + b2); - System.out.println(rect.point1().y() + k1 + l1); - System.out.println(rect.point2().x() + s); - System.out.println(((((((rect)).point2())).y()))); - System.out.println(point1.x()); - System.out.println(point2.x()); + System.out.println(((Rect) obj).point2()); + System.out.println(((Rect) obj).point1().x() + a1 + b1 + a2 + b2); + System.out.println(((Rect) obj).point1().y() + k1 + l1); + System.out.println(((Rect) obj).point2().x() + s); + System.out.println(((((((((Rect) obj))).point2())).y()))); + System.out.println(((Rect) obj).point1().x()); + System.out.println(((Rect) obj).point2().x()); } } diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPattern2.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPattern2.java index 24dbe039acfb..64a62b798661 100644 --- a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPattern2.java +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPattern2.java @@ -1,15 +1,15 @@ // "Fix all 'Pattern variable can be used' problems in file" "true" class Main { void foo(Object obj) { - if (obj instanceof Rect(Point(double x1, double y1), Point(double x2, double y2)) rect) { - double a1 = rect.point1().x(); - double b1 = ((((((rect)).point1())).y())); - double b2 = rect.point2().y(); - double s = ((((((rect)).point2())).x())) + b2; - System.out.println(rect.point1().x() + a1 + b1 + b2); - System.out.println(rect.point1().y() + a1 + b2); - System.out.println(((((((rect)).point2())).x())) + s); - System.out.println(rect.point2().y()); + if (obj instanceof Rect(Point(double x1, double y1), Point(double x2, double y2))) { + double a1 = ((Rect)obj).point1().x(); + double b1 = ((((((((Rect)obj))).point1())).y())); + double b2 = ((Rect)obj).point2().y(); + double s = ((((((((Rect)obj))).point2())).x())) + b2; + System.out.println(((Rect)obj).point1().x() + a1 + b1 + b2); + System.out.println(((Rect)obj).point1().y() + a1 + b2); + System.out.println(((((((((Rect)obj))).point2())).x())) + s); + System.out.println(((Rect)obj).point2().y()); } } diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPattern3.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPattern3.java index 4f564de81c3b..594f15bafad2 100644 --- a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPattern3.java +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeRecordPattern3.java @@ -1,18 +1,18 @@ // "Fix all 'Pattern variable can be used' problems in file" "true" class Main { void foo(Object obj) { - if (obj instanceof Rect(Point(double x1, double y1) point1, Point(final double x2, double y2)) rect) { - System.out.println(rect.point2().x()); + if (obj instanceof Rect(Point(double x1, double y1), Point(final double x2, double y2))) { + System.out.println(((Rect) obj).point2().x()); double x = x1; - Point p1 = rect.point2(); - System.out.println(rect.point2().z()); - System.out.println(rect.point1().y()); - System.out.println(rect.point1().z()); + Point p1 = ((Rect) obj).point2(); + System.out.println(((Rect) obj).point2().z()); + System.out.println(((Rect) obj).point1().y()); + System.out.println(((Rect) obj).point1().z()); y2 = 0.0; - System.out.println(rect.point2().y()); - point1 = new Point(100.0, 200.0); - System.out.println(point1.y()); - double d = rect.point2().x(); + System.out.println(((Rect) obj).point2().y()); + p1 = new Point(100.0, 200.0); + System.out.println(p1.y()); + double d = ((Rect) obj).point2().x(); d = 10.0; } }