Skip to content

Commit d8aa1ed

Browse files
committed
Skip completely inaccessible classpath elements in package caching
1 parent 10639fb commit d8aa1ed

3 files changed

Lines changed: 29 additions & 22 deletions

File tree

org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AccessRestrictionsTests.java

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,28 +1108,13 @@ public void test011() throws CoreException {
11081108
"----------\n" +
11091109
"1. ERROR in /P1/src/q/Y.java (at line 4)\n" +
11101110
" p.X x = new p.X();\n" +
1111-
" ^^^\n" +
1112-
"Access restriction: The type \'X\' is not accessible (restriction on required library \'AccessRestrictions/lib.jar\')\n" +
1111+
" ^\n" +
1112+
"p cannot be resolved to a type\n" +
11131113
"----------\n" +
11141114
"2. ERROR in /P1/src/q/Y.java (at line 4)\n" +
11151115
" p.X x = new p.X();\n" +
1116-
" ^^^\n" +
1117-
"Access restriction: The type \'X\' is not accessible (restriction on required library \'AccessRestrictions/lib.jar\')\n" +
1118-
"----------\n" +
1119-
"3. ERROR in /P1/src/q/Y.java (at line 4)\n" +
1120-
" p.X x = new p.X();\n" +
1121-
" ^^^\n" +
1122-
"Access restriction: The constructor \'X()\' is not accessible (restriction on required library \'AccessRestrictions/lib.jar\')\n" +
1123-
"----------\n" +
1124-
"4. ERROR in /P1/src/q/Y.java (at line 5)\n" +
1125-
" x.foo();\n" +
1126-
" ^^^\n" +
1127-
"Access restriction: The method \'X.foo()\' is not accessible (restriction on required library \'AccessRestrictions/lib.jar\')\n" +
1128-
"----------\n" +
1129-
"5. ERROR in /P1/src/q/Y.java (at line 6)\n" +
1130-
" if (x.m > 0) {}\n" +
1131-
" ^\n" +
1132-
"Access restriction: The field \'X.m\' is not accessible (restriction on required library \'AccessRestrictions/lib.jar\')\n" +
1116+
" ^\n" +
1117+
"p cannot be resolved to a type\n" +
11331118
"----------\n"
11341119
);
11351120
} finally {

org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/NameLookupTests2.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -455,8 +455,7 @@ public class A {}
455455
true /* wait for indexer */,
456456
true /* check restrictions */,
457457
null);
458-
assertNotNull("Expected to find type", answer);
459-
assertTrue("Expected type to be non-accessible", answer.isNonAccessible());
458+
assertNull("Expected to not find type", answer);
460459
} finally {
461460
deleteProject("P");
462461
}

org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProjectElementInfo.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
*******************************************************************************/
1414
package org.eclipse.jdt.internal.core;
1515

16+
import java.util.Arrays;
1617
import java.util.HashMap;
1718
import java.util.Map;
1819
import org.eclipse.core.resources.IContainer;
@@ -26,6 +27,9 @@
2627
import org.eclipse.jdt.core.IPackageFragmentRoot;
2728
import org.eclipse.jdt.core.JavaCore;
2829
import org.eclipse.jdt.core.JavaModelException;
30+
import org.eclipse.jdt.core.compiler.IProblem;
31+
import org.eclipse.jdt.internal.compiler.env.AccessRule;
32+
import org.eclipse.jdt.internal.compiler.env.AccessRuleSet;
2933
import org.eclipse.jdt.internal.core.DeltaProcessor.RootInfo;
3034
import org.eclipse.jdt.internal.core.util.HashSetOfArray;
3135
import org.eclipse.jdt.internal.core.util.HashtableOfArrayToObject;
@@ -240,7 +244,10 @@ ProjectCache getProjectCache(JavaProject project, boolean excludeTestCode) {
240244
roots[i] = root = (IPackageFragmentRoot) manager.getExistingElement(root);
241245
// compute fragment cache
242246
HashSetOfArray fragmentsCache = new HashSetOfArray();
243-
initializePackageNames(root, fragmentsCache);
247+
if (!(reverseMap.get(root) instanceof ClasspathEntry cpEntry)
248+
|| !isCompletelyNonAccessible(cpEntry)) {
249+
initializePackageNames(root, fragmentsCache);
250+
}
244251
pkgFragmentsCaches.put(root, fragmentsCache);
245252
}
246253
}
@@ -255,6 +262,22 @@ ProjectCache getProjectCache(JavaProject project, boolean excludeTestCode) {
255262
return cache;
256263
}
257264

265+
private static final char[] ALL_ELEMENTS = {'*', '*', '/', '*'};
266+
267+
private boolean isCompletelyNonAccessible(ClasspathEntry cpEntry) {
268+
AccessRuleSet accessRules = cpEntry.getAccessRuleSet();
269+
if (accessRules != null) {
270+
AccessRule[] rules = accessRules.getAccessRules();
271+
if (rules.length == 1) {
272+
AccessRule rule = rules[0];
273+
if (rule.getProblemId() == IProblem.ForbiddenReference && Arrays.equals(ALL_ELEMENTS, rule.pattern)) {
274+
return true;
275+
}
276+
}
277+
}
278+
return false;
279+
}
280+
258281
/**
259282
* Returns an array of non-java resources contained in the receiver.
260283
*/

0 commit comments

Comments
 (0)