mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
optimize imports with on-demand conflicts (IDEA-164133)
explicit import for a class in the same package/file is redundant as it's implicitly imported is preferred to on-demand imported classes
This commit is contained in:
@@ -40,6 +40,7 @@ import com.intellij.psi.search.LocalSearchScope;
|
||||
import com.intellij.psi.search.searches.ReferencesSearch;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import com.intellij.psi.util.ClassUtil;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.util.ObjectUtils;
|
||||
@@ -339,6 +340,7 @@ public class ImportHelper{
|
||||
}
|
||||
}
|
||||
if (!conflicts.isEmpty() && !(file instanceof PsiCompiledElement)) {
|
||||
String packageName = file.getPackageName();
|
||||
file.accept(new JavaRecursiveElementVisitor() {
|
||||
@Override
|
||||
public void visitReferenceElement(PsiJavaCodeReferenceElement reference) {
|
||||
@@ -346,7 +348,11 @@ public class ImportHelper{
|
||||
PsiElement element = reference.resolve();
|
||||
if (element instanceof PsiClass && conflicts.contains(((PsiClass)element).getName())) {
|
||||
String fqn = ((PsiClass)element).getQualifiedName();
|
||||
outNamesToUseSingle.add(fqn);
|
||||
if (fqn != null &&
|
||||
!PsiTreeUtil.isAncestor(file, element, true) &&
|
||||
!packageName.equals(StringUtil.getPackageName(fqn))) {
|
||||
outNamesToUseSingle.add(fqn);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
package foo;
|
||||
|
||||
import static foo.C.*;
|
||||
import static foo.D.*;
|
||||
|
||||
import foo.B.A;
|
||||
|
||||
class C {
|
||||
public static class A {}
|
||||
public static class C1 {}
|
||||
public static class C2 {}
|
||||
public static class C3 {}
|
||||
public static class C4 {}
|
||||
public static class C5 {}
|
||||
}
|
||||
|
||||
class D {
|
||||
public static class A {}
|
||||
public static class D1 {}
|
||||
public static class D2 {}
|
||||
public static class D3 {}
|
||||
public static class D4 {}
|
||||
public static class D5 {}
|
||||
}
|
||||
|
||||
class B {
|
||||
public static class A { }
|
||||
|
||||
A aField;
|
||||
C1 c;
|
||||
C2 c1;
|
||||
C3 c2;
|
||||
C4 c3;
|
||||
C5 c4;
|
||||
D1 d;
|
||||
D2 d1;
|
||||
D3 d2;
|
||||
D4 d3;
|
||||
D5 d4;
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package foo;
|
||||
|
||||
import static foo.C.*;
|
||||
import static foo.D.*;
|
||||
|
||||
class C {
|
||||
public static class A {}
|
||||
public static class C1 {}
|
||||
public static class C2 {}
|
||||
public static class C3 {}
|
||||
public static class C4 {}
|
||||
public static class C5 {}
|
||||
}
|
||||
|
||||
class D {
|
||||
public static class A {}
|
||||
public static class D1 {}
|
||||
public static class D2 {}
|
||||
public static class D3 {}
|
||||
public static class D4 {}
|
||||
public static class D5 {}
|
||||
}
|
||||
|
||||
class B {
|
||||
public static class A { }
|
||||
|
||||
A aField;
|
||||
C1 c;
|
||||
C2 c1;
|
||||
C3 c2;
|
||||
C4 c3;
|
||||
C5 c4;
|
||||
D1 d;
|
||||
D2 d1;
|
||||
D3 d2;
|
||||
D4 d3;
|
||||
D5 d4;
|
||||
}
|
||||
@@ -53,6 +53,10 @@ public class OptimizeImportsTest extends OptimizeImportsTestCase {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testConflictingOnDemandImports() {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testExcludeNonStaticElementsFromStaticConflictingMembers() {
|
||||
doTest();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user