Skip to content

Commit 85e6c77

Browse files
authored
Fix organize imports to recognize forbidden static favorites (#2924)
- add new JavaElementUtil.isForbiddenOnClasspath() method to figure out if a qualified name is forbidden or discouraged on the class path of the project of a given type root - modify UnresolvedElementBaseSubProcessor to use new API - modify OrganizeImportsOperation to check if a static import from the favorites is forbidden in the class path of the compilation unit - add new test to ImportOrganizeTest1d8 - fixes #2893
1 parent a0e1871 commit 85e6c77

4 files changed

Lines changed: 180 additions & 56 deletions

File tree

org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/core/manipulation/OrganizeImportsOperation.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
import org.eclipse.jdt.internal.corext.dom.ASTNodes;
7979
import org.eclipse.jdt.internal.corext.dom.Bindings;
8080
import org.eclipse.jdt.internal.corext.dom.ScopeAnalyzer;
81+
import org.eclipse.jdt.internal.corext.refactoring.util.JavaElementUtil;
8182
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
8283
import org.eclipse.jdt.internal.corext.util.JdtFlags;
8384
import org.eclipse.jdt.internal.corext.util.StaticImportFavoritesCompletionInvoker;
@@ -820,9 +821,14 @@ private void addStaticImports(
820821
}
821822
String[] staticFavourites= ex.getStaticImportFavorites(identifier, isMethod);
822823
fResolvedStaticFavoriteImports.add(identifier);
823-
if (staticFavourites.length > 0) {
824-
String qualifiedTypeName= Signature.getQualifier(staticFavourites[0]);
825-
importRewrite.addStaticImport(qualifiedTypeName, identifier, !isMethod);
824+
int i= 0;
825+
while (i < staticFavourites.length) {
826+
String qualifiedTypeName= Signature.getQualifier(staticFavourites[i]);
827+
if (!JavaElementUtil.isForbiddenOnClasspath(importRewrite.getCompilationUnit(), qualifiedTypeName)) {
828+
importRewrite.addStaticImport(qualifiedTypeName, identifier, !isMethod);
829+
break;
830+
}
831+
++i;
826832
}
827833
} catch (JavaModelException e) {
828834
return;
@@ -837,7 +843,6 @@ private void addStaticImports(
837843
}
838844
}
839845

840-
841846
// find type references in a compilation unit
842847
private boolean collectReferences(CompilationUnit astRoot, List<SimpleName> typeReferences, List<SimpleName> staticReferences, Set<String> oldSingleImports,
843848
Set<String> oldDemandImports, Map<String, Set<String>> oldModuleImports) {

org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/UnresolvedElementsBaseSubProcessor.java

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232

3333
import org.eclipse.core.runtime.CoreException;
3434
import org.eclipse.core.runtime.FileLocator;
35-
import org.eclipse.core.runtime.IPath;
3635
import org.eclipse.core.runtime.IProgressMonitor;
3736
import org.eclipse.core.runtime.IStatus;
3837
import org.eclipse.core.runtime.NullProgressMonitor;
@@ -46,8 +45,6 @@
4645
import org.eclipse.ltk.core.refactoring.resource.DeleteResourceChange;
4746
import org.eclipse.ltk.core.refactoring.resource.ResourceChange;
4847

49-
import org.eclipse.jdt.core.IAccessRule;
50-
import org.eclipse.jdt.core.IClasspathEntry;
5148
import org.eclipse.jdt.core.ICompilationUnit;
5249
import org.eclipse.jdt.core.IJavaElement;
5350
import org.eclipse.jdt.core.IJavaProject;
@@ -59,7 +56,6 @@
5956
import org.eclipse.jdt.core.JavaCore;
6057
import org.eclipse.jdt.core.JavaModelException;
6158
import org.eclipse.jdt.core.Signature;
62-
import org.eclipse.jdt.core.compiler.CharOperation;
6359
import org.eclipse.jdt.core.compiler.IProblem;
6460
import org.eclipse.jdt.core.dom.AST;
6561
import org.eclipse.jdt.core.dom.ASTMatcher;
@@ -138,6 +134,7 @@
138134
import org.eclipse.jdt.internal.corext.dom.IASTSharedValues;
139135
import org.eclipse.jdt.internal.corext.dom.ScopeAnalyzer;
140136
import org.eclipse.jdt.internal.corext.refactoring.changes.ClasspathChange;
137+
import org.eclipse.jdt.internal.corext.refactoring.util.JavaElementUtil;
141138
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
142139
import org.eclipse.jdt.internal.corext.util.Messages;
143140
import org.eclipse.jdt.internal.corext.util.TypeFilter;
@@ -1530,7 +1527,8 @@ private void addStaticImportFavoriteProposals(IInvocationContext context, Simple
15301527
String qualifiedTypeName= Signature.getQualifier(Signature.getTypeErasure(curr));
15311528
String elementLabel= BasicElementLabels.getJavaElementName(JavaModelUtil.concatenateName(Signature.getSimpleName(qualifiedTypeName), name));
15321529

1533-
if (isForbidden(root, qualifiedTypeName)) {
1530+
ITypeRoot typeRoot= root.getTypeRoot();
1531+
if (typeRoot != null && JavaElementUtil.isForbiddenOnClasspath(typeRoot, qualifiedTypeName)) {
15341532
continue;
15351533
}
15361534

@@ -1554,30 +1552,6 @@ private void addStaticImportFavoriteProposals(IInvocationContext context, Simple
15541552
}
15551553
}
15561554

1557-
private boolean isForbidden(CompilationUnit root, String qualifiedTypeName) throws JavaModelException {
1558-
String qualifiedPathName= qualifiedTypeName.replace('.', '/');
1559-
IJavaElement type= root.getJavaElement().getJavaProject().findElement(IPath.fromPortableString(qualifiedPathName).removeLastSegments(1));
1560-
while (type != null) {
1561-
IClasspathEntry entry= root.getJavaElement().getJavaProject().getClasspathEntryFor(type.getPath());
1562-
if (entry != null) {
1563-
for (IAccessRule rule : entry.getAccessRules()) {
1564-
if (CharOperation.pathMatch(rule.getPattern().toString().toCharArray(), qualifiedPathName.toCharArray(),
1565-
true/*case sensitive*/, '/')) {
1566-
switch (rule.getKind()) {
1567-
case IAccessRule.K_NON_ACCESSIBLE:
1568-
case IAccessRule.K_DISCOURAGED:
1569-
return true;
1570-
default:
1571-
break;
1572-
}
1573-
}
1574-
}
1575-
}
1576-
type= type.getParent();
1577-
}
1578-
return false;
1579-
}
1580-
15811555
// 1400
15821556
private void addNewMethodProposals(ICompilationUnit cu, CompilationUnit astRoot, Expression sender, List<Expression> arguments, boolean isSuperInvocation, ASTNode invocationNode, String methodName, Collection<T> proposals) throws JavaModelException {
15831557
ITypeBinding nodeParentType= Bindings.getBindingOfParentType(invocationNode);

org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/refactoring/util/JavaElementUtil.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@
2222
import java.util.Set;
2323

2424
import org.eclipse.core.runtime.Assert;
25+
import org.eclipse.core.runtime.IPath;
2526

2627
import org.eclipse.core.resources.ResourcesPlugin;
2728

29+
import org.eclipse.jdt.core.IAccessRule;
2830
import org.eclipse.jdt.core.IClasspathEntry;
2931
import org.eclipse.jdt.core.ICompilationUnit;
3032
import org.eclipse.jdt.core.IField;
@@ -36,10 +38,12 @@
3638
import org.eclipse.jdt.core.IPackageFragmentRoot;
3739
import org.eclipse.jdt.core.ISourceReference;
3840
import org.eclipse.jdt.core.IType;
41+
import org.eclipse.jdt.core.ITypeRoot;
3942
import org.eclipse.jdt.core.JavaCore;
4043
import org.eclipse.jdt.core.JavaModelException;
4144
import org.eclipse.jdt.core.Signature;
4245
import org.eclipse.jdt.core.SourceRange;
46+
import org.eclipse.jdt.core.compiler.CharOperation;
4347

4448
import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels;
4549
import org.eclipse.jdt.internal.corext.refactoring.RefactoringCoreMessages;
@@ -248,4 +252,32 @@ public static boolean isSourceAvailable(ISourceReference sourceReference) {
248252
return false;
249253
}
250254
}
255+
256+
public static boolean isForbiddenOnClasspath(ITypeRoot root, String qualifiedTypeName) throws JavaModelException {
257+
IJavaProject javaProject= root.getJavaProject();
258+
if (javaProject != null) {
259+
String qualifiedPathName= qualifiedTypeName.replace('.', '/');
260+
IJavaElement type= javaProject.findElement(IPath.fromPortableString(qualifiedPathName).removeLastSegments(1));
261+
while (type != null) {
262+
IClasspathEntry entry= javaProject.getClasspathEntryFor(type.getPath());
263+
if (entry != null) {
264+
for (IAccessRule rule : entry.getAccessRules()) {
265+
if (CharOperation.pathMatch(rule.getPattern().toString().toCharArray(), qualifiedPathName.toCharArray(),
266+
true/*case sensitive*/, '/')) {
267+
switch (rule.getKind()) {
268+
case IAccessRule.K_NON_ACCESSIBLE:
269+
case IAccessRule.K_DISCOURAGED:
270+
return true;
271+
default:
272+
break;
273+
}
274+
}
275+
}
276+
}
277+
type= type.getParent();
278+
}
279+
}
280+
return false;
281+
}
282+
251283
}

0 commit comments

Comments
 (0)