Skip to content

Commit cb39639

Browse files
committed
Skip completely inaccessible classpath elements in package caching
1 parent ce8ba36 commit cb39639

1 file changed

Lines changed: 26 additions & 0 deletions

File tree

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

Lines changed: 26 additions & 0 deletions
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;
@@ -234,7 +238,13 @@ ProjectCache getProjectCache(JavaProject project, boolean excludeTestCode) {
234238
JavaModelManager manager = JavaModelManager.getJavaModelManager();
235239
for (int i = 0; i < length; i++) {
236240
IPackageFragmentRoot root = roots[i];
241+
if (reverseMap.get(root) instanceof ClasspathEntry cpEntry && isCompletelyNonAccessible(cpEntry)) {
242+
//TODO: Do we have to update the roots entry like below?
243+
pkgFragmentsCaches.put(root, new HashSetOfArray());
244+
continue;
245+
}
237246
DeltaProcessor.RootInfo rootInfo = rootInfos.get(root.getPath());
247+
//TODO: Check this. Is this a hot loop where we can filter in accessible elements?
238248
if (rootInfo == null || rootInfo.project.equals(project)) {
239249
// ensure that an identical root is used (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=217059 )
240250
roots[i] = root = (IPackageFragmentRoot) manager.getExistingElement(root);
@@ -255,6 +265,22 @@ ProjectCache getProjectCache(JavaProject project, boolean excludeTestCode) {
255265
return cache;
256266
}
257267

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

0 commit comments

Comments
 (0)