From 6b81b1866a236d11d5a0906ca79b68a32c8a8c1f Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 4 Mar 2013 17:56:18 +0100 Subject: [PATCH] no classes in reference code fragment --- .../completion/JavaCompletionContributor.java | 17 +++++++++-------- .../completion/JavaNoVariantsDelegator.java | 2 +- .../completion/FragmentCompletionTest.groovy | 10 ++++++++++ 3 files changed, 20 insertions(+), 9 deletions(-) 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 3a4b5639cfd4..61fef1b8706e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -256,8 +256,7 @@ public class JavaCompletionContributor extends CompletionContributor { public static void addAllClasses(CompletionParameters parameters, final CompletionResultSet result, final InheritorsHolder inheritors) { - if (!isClassNamePossible(parameters.getPosition()) && parameters.getInvocationCount() <= 1 || - !mayStartClassName(result)) { + if (!isClassNamePossible(parameters) || !mayStartClassName(result)) { return; } @@ -380,10 +379,12 @@ public class JavaCompletionContributor extends CompletionContributor { } } - public static boolean isClassNamePossible(final PsiElement position) { - final PsiElement parent = position.getParent(); - if (!(parent instanceof PsiJavaCodeReferenceElement)) return false; - if (((PsiJavaCodeReferenceElement)parent).getQualifier() != null) return false; + static boolean isClassNamePossible(CompletionParameters parameters) { + boolean isSecondCompletion = parameters.getInvocationCount() >= 2; + + final PsiElement parent = parameters.getPosition().getParent(); + if (!(parent instanceof PsiJavaCodeReferenceElement)) return isSecondCompletion; + if (((PsiJavaCodeReferenceElement)parent).getQualifier() != null) return isSecondCompletion; if (parent instanceof PsiJavaCodeReferenceElementImpl && ((PsiJavaCodeReferenceElementImpl)parent).getKind() == PsiJavaCodeReferenceElementImpl.PACKAGE_NAME_KIND) { @@ -396,7 +397,7 @@ public class JavaCompletionContributor extends CompletionContributor { } if (psiElement().inside(PsiImportStatement.class).accepts(parent)) { - return false; + return isSecondCompletion; } if (grand instanceof PsiAnonymousClass) { @@ -406,7 +407,7 @@ public class JavaCompletionContributor extends CompletionContributor { return false; } - if (JavaCompletionData.isAfterPrimitiveOrArrayType(position)) { + if (JavaCompletionData.isAfterPrimitiveOrArrayType(parameters.getPosition())) { return false; } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java index d860c328b4af..0e19ad9e7f20 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java @@ -74,7 +74,7 @@ public class JavaNoVariantsDelegator extends CompletionContributor { if (parameters.getInvocationCount() <= 1 && JavaCompletionContributor.mayStartClassName(result) && - JavaCompletionContributor.isClassNamePossible(position)) { + JavaCompletionContributor.isClassNamePossible(parameters)) { suggestNonImportedClasses(parameters, result); return; } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/FragmentCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/FragmentCompletionTest.groovy index ef000f242762..d1a93f36494e 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/FragmentCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/FragmentCompletionTest.groovy @@ -41,6 +41,16 @@ public class FragmentCompletionTest extends LightCodeInsightFixtureTestCase { assert !('import' in myFixture.lookupElementStrings) } + public void "test no classes in reference code fragment"() throws Throwable { + myFixture.addClass("package foo; public interface FooIntf { }") + + def text = "FooInt" + PsiFile file = JavaCodeFragmentFactory.getInstance(project).createReferenceCodeFragment(text, null, true, false); + myFixture.configureFromExistingVirtualFile(file.getVirtualFile()); + assert !myFixture.complete(CompletionType.BASIC, 2) + myFixture.checkResult(text) + } + public void testNoPackagesInExpressionCodeFragment() throws Throwable { final String text = "jav"; PsiFile file = JavaCodeFragmentFactory.getInstance(project).createExpressionCodeFragment(text, null, null, true);