mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-19 13:02:30 +07:00
ExpectedTypeInfoImpl.fixUnresolvedType: support raw types, honor class exclusions (IDEA-CR-65030)
GitOrigin-RevId: 65589bf06d6e4c886bdbd97d37f7e5cc556b6526
This commit is contained in:
committed by
intellij-monorepo-bot
parent
39f69b2c97
commit
6b2e1c7c83
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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<>();
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
class Main {
|
||||
{
|
||||
List list = new <caret>
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user