From 25842d7354dedefbf36de032452a5db0efced5f6 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 4 Jul 2022 13:55:16 +0200 Subject: [PATCH] [java-inspections] JavaReferenceAdjuster: avoid removing generic outer class qualifier in pattern instanceof Fixes IDEA-296310 "Replace 'that' with pattern variable" generates uncompilable code for nested class GitOrigin-RevId: 0ac45ba97fdfe08e0d4a74b433b9770a82969406 --- .../codeStyle/JavaReferenceAdjuster.java | 2 +- .../afterInnerGeneric.java | 19 +++++++++++++++++ .../beforeInnerGeneric.java | 21 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/inspection/patternVariableCanBeUsed/afterInnerGeneric.java create mode 100644 java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeInnerGeneric.java diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaReferenceAdjuster.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaReferenceAdjuster.java index 2216c08a5c46..fa2ab854c651 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaReferenceAdjuster.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaReferenceAdjuster.java @@ -266,7 +266,7 @@ public class JavaReferenceAdjuster implements ReferenceAdjuster { if (parent instanceof PsiTypeElement) { final PsiClass containingClass = refClass.getContainingClass(); if (containingClass != null && containingClass.hasTypeParameters()) { - if (parent.getParent() instanceof PsiInstanceOfExpression) { + if (parent.getParent() instanceof PsiInstanceOfExpression || parent.getParent() instanceof PsiPatternVariable) { return false; } if (!refClass.hasModifierProperty(PsiModifier.STATIC)) { diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterInnerGeneric.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterInnerGeneric.java new file mode 100644 index 000000000000..42e5f7f6e9a2 --- /dev/null +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/afterInnerGeneric.java @@ -0,0 +1,19 @@ +// "Replace 'that' with pattern variable" "true" +class PatternInner { + + class Basis { + String key; + + private PatternInner outer() { + return PatternInner.this; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof @SuppressWarnings("rawtypes")PatternInner.Basis that)) { + return false; + } + return this.outer() == that.outer() && this.key.equals(that.key); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeInnerGeneric.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeInnerGeneric.java new file mode 100644 index 000000000000..911e887ca441 --- /dev/null +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeInnerGeneric.java @@ -0,0 +1,21 @@ +// "Replace 'that' with pattern variable" "true" +class PatternInner { + + class Basis { + String key; + + private PatternInner outer() { + return PatternInner.this; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof PatternInner.Basis)) { + return false; + } + @SuppressWarnings("rawtypes") + PatternInner.Basis that = (PatternInner.Basis) obj; + return this.outer() == that.outer() && this.key.equals(that.key); + } + } +} \ No newline at end of file