[java-completion] IDEA-292773 autocomplete should expand also the ".class" automatically when requested argument type is a java.lang.Class

GitOrigin-RevId: 064de8edd56681c0ef9720199ae002eb12e4ca92
This commit is contained in:
Tagir Valeev
2022-05-05 18:11:18 +00:00
committed by intellij-monorepo-bot
parent db1020655b
commit df4d5e6486
6 changed files with 33 additions and 7 deletions
@@ -46,6 +46,7 @@ import com.intellij.psi.filters.classes.AssignableFromContextFilter;
import com.intellij.psi.filters.classes.NoFinalLibraryClassesFilter;
import com.intellij.psi.filters.element.ExcludeDeclaredFilter;
import com.intellij.psi.filters.element.ModifierFilter;
import com.intellij.psi.filters.getters.ClassLiteralGetter;
import com.intellij.psi.filters.getters.ExpectedTypesGetter;
import com.intellij.psi.filters.getters.JavaMembersGetter;
import com.intellij.psi.filters.types.AssignableFromFilter;
@@ -437,6 +438,12 @@ public final class JavaCompletionContributor extends CompletionContributor imple
if (smart) {
hasTypeMatchingSuggestions |= smartCompleteExpression(parameters, result, expectedInfos);
smartCompleteNonExpression(parameters, result);
} else {
if (!JavaKeywordCompletion.AFTER_DOT.accepts(position)) {
for (ExpectedTypeInfo info : expectedInfos) {
ClassLiteralGetter.addCompletions(new JavaSmartCompletionParameters(parameters, info), result, matcher);
}
}
}
if ((!hasTypeMatchingSuggestions || parameters.getInvocationCount() >= 2) &&
@@ -4,6 +4,7 @@ package com.intellij.psi.filters.getters;
import com.intellij.codeInsight.CodeInsightUtil;
import com.intellij.codeInsight.completion.JavaSmartCompletionParameters;
import com.intellij.codeInsight.completion.PrefixMatcher;
import com.intellij.codeInsight.completion.PrioritizedLookupElement;
import com.intellij.codeInsight.lookup.AutoCompletionPolicy;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.openapi.util.text.StringUtil;
@@ -12,6 +13,7 @@ import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.Consumer;
import com.intellij.util.IncorrectOperationException;
import com.siyeh.ig.psiutils.TypeUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -34,7 +36,8 @@ public final class ClassLiteralGetter {
if (classParameter instanceof PsiWildcardType) {
final PsiWildcardType wildcardType = (PsiWildcardType)classParameter;
classParameter = wildcardType.isSuper() ? wildcardType.getSuperBound() : wildcardType.getExtendsBound();
addInheritors = wildcardType.isExtends() && classParameter instanceof PsiClassType;
addInheritors = !wildcardType.isSuper() && classParameter instanceof PsiClassType &&
!(matcher.getPrefix().isEmpty() && TypeUtils.isJavaLangObject(classParameter));
} else if (!matcher.getPrefix().isEmpty()) {
addInheritors = true;
classParameter = PsiType.getJavaLangObject(position.getManager(), position.getResolveScope());
@@ -3,7 +3,7 @@
}
class Foo {
@TestFor(testForClass = { Object.class, Aaaaaaaaaaaaaaaaaaaaa<caret> } )
@TestFor(testForClass = { Object.class, Aaaaaaaaaaaaaaaaaaaaa.class<caret> } )
public void foo22() {}
}
@@ -3,7 +3,7 @@
}
class Foo {
@TestFor(testForClass = { Aaaaaaaaaaaaaaaaaaaaa<caret> } )
@TestFor(testForClass = { Aaaaaaaaaaaaaaaaaaaaa.class<caret> } )
public void foo22() {}
}
@@ -621,7 +621,7 @@ interface TxANotAnno {}
@NeedsIndex.ForStandardLibrary
void testPreferClassesOfExpectedClassType() {
myFixture.addClass "class XException extends Exception {}"
checkPreferredItems 0, 'XException', 'XClass', 'XIntf'
checkPreferredItems 0, 'XException.class', 'XException', 'XClass', 'XIntf'
}
void testNoNumberValueOf() {
@@ -204,9 +204,11 @@ class NormalCompletionTest extends NormalCompletionTestCase {
assertTrue("Exception not found", Arrays.binarySearch(myItems, "xxx") > 0)
}
void testClassLiteralInArrayAnnoInitializer() throws Throwable { doTest() }
@NeedsIndex.ForStandardLibrary
void testClassLiteralInArrayAnnoInitializer() throws Throwable { doTest('\n') }
void testClassLiteralInArrayAnnoInitializer2() throws Throwable { doTest() }
@NeedsIndex.ForStandardLibrary
void testClassLiteralInArrayAnnoInitializer2() throws Throwable { doTest('\n') }
void testReferenceParameters() throws Exception {
configureByFile("ReferenceParameters.java")
@@ -1368,7 +1370,7 @@ class XInternalError {}
@Anno(XInternal<caret>)
"""
myFixture.complete(CompletionType.BASIC, 2)
assertFirstStringItems "XInternalError", "XInternalTimerServiceController"
assertFirstStringItems "XInternalError.class", "XInternalError", "XInternalTimerServiceController.class", "XInternalTimerServiceController"
}
@NeedsIndex.Full
@@ -2660,4 +2662,18 @@ class Abc {
myFixture.completeBasic()
myFixture.checkResult("class Test {static void test() {int \u89D2\u8272 = 3;\u89D2\u8272}}")
}
@NeedsIndex.ForStandardLibrary
void testClassLiteralCompletion() {
myFixture.configureByText("Test.java", "class Test {Class<? extends CharSequence> get() {return String<caret>}}")
myFixture.completeBasic()
myFixture.assertPreferredCompletionItems(0, 'String', 'String.class', 'StringBuffer.class', 'StringBuffer', 'StringBuilder.class', 'StringBuilder', 'StringIndexOutOfBoundsException')
}
@NeedsIndex.ForStandardLibrary
void testClassLiteralCompletionNoBound() {
myFixture.configureByText("Test.java", "class Test {Class<?> get() {return String<caret>}}")
myFixture.completeBasic()
myFixture.assertPreferredCompletionItems(0, 'String', 'String.class', 'StringBuffer.class', 'StringBuffer', 'StringBuilder.class', 'StringBuilder', 'StringIndexOutOfBoundsException.class', 'StringIndexOutOfBoundsException')
}
}