From e1980f56b1b25f842b6a9ddf79c30ce3b036fa51 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 9 Dec 2010 11:35:45 +0300 Subject: [PATCH] show type parameters and local classes in basic completion (IDEA-62711) --- .../completion/InheritorsHolder.java | 21 ++++++++-------- .../normal/ClassTypeParameters.java | 3 +++ .../ClassTypeParametersGenericBounds.java | 3 +++ .../completion/normal/LocalClassName.java | 6 +++++ .../normal/LocalClassName_after.java | 6 +++++ .../completion/normal/LocalClassTwice.java | 7 ++++++ .../normal/LocalTopLevelConflict.java | 8 +++++++ .../completion/NormalCompletionTest.groovy | 24 ++++++++++++++++++- 8 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normal/ClassTypeParameters.java create mode 100644 java/java-tests/testData/codeInsight/completion/normal/ClassTypeParametersGenericBounds.java create mode 100644 java/java-tests/testData/codeInsight/completion/normal/LocalClassName.java create mode 100644 java/java-tests/testData/codeInsight/completion/normal/LocalClassName_after.java create mode 100644 java/java-tests/testData/codeInsight/completion/normal/LocalClassTwice.java create mode 100644 java/java-tests/testData/codeInsight/completion/normal/LocalTopLevelConflict.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/InheritorsHolder.java b/java/java-impl/src/com/intellij/codeInsight/completion/InheritorsHolder.java index 5230f321b66b..a6e4dda462d7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/InheritorsHolder.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/InheritorsHolder.java @@ -22,6 +22,7 @@ import com.intellij.psi.PsiElement; import com.intellij.util.Consumer; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.HashSet; import java.util.Set; @@ -46,24 +47,24 @@ public class InheritorsHolder implements Consumer { final PsiClass psiClass = (PsiClass)object; if (JavaCompletionUtil.hasAccessibleInnerClass(psiClass, myPosition)) return; - ContainerUtil.addIfNotNull(myAddedClasses, psiClass.getQualifiedName()); + ContainerUtil.addIfNotNull(myAddedClasses, getClassName(psiClass)); } myResult.addElement(AutoCompletionPolicy.NEVER_AUTOCOMPLETE.applyPolicy(lookupElement)); } + @Nullable + private static String getClassName(PsiClass psiClass) { + String name = psiClass.getQualifiedName(); + return name == null ? psiClass.getName() : name; + } + public boolean alreadyProcessed(@NotNull LookupElement element) { final Object object = element.getObject(); - if (object instanceof PsiClass) { - if (alreadyProcessed((PsiClass)object)) return true; - } - return false; + return object instanceof PsiClass && alreadyProcessed((PsiClass)object); } public boolean alreadyProcessed(@NotNull PsiClass object) { - final String qualifiedName = object.getQualifiedName(); - if (qualifiedName == null || myAddedClasses.contains(qualifiedName)) { - return true; - } - return false; + final String name = getClassName(object); + return name == null || myAddedClasses.contains(name); } } diff --git a/java/java-tests/testData/codeInsight/completion/normal/ClassTypeParameters.java b/java/java-tests/testData/codeInsight/completion/normal/ClassTypeParameters.java new file mode 100644 index 000000000000..5659211e3a79 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/ClassTypeParameters.java @@ -0,0 +1,3 @@ +class Koo {} +public class FooMap implements YourMapInterface, V> { +} diff --git a/java/java-tests/testData/codeInsight/completion/normal/ClassTypeParametersGenericBounds.java b/java/java-tests/testData/codeInsight/completion/normal/ClassTypeParametersGenericBounds.java new file mode 100644 index 000000000000..5e58f5dccf45 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/ClassTypeParametersGenericBounds.java @@ -0,0 +1,3 @@ +class Koo{} +public class FooMap> { +} diff --git a/java/java-tests/testData/codeInsight/completion/normal/LocalClassName.java b/java/java-tests/testData/codeInsight/completion/normal/LocalClassName.java new file mode 100644 index 000000000000..d2a38868c1bd --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/LocalClassName.java @@ -0,0 +1,6 @@ +public class FooMap implements YourMapInterface { + void foo() { + class Zoooooooo {} + Zoo + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/normal/LocalClassName_after.java b/java/java-tests/testData/codeInsight/completion/normal/LocalClassName_after.java new file mode 100644 index 000000000000..82b2d2e32649 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/LocalClassName_after.java @@ -0,0 +1,6 @@ +public class FooMap implements YourMapInterface { + void foo() { + class Zoooooooo {} + Zoooooooo + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/normal/LocalClassTwice.java b/java/java-tests/testData/codeInsight/completion/normal/LocalClassTwice.java new file mode 100644 index 000000000000..3396c28d6035 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/LocalClassTwice.java @@ -0,0 +1,7 @@ +class Zooooo {} +public class FooMap implements YourMapInterface { + void foo() { + class Zoooz implements Runnable {} + Runnable r = new Zo + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/normal/LocalTopLevelConflict.java b/java/java-tests/testData/codeInsight/completion/normal/LocalTopLevelConflict.java new file mode 100644 index 000000000000..daa47c1f3386 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/LocalTopLevelConflict.java @@ -0,0 +1,8 @@ +class Zoooz {} +class Zooooo {} +public class FooMap implements YourMapInterface { + void foo() { + class Zoooz implements Runnable {} + Runnable r = new Zo + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy index 3977b8c3cbb2..b5659849377b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -346,7 +346,7 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase { } public void testExcessSpaceInTypeCast() throws Throwable { - configureByFile(getTestName(false) + ".java"); + configure() selectItem(myItems[0]); checkResult() } @@ -363,6 +363,28 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase { doTest(); } + public void testLocalClassName() throws Throwable { doTest(); } + + public void testClassTypeParameters() throws Throwable { + configure() + assert 'K' in myFixture.lookupElementStrings + } + + public void testClassTypeParametersGenericBounds() throws Throwable { + configure() + assert 'K' in myFixture.lookupElementStrings + } + + public void testLocalClassTwice() throws Throwable { + configure() + assertOrderedEquals myFixture.lookupElementStrings, 'Zoooz', 'Zooooo' + } + + public void testLocalTopLevelConflict() throws Throwable { + configure() + assertOrderedEquals myFixture.lookupElementStrings, 'Zoooz', 'Zooooo' + } + public void testMethodParenthesesSpaces() throws Throwable { final settings = CodeStyleSettingsManager.getSettings(getProject()) settings.SPACE_BEFORE_METHOD_CALL_PARENTHESES = true