1313 *******************************************************************************/
1414package org .eclipse .jdt .internal .core ;
1515
16+ import java .util .Arrays ;
1617import java .util .HashMap ;
1718import java .util .Map ;
1819import org .eclipse .core .resources .IContainer ;
2627import org .eclipse .jdt .core .IPackageFragmentRoot ;
2728import org .eclipse .jdt .core .JavaCore ;
2829import 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 ;
2933import org .eclipse .jdt .internal .core .DeltaProcessor .RootInfo ;
3034import org .eclipse .jdt .internal .core .util .HashSetOfArray ;
3135import 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