ExpectedTypeInfoImpl.fixUnresolvedType: support raw types, honor class exclusions (IDEA-CR-65030)

GitOrigin-RevId: 65589bf06d6e4c886bdbd97d37f7e5cc556b6526
This commit is contained in:
Peter Gromov
2020-07-15 10:58:55 +02:00
committed by intellij-monorepo-bot
parent 39f69b2c97
commit 6b2e1c7c83
4 changed files with 33 additions and 8 deletions

View File

@@ -16,6 +16,7 @@
*/
package com.intellij.codeInsight;
import com.intellij.codeInsight.daemon.impl.quickfix.ImportClassFixBase;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.NullableComputable;
import com.intellij.openapi.util.NullableLazyValue;
@@ -198,7 +199,9 @@ public class ExpectedTypeInfoImpl implements ExpectedTypeInfo {
PsiResolveHelper helper = PsiResolveHelper.SERVICE.getInstance(project);
List<PsiClass> suitableClasses = ContainerUtil.filter(
PsiShortNamesCache.getInstance(project).getClassesByName(className, context.getResolveScope()),
c -> c.getTypeParameters().length == typeParamCount && helper.isAccessible(c, context, null));
c -> (typeParamCount == 0 || c.hasTypeParameters()) &&
helper.isAccessible(c, context, null) &&
ImportClassFixBase.qualifiedNameAllowsAutoImport(context.getContainingFile(), c));
if (suitableClasses.size() == 1) {
return PsiElementFactory.getInstance(project).createType(suitableClasses.get(0), ((PsiClassType)type).getParameters());
}

View File

@@ -130,13 +130,8 @@ public abstract class ImportClassFixBase<T extends PsiElement, R extends PsiRefe
final PsiFile file = myElement.getContainingFile();
for (PsiClass aClass : classes) {
if (isAnnotationReference && !aClass.isAnnotationType()) continue;
if (JavaCompletionUtil.isInExcludedPackage(aClass, false)) continue;
String qName = aClass.getQualifiedName();
if (qName != null) { //filter local classes
if (qName.indexOf('.') == -1 || !PsiNameHelper.getInstance(project).isQualifiedName(qName)) continue; //do not show classes from default or invalid package
if (qName.endsWith(name) && (file == null || ImportFilter.shouldImport(file, qName))) {
classList.add(aClass);
}
if (qualifiedNameAllowsAutoImport(file, aClass)) {
classList.add(aClass);
}
}
@@ -158,6 +153,20 @@ public abstract class ImportClassFixBase<T extends PsiElement, R extends PsiRefe
return removeDuplicates(classList);
}
public static boolean qualifiedNameAllowsAutoImport(@NotNull PsiFile placeFile, @NotNull PsiClass aClass) {
if (JavaCompletionUtil.isInExcludedPackage(aClass, false)) {
return false;
}
String qName = aClass.getQualifiedName();
if (qName != null) { //filter local classes
if (qName.indexOf('.') == -1 || !PsiNameHelper.getInstance(placeFile.getProject()).isQualifiedName(qName)) return false;
if (ImportFilter.shouldImport(placeFile, qName)) {
return true;
}
}
return false;
}
@NotNull
private static List<PsiClass> removeDuplicates(@NotNull List<PsiClass> classList) {
Set<String> uniqueNames = new HashSet<>();

View File

@@ -0,0 +1,5 @@
class Main {
{
List list = new <caret>
}
}

View File

@@ -3,6 +3,7 @@ package com.intellij.java.codeInsight.completion;
import com.intellij.JavaTestUtil;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.codeInsight.JavaProjectCodeInsightSettings;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.codeInsight.completion.LightFixtureCompletionTestCase;
import com.intellij.codeInsight.completion.StaticallyImportable;
@@ -1212,6 +1213,13 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase {
myFixture.assertPreferredCompletionItems(1, "List", "ArrayList", "AbstractList");
}
@NeedsIndex.SmartMode(reason = "AbstractExpectedTypeSkipper works in smart mode only")
public void testExpectedTypeAutoImportHonorsExcludes() {
JavaProjectCodeInsightSettings.setExcludedNames(getProject(), getTestRootDisposable(), "java.awt");
configureByTestName();
myFixture.assertPreferredCompletionItems(1, "List", "ArrayList", "AbstractList");
}
@NeedsIndex.SmartMode(reason = "For now ConstructorInsertHandler.createOverrideRunnable doesn't work in dumb mode")
public void testNoWrongSubstitutorFromStats() {
doTest();