From 57a2a49892a499437517e82acde608274b4d2afd Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 31 Jan 2012 15:10:11 +0100 Subject: [PATCH] IDEA-80583 Wrong suggestion in qualified field type --- .../completion/JavaCompletionContributor.java | 2 +- .../completion/JavaCompletionData.java | 26 +++++++++---------- .../PsiJavaCodeReferenceElementImpl.java | 3 +++ .../normal/PackageInMemberType.java | 3 +++ .../normal/PackageInMemberType_after.java | 3 +++ .../completion/NormalCompletionTest.groovy | 14 +++------- 6 files changed, 27 insertions(+), 24 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normal/PackageInMemberType.java create mode 100644 java/java-tests/testData/codeInsight/completion/normal/PackageInMemberType_after.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java index 94135a94b346..30f5c20fbef8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -113,7 +113,7 @@ public class JavaCompletionContributor extends CompletionContributor { return new AndFilter(ElementClassFilter.CLASS, new NotFilter(new AssignableFromContextFilter())); } - if (JavaCompletionData.DECLARATION_START.isAcceptable(position, position) || + if (JavaCompletionData.DECLARATION_START.accepts(position) || JavaCompletionData.INSIDE_PARAMETER_LIST.accepts(position)) { return new OrFilter(ElementClassFilter.CLASS, ElementClassFilter.PACKAGE_FILTER); } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java index 86d61df0968d..5d9d2a0155a4 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java @@ -166,16 +166,18 @@ public class JavaCompletionData extends JavaAwareCompletionData{ defineScopeEquivalence(PsiMethod.class, JavaCodeFragment.class); } - public static final AndFilter DECLARATION_START = new AndFilter( - CLASS_BODY, - new OrFilter( - END_OF_BLOCK, - new LeftNeighbour(new OrFilter( - new SuperParentFilter(new ClassFilter(PsiModifierList.class)), - new AndFilter (new TokenTypeFilter(JavaTokenType.GT), - new SuperParentFilter(new ClassFilter(PsiTypeParameterList.class))))) - ), - new PatternFilter(not(psiElement().afterLeaf("@", ".")))); + public static final ElementPattern DECLARATION_START = psiElement().andNot(psiElement().afterLeaf("@", ".")). + andOr( + psiElement().and(new FilterPattern(CLASS_BODY)). + andOr( + new FilterPattern(END_OF_BLOCK), + psiElement().afterLeaf(or( + psiElement().inside(PsiModifierList.class), + psiElement().withElementType(JavaTokenType.GT).inside(PsiTypeParameterList.class) + ))), + psiElement().withParents(PsiJavaCodeReferenceElement.class, PsiTypeElement.class, PsiMember.class), + psiElement().withParents(PsiJavaCodeReferenceElement.class, PsiTypeElement.class, PsiClassLevelDeclarationStatement.class) + ); private void declareCompletionSpaces() { declareFinalScope(PsiFile.class); @@ -578,9 +580,7 @@ public class JavaCompletionData extends JavaAwareCompletionData{ .afterLeaf(psiElement().withText("(").withParent(psiElement(PsiParenthesizedExpression.class, PsiTypeCastExpression.class))) .accepts(position); - boolean declaration = DECLARATION_START.isAcceptable(position, position) || - psiElement().withParents(PsiJavaCodeReferenceElement.class, PsiTypeElement.class, PsiMember.class).accepts(position) || - psiElement().withParents(PsiJavaCodeReferenceElement.class, PsiTypeElement.class, PsiClassLevelDeclarationStatement.class).accepts(position); + boolean declaration = DECLARATION_START.accepts(position); if (START_FOR.accepts(position) || INSIDE_PARAMETER_LIST.accepts(position) && !AFTER_DOT.accepts(position) || VARIABLE_AFTER_FINAL.accepts(position) || diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java index c6923329dd83..87c91da8c509 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java @@ -775,6 +775,9 @@ public class PsiJavaCodeReferenceElementImpl extends CompositePsiElement impleme break; case CLASS_NAME_KIND: addClassFilter(filter); + if (isQualified()) { + filter.addFilter(ElementClassFilter.PACKAGE_FILTER); + } break; case PACKAGE_NAME_KIND: filter.addFilter(ElementClassFilter.PACKAGE_FILTER); diff --git a/java/java-tests/testData/codeInsight/completion/normal/PackageInMemberType.java b/java/java-tests/testData/codeInsight/completion/normal/PackageInMemberType.java new file mode 100644 index 000000000000..1080c468d330 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/PackageInMemberType.java @@ -0,0 +1,3 @@ +class Foo { + java.l +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/normal/PackageInMemberType_after.java b/java/java-tests/testData/codeInsight/completion/normal/PackageInMemberType_after.java new file mode 100644 index 000000000000..9db38bb5b106 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/PackageInMemberType_after.java @@ -0,0 +1,3 @@ +class Foo { + java.lang. +} \ 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 9e74675a1ec2..e5203e7f1069 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -1258,16 +1258,10 @@ public class ListUtils { } } - public void testNoGenericsWhenChoosingWithParen() { - configure() - myFixture.type 'Ma(' - checkResult() - } + public void testNoGenericsWhenChoosingWithParen() { doTest('Ma(') } - public void testNoClosingWhenChoosingWithParenBeforeIdentifier() { - configure() - myFixture.type '(' - checkResult() - } + public void testNoClosingWhenChoosingWithParenBeforeIdentifier() { doTest '(' } + + public void testPackageInMemberType() { doTest() } }