IDEA-80583 Wrong suggestion in qualified field type
authorpeter <peter@jetbrains.com>
Tue, 31 Jan 2012 14:10:11 +0000 (15:10 +0100)
committerpeter <peter@jetbrains.com>
Tue, 31 Jan 2012 17:30:26 +0000 (18:30 +0100)
java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java
java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java
java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java
java/java-tests/testData/codeInsight/completion/normal/PackageInMemberType.java [new file with mode: 0644]
java/java-tests/testData/codeInsight/completion/normal/PackageInMemberType_after.java [new file with mode: 0644]
java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy

index 94135a94b346d51b6110e9bb64e21bfa533f59e0..30f5c20fbef837995390a8d1ae05c0d0afdb5dee 100644 (file)
@@ -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);
     }
index 86d61df0968de2e47252e8750d64c86a1716632b..5d9d2a0155a4b9738de5f8fca88c4a5f8950bd75 100644 (file)
@@ -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<PsiElement> 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) ||
index c6923329dd83c68fe41ddfa6dbdf5db3f2c03c65..87c91da8c5093a5aed07e4ed6496a344414f84de 100644 (file)
@@ -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 (file)
index 0000000..1080c46
--- /dev/null
@@ -0,0 +1,3 @@
+class Foo {
+  java.l<caret>
+}
\ 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 (file)
index 0000000..9db38bb
--- /dev/null
@@ -0,0 +1,3 @@
+class Foo {
+  java.lang.<caret>
+}
\ No newline at end of file
index 9e74675a1ec28e54155a5e44c4d16e7287914833..e5203e7f1069c182969141bb8d5d8bc4ffeba0f3 100644 (file)
@@ -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() }
 
 }