IDEA-230334 Make first Ctrl+Space work in Class.forName literal

GitOrigin-RevId: 96cbc8f8a65b6853c1a7cd7b9977b4d33ff56062
This commit is contained in:
Peter Gromov
2020-06-09 08:44:29 +02:00
committed by intellij-monorepo-bot
parent a4d6d00243
commit 571af6bb9c
6 changed files with 26 additions and 2 deletions

View File

@@ -1224,7 +1224,7 @@
<lookup.charFilter implementation="com.intellij.codeInsight.completion.JavaCharFilter" id="java"/>
<completion.contributor language="JAVA" id="javaMethodHandle" order="last, before javaLegacy"
implementationClass="com.intellij.psi.impl.source.resolve.reference.impl.JavaMethodHandleCompletionContributor"/>
<completion.contributor language="JAVA" id="javaReflection" order="last, before javaLegacy"
<completion.contributor language="JAVA" id="javaReflection" order="before javaLegacy, before javaClassReference"
implementationClass="com.intellij.psi.impl.source.resolve.reference.impl.JavaReflectionCompletionContributor"/>
<completion.contributor language="JAVA" id="javaSmart" order="last, before default"
implementationClass="com.intellij.codeInsight.completion.JavaSmartCompletionContributor"/>

View File

@@ -19,6 +19,7 @@ import com.intellij.psi.filters.ClassFilter;
import com.intellij.psi.filters.ElementFilter;
import com.intellij.psi.filters.TrueFilter;
import com.intellij.psi.filters.element.ExcludeDeclaredFilter;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.JavaClassReference;
import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.searches.DirectClassInheritorsSearch;
@@ -84,6 +85,12 @@ public class JavaClassNameCompletionContributor extends CompletionContributor {
@NotNull final Consumer<? super LookupElement> consumer) {
final PsiElement insertedElement = parameters.getPosition();
JavaClassReference ref =
JavaClassReferenceCompletionContributor.findJavaClassReference(insertedElement.getContainingFile(), parameters.getOffset());
if (ref != null && ref.getContext() instanceof PsiClass) {
return;
}
if (JavaCompletionContributor.getAnnotationNameIfInside(insertedElement) != null) {
MultiMap<String, PsiClass> annoMap = getAllAnnotationClasses(insertedElement, matcher);
Processor<PsiClass> processor = new LimitedAccessibleClassPreprocessor(parameters, filterByScope, anno -> {

View File

@@ -93,6 +93,9 @@ public class JavaReflectionCompletionContributor extends CompletionContributor {
else if (BEGINNING_OF_CONSTRUCTOR_ARGUMENTS.accepts(position)) {
addVariants(position, (psiClass, isDeclared) -> addConstructorParameterTypes(psiClass, isDeclared, result));
}
else if (JavaReflectionReferenceContributor.Holder.CLASS_PATTERN.accepts(position.getParent())) {
JavaClassNameCompletionContributor.addAllClasses(parameters, parameters.getInvocationCount() <= 1, result.getPrefixMatcher(), result);
}
}
private static void addVariants(PsiElement position, BiConsumer<? super PsiClass, ? super Boolean> variantAdder) {

View File

@@ -0,0 +1,5 @@
class Main {
void foo() throws ReflectiveOperationException {
Class.forName("StringBu<caret>");
}
}

View File

@@ -0,0 +1,5 @@
class Main {
void foo() throws ReflectiveOperationException {
Class.forName("java.lang.StringBuffer<caret>");
}
}

View File

@@ -168,7 +168,11 @@ public class JavaReflectionCompletionTest extends LightFixtureCompletionTestCase
public void testClassForNamePackages() {
myFixture.addClass("package foo.bar.one; public class FirstClass {}");
myFixture.addClass("package foo.bar.two; public class SecondClass {}");
doTest(0, "one", "two");
doTest(2, "FirstClass", "SecondClass", "one", "two");
}
public void testClassForNameShortName() {
doTest(0, "StringBuffer", "StringBuilder");
}
public void testClassForNameNestedAutocomplete() {