From 345c82b0520e7c85f5b550e790740ff5a01ce224 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 18 Jul 2012 14:09:41 +0200 Subject: [PATCH] IDEA-88975 Java constructors autocompletion doesn't work fine for non-static inner classes. --- .../codeInsight/completion/JavaCompletionUtil.java | 12 ++++++++---- .../codeInsight/completion/JavaInheritorsGetter.java | 8 ++++++-- .../codeInsight/lookup/PsiTypeLookupItem.java | 4 ++-- .../completion/smartType/AfterQualifiedNew-out.java | 5 +++++ .../completion/smartType/AfterQualifiedNew.java | 5 +++++ .../completion/SmartTypeCompletionTest.java | 4 ++++ 6 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/AfterQualifiedNew-out.java create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/AfterQualifiedNew.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 53938ee4a082..623f24cbaad2 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -736,7 +736,9 @@ public class JavaCompletionUtil { PsiElement element = file.findElementAt(startOffset); if (element instanceof PsiIdentifier) { PsiElement parent = element.getParent(); - if (parent instanceof PsiJavaCodeReferenceElement && !((PsiJavaCodeReferenceElement)parent).isQualified() && !(parent.getParent() instanceof PsiPackageStatement)) { + if (parent instanceof PsiJavaCodeReferenceElement && + !((PsiJavaCodeReferenceElement)parent).isQualified() && + !(parent.getParent() instanceof PsiPackageStatement)) { PsiJavaCodeReferenceElement ref = (PsiJavaCodeReferenceElement)parent; if (psiClass.isValid() && !psiClass.getManager().areElementsEquivalent(psiClass, resolveReference(ref))) { @@ -750,8 +752,8 @@ public class JavaCompletionUtil { documentManager.commitDocument(document); newElement = CodeInsightUtilBase.findElementInRange(file, rangeMarker.getStartOffset(), rangeMarker.getEndOffset(), - PsiJavaCodeReferenceElement.class, - JavaLanguage.INSTANCE); + PsiJavaCodeReferenceElement.class, + JavaLanguage.INSTANCE); rangeMarker.dispose(); if (newElement != null) { newEndOffset = newElement.getTextRange().getEndOffset(); @@ -762,7 +764,9 @@ public class JavaCompletionUtil { } } - if (!staticImport && !psiClass.getManager().areElementsEquivalent(psiClass, resolveReference((PsiReference)newElement))) { + if (!staticImport && + !psiClass.getManager().areElementsEquivalent(psiClass, resolveReference((PsiReference)newElement)) && + !PsiUtil.isInnerClass(psiClass)) { final String qName = psiClass.getQualifiedName(); if (qName != null) { document.replaceString(newElement.getTextRange().getStartOffset(), newEndOffset, qName); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java index 72ec6c5914d3..ad0121e32476 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java @@ -39,6 +39,8 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import static com.intellij.patterns.PsiJavaPatterns.psiElement; + /** * @author peter */ @@ -116,8 +118,10 @@ public class JavaInheritorsGetter extends CompletionProvider allStrings = new HashSet(); String lookupString = psiClass.getName(); allStrings.add(lookupString); - if (!psiClass.getManager().areElementsEquivalent(resolved, psiClass)) { + if (!psiClass.getManager().areElementsEquivalent(resolved, psiClass) && !PsiUtil.isInnerClass(psiClass)) { // inner class name should be shown qualified if its not accessible by single name PsiClass aClass = psiClass.getContainingClass(); - while (aClass != null) { + while (aClass != null && !PsiUtil.isInnerClass(aClass)) { lookupString = aClass.getName() + '.' + lookupString; allStrings.add(lookupString); aClass = aClass.getContainingClass(); diff --git a/java/java-tests/testData/codeInsight/completion/smartType/AfterQualifiedNew-out.java b/java/java-tests/testData/codeInsight/completion/smartType/AfterQualifiedNew-out.java new file mode 100644 index 000000000000..acaacdf477c3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/AfterQualifiedNew-out.java @@ -0,0 +1,5 @@ +class A {{ + Aa a = new Aa(); + + Aa.B b = a.new B(); +}} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/AfterQualifiedNew.java b/java/java-tests/testData/codeInsight/completion/smartType/AfterQualifiedNew.java new file mode 100644 index 000000000000..667f0a38c2b1 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/AfterQualifiedNew.java @@ -0,0 +1,5 @@ +class A {{ + Aa a = new Aa(); + + Aa.B b = a.new +}} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java index 7ea43c60e33d..ec66115dd92b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java @@ -1111,6 +1111,10 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase { myFixture.addClass("package bar; public class Bar implements foo.Foo {}"); doTest(); } + public void testAfterQualifiedNew() throws Exception { + myFixture.addClass("class Aa { public class B { } }"); + doTest(); + } public void testTabAfterNew() throws Exception { doFirstItemTest('\t');