From 4b9293e63f0511ef6f09ad79a26f56ed1df07c7d Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 29 May 2019 21:27:48 +0200 Subject: [PATCH] fix reference to inner class of generic outer in static context (IDEA-215061) GitOrigin-RevId: b969c41b3282bf89c4b44da598c7ec408ea8fec5 --- .../codeInsight/completion/JavaCompletionUtil.java | 10 ++++++++++ .../codeInsight/lookup/PsiTypeLookupItem.java | 2 +- .../source/codeStyle/JavaReferenceAdjuster.java | 14 +++++++++++--- .../afterInnerInStaticContextOfGenericOuter.java | 11 +++++++++++ .../beforeInnerInStaticContextOfGenericOuter.java | 11 +++++++++++ 5 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalFromUsage/afterInnerInStaticContextOfGenericOuter.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalFromUsage/beforeInnerInStaticContextOfGenericOuter.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index 7ca867463543..f7063d06a8f9 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -631,6 +631,16 @@ public class JavaCompletionUtil { return endOffset; } + if (reference != null && !psiClass.hasModifierProperty(PsiModifier.STATIC)) { + PsiClass containingClass = psiClass.getContainingClass(); + if (containingClass != null && containingClass.hasTypeParameters()) { + PsiModifierListOwner enclosingStaticElement = PsiUtil.getEnclosingStaticElement(reference.getElement(), null); + if (enclosingStaticElement != null && !PsiTreeUtil.isAncestor(enclosingStaticElement, psiClass, false)) { + return endOffset; + } + } + } + assert document != null; document.replaceString(startOffset, endOffset, name); diff --git a/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java b/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java index bc4c95a76eed..221bfd93bcbe 100644 --- a/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java +++ b/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java @@ -223,7 +223,7 @@ public class PsiTypeLookupItem extends LookupItem implements TypedLookupItem { if (name != null) { PsiClass resolved = JavaPsiFacade.getInstance(psiClass.getProject()).getResolveHelper().resolveReferencedClass(name, context); String[] allStrings; - if (!psiClass.getManager().areElementsEquivalent(resolved, psiClass) && !PsiUtil.isInnerClass(psiClass)) { + if (!psiClass.getManager().areElementsEquivalent(resolved, psiClass)) { // inner class name should be shown qualified if its not accessible by single name allStrings = ArrayUtil.toStringArray(JavaCompletionUtil.getAllLookupStrings(psiClass)); } else { 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 c713f2a11333..0e03edf48f24 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 @@ -31,6 +31,7 @@ import com.intellij.psi.impl.source.tree.*; import com.intellij.psi.jsp.JspFile; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.siyeh.ig.psiutils.CommentTracker; import com.siyeh.ig.psiutils.ImportUtils; import org.jetbrains.annotations.NotNull; @@ -275,11 +276,18 @@ public class JavaReferenceAdjuster implements ReferenceAdjuster { PsiElement parent = psiReference.getParent(); if (parent instanceof PsiNewExpression || parent.getParent() instanceof PsiNewExpression) return true; - if (parent instanceof PsiTypeElement && - parent.getParent() instanceof PsiInstanceOfExpression) { + if (parent instanceof PsiTypeElement) { final PsiClass containingClass = refClass.getContainingClass(); if (containingClass != null && containingClass.hasTypeParameters()) { - return false; + if (parent.getParent() instanceof PsiInstanceOfExpression) { + return false; + } + if (!refClass.hasModifierProperty(PsiModifier.STATIC)) { + PsiModifierListOwner enclosingStaticElement = PsiUtil.getEnclosingStaticElement(psiReference, null); + if (enclosingStaticElement != null && !PsiTreeUtil.isAncestor(enclosingStaticElement, refClass, false)) { + return false; + } + } } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalFromUsage/afterInnerInStaticContextOfGenericOuter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalFromUsage/afterInnerInStaticContextOfGenericOuter.java new file mode 100644 index 000000000000..95a63c99f549 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalFromUsage/afterInnerInStaticContextOfGenericOuter.java @@ -0,0 +1,11 @@ +// "Create local variable 'inner'" "true" +class OuterGeneric { + class Inner { + } + static OuterGeneric.Inner create() { + return null; + } + public static void main(String[] args) { + OuterGeneric.Inner inner = create(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalFromUsage/beforeInnerInStaticContextOfGenericOuter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalFromUsage/beforeInnerInStaticContextOfGenericOuter.java new file mode 100644 index 000000000000..b8f56599ed97 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalFromUsage/beforeInnerInStaticContextOfGenericOuter.java @@ -0,0 +1,11 @@ +// "Create local variable 'inner'" "true" +class OuterGeneric { + class Inner { + } + static OuterGeneric.Inner create() { + return null; + } + public static void main(String[] args) { + inner = create(); + } +} \ No newline at end of file