[java-inspection] IDEA-304027 actualization inspection 'PatternVariableCanBeUsed' for deconstructions

GitOrigin-RevId: 40a61db67d82d63a961679f65823568a5f7039b0
This commit is contained in:
Mikhail Pyltsin
2023-11-01 11:20:04 +00:00
committed by intellij-monorepo-bot
parent 29c18fc1b6
commit 86b8992265
7 changed files with 60 additions and 54 deletions
@@ -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<PsiReferenceExpression> references =
VariableAccessUtils.getVariableReferences(variable, PsiUtil.getVariableCodeBlock(variable, null));
for (PsiReferenceExpression ref : references) {
@@ -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);
@@ -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);
@@ -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;
}
@@ -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().<caret>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(<caret>);
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());
}
}
@@ -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().<caret>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(<caret>);
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());
}
}
@@ -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(<caret>));
if (obj instanceof Rect(Point(double x1, double y1), Point(final double x2, double y2))) {
System.out.println(((Rect) obj).point2().<caret>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;
}
}