IDEA-87697 remove static import if cannot use non qualified ref

This commit is contained in:
Maxim.Medvedev
2012-06-26 10:46:30 +04:00
parent ce82ebdfe3
commit 492f88c1be
2 changed files with 33 additions and 22 deletions
@@ -42,21 +42,27 @@ public class ImportStaticIntention extends Intention {
private static final Key<PsiElement> TEMP_REFERENT_USER_DATA = new Key<PsiElement>("TEMP_REFERENT_USER_DATA");
@Override
protected void processIntention(@NotNull PsiElement element, Project project, Editor editor) throws IncorrectOperationException {
protected void processIntention(@NotNull PsiElement element, final Project project, final Editor editor)
throws IncorrectOperationException {
final PsiElement resolved;
final String name;
final GroovyFile file;
final GrImportStatement importStatement;
boolean isAnythingShortened;
if (!(element instanceof GrReferenceExpression)) return;
final GrReferenceExpression ref = (GrReferenceExpression)element;
final PsiElement resolved = ref.resolve();
resolved = ref.resolve();
if (!(resolved instanceof PsiMember)) return;
final PsiClass containingClass = ((PsiMember)resolved).getContainingClass();
if (containingClass == null) return;
final String qname = containingClass.getQualifiedName();
final String name = ((PsiMember)resolved).getName();
name = ((PsiMember)resolved).getName();
if (name == null) return;
final PsiFile containingFile = element.getContainingFile();
if (!(containingFile instanceof GroovyFile)) return;
final GroovyFile file = (GroovyFile)containingFile;
file = (GroovyFile)containingFile;
file.accept(new GroovyRecursiveElementVisitor() {
@Override
public void visitReferenceExpression(GrReferenceExpression expression) {
@@ -70,19 +76,22 @@ public class ImportStaticIntention extends Intention {
}
});
final GrImportStatement importStatement =
GroovyPsiElementFactory.getInstance(project).createImportStatementFromText(qname + "." + name, true, false, null);
file.addImport(importStatement);
final GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(project);
final GrImportStatement tempImport = factory.createImportStatementFromText(qname + "." + name, true, false, null);
importStatement = file.addImport(tempImport);
isAnythingShortened = false;
for (PsiReference reference : ReferencesSearch.search(resolved, new LocalSearchScope(containingFile))) {
final PsiElement refElement = reference.getElement();
if (refElement instanceof GrQualifiedReference<?>) {
GrReferenceAdjuster.shortenReference((GrQualifiedReference<?>)refElement);
isAnythingShortened |= GrReferenceAdjuster.shortenReference((GrQualifiedReference<?>)refElement);
}
}
if (!isAnythingShortened) {
importStatement.delete();
return;
}
file.accept(new GroovyRecursiveElementVisitor() {
@Override
@@ -41,38 +41,40 @@ public class GrReferenceAdjuster {
}
public static void shortenReferences(PsiElement element) {
public static boolean shortenReferences(PsiElement element) {
final TextRange range = element.getTextRange();
shortenReferences(element, range.getStartOffset(), range.getEndOffset(), true, false);
return shortenReferences(element, range.getStartOffset(), range.getEndOffset(), true, false);
}
public static void shortenReferences(PsiElement element, int start, int end, boolean addImports, boolean incomplete) {
process(element, start, end, addImports, incomplete);
public static boolean shortenReferences(PsiElement element, int start, int end, boolean addImports, boolean incomplete) {
return process(element, start, end, addImports, incomplete);
}
public static <T extends PsiElement> void shortenReference(GrQualifiedReference<T> ref) {
shortenReferenceInner(ref, true, false);
public static <T extends PsiElement> boolean shortenReference(GrQualifiedReference<T> ref) {
boolean result = shortenReferenceInner(ref, true, false);
final TextRange range = ref.getTextRange();
process(ref, range.getStartOffset(), range.getEndOffset(), true, false);
result |= process(ref, range.getStartOffset(), range.getEndOffset(), true, false);
return result;
}
private static void process(PsiElement element, int start, int end, boolean addImports, boolean incomplete) {
private static boolean process(PsiElement element, int start, int end, boolean addImports, boolean incomplete) {
boolean result = false;
if (element instanceof GrQualifiedReference<?> && ((GrQualifiedReference)element).resolve() instanceof PsiClass) {
shortenReferenceInner((GrQualifiedReference<?>)element, addImports, incomplete);
result = shortenReferenceInner((GrQualifiedReference<?>)element, addImports, incomplete);
}
else if (element instanceof GrReferenceExpression && ((GrReferenceExpression)element).getQualifier() instanceof GrThisSuperReferenceExpression) {
shortenReferenceInner((GrReferenceExpression)element, addImports, incomplete);
result = shortenReferenceInner((GrReferenceExpression)element, addImports, incomplete);
}
PsiElement child = element.getFirstChild();
while (child != null) {
final TextRange range = child.getTextRange();
if (start < range.getEndOffset() && range.getStartOffset() < end) {
process(child, start, end, addImports, incomplete);
result |= process(child, start, end, addImports, incomplete);
}
child = child.getNextSibling();
}
return result;
}
private static <Qualifier extends PsiElement> boolean shortenReferenceInner(GrQualifiedReference<Qualifier> ref, boolean addImports, boolean incomplete) {