mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
don't auto-import classes where class references are prohibited syntactically (IDEA-127190)
This commit is contained in:
@@ -30,6 +30,7 @@ import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.ClassUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class ImportClassFix extends ImportClassFixBase<PsiJavaCodeReferenceElement, PsiJavaCodeReferenceElement> {
|
||||
@@ -107,9 +108,21 @@ public class ImportClassFix extends ImportClassFixBase<PsiJavaCodeReferenceEleme
|
||||
return super.getRequiredMemberName(reference);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canReferenceClass(PsiJavaCodeReferenceElement ref) {
|
||||
if (ref instanceof PsiReferenceExpression) {
|
||||
return ref.getParent() instanceof PsiReferenceExpression;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
protected List<PsiClass> filterByContext(@NotNull List<PsiClass> candidates, @NotNull PsiJavaCodeReferenceElement ref) {
|
||||
if (ref instanceof PsiReferenceExpression) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
PsiElement typeElement = ref.getParent();
|
||||
if (typeElement instanceof PsiTypeElement) {
|
||||
PsiElement var = typeElement.getParent();
|
||||
|
||||
+11
-2
@@ -102,14 +102,19 @@ public abstract class ImportClassFixBase<T extends PsiElement, R extends PsiRefe
|
||||
// can happen when e.g. class name happened to be in a method position
|
||||
if (element instanceof PsiClass && result.isValidResult()) return Collections.emptyList();
|
||||
}
|
||||
PsiShortNamesCache cache = PsiShortNamesCache.getInstance(myElement.getProject());
|
||||
|
||||
String name = getReferenceName(myRef);
|
||||
GlobalSearchScope scope = myElement.getResolveScope();
|
||||
if (name == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
if (!canReferenceClass(myRef)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
boolean referenceHasTypeParameters = hasTypeParameters(myRef);
|
||||
PsiClass[] classes = cache.getClassesByName(name, scope);
|
||||
PsiClass[] classes = PsiShortNamesCache.getInstance(myElement.getProject()).getClassesByName(name, scope);
|
||||
if (classes.length == 0) return Collections.emptyList();
|
||||
List<PsiClass> classList = new ArrayList<PsiClass>(classes.length);
|
||||
boolean isAnnotationReference = myElement.getParent() instanceof PsiAnnotation;
|
||||
@@ -140,6 +145,10 @@ public abstract class ImportClassFixBase<T extends PsiElement, R extends PsiRefe
|
||||
return classList;
|
||||
}
|
||||
|
||||
protected boolean canReferenceClass(R ref) {
|
||||
return true;
|
||||
}
|
||||
|
||||
private List<PsiClass> filterByRequiredMemberName(List<PsiClass> classList) {
|
||||
final String memberName = getRequiredMemberName(myElement);
|
||||
if (memberName != null) {
|
||||
|
||||
@@ -177,6 +177,66 @@ class Test {
|
||||
'''
|
||||
}
|
||||
|
||||
public void "test import class in class reference expression"() {
|
||||
myFixture.configureByText 'a.java', '''
|
||||
class Test {
|
||||
{
|
||||
equals(Co<caret>llection.class);
|
||||
}
|
||||
}
|
||||
'''
|
||||
importClass();
|
||||
myFixture.checkResult '''import java.util.Collection;
|
||||
|
||||
class Test {
|
||||
{
|
||||
equals(Co<caret>llection.class);
|
||||
}
|
||||
}
|
||||
'''
|
||||
}
|
||||
|
||||
public void "test import class in qualifier expression"() {
|
||||
myFixture.configureByText 'a.java', '''
|
||||
class Test {
|
||||
{
|
||||
equals(Co<caret>llections.emptySet());
|
||||
}
|
||||
}
|
||||
'''
|
||||
importClass();
|
||||
myFixture.checkResult '''import java.util.Collections;
|
||||
|
||||
class Test {
|
||||
{
|
||||
equals(Co<caret>llections.emptySet());
|
||||
}
|
||||
}
|
||||
'''
|
||||
}
|
||||
|
||||
public void "test don't import class in method call argument"() {
|
||||
myFixture.configureByText 'a.java', '''
|
||||
class Test {
|
||||
{
|
||||
equals(Co<caret>llection);
|
||||
}
|
||||
}
|
||||
'''
|
||||
assert !myFixture.filterAvailableIntentions("Import Class")
|
||||
}
|
||||
|
||||
public void "test don't import class in assignment"() {
|
||||
myFixture.configureByText 'a.java', '''
|
||||
class Test {
|
||||
{
|
||||
Co<caret>llection = 2;
|
||||
}
|
||||
}
|
||||
'''
|
||||
assert !myFixture.filterAvailableIntentions("Import Class")
|
||||
}
|
||||
|
||||
private def importClass() {
|
||||
myFixture.launchAction(myFixture.findSingleIntention("Import Class"))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user