don't auto-import classes where class references are prohibited syntactically (IDEA-127190)

This commit is contained in:
peter
2014-07-11 17:16:28 +02:00
parent f87e56d346
commit 93d37fa7f9
3 changed files with 84 additions and 2 deletions
@@ -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();
@@ -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"))
}