### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/internal/core/JavaProject.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProject.java,v retrieving revision 1.388 diff -u -r1.388 JavaProject.java --- model/org/eclipse/jdt/internal/core/JavaProject.java 18 Apr 2007 14:30:40 -0000 1.388 +++ model/org/eclipse/jdt/internal/core/JavaProject.java 24 Apr 2007 08:28:34 -0000 @@ -66,6 +66,7 @@ import org.eclipse.jdt.internal.compiler.util.ObjectVector; import org.eclipse.jdt.internal.compiler.util.SuffixConstants; import org.eclipse.jdt.internal.core.JavaModelManager.PerProjectInfo; +import org.eclipse.jdt.internal.core.JavaProjectElementInfo.ProjectCache; import org.eclipse.jdt.internal.core.builder.JavaBuilder; import org.eclipse.jdt.internal.core.eval.EvaluationContextWrapper; import org.eclipse.jdt.internal.core.util.MementoTokenizer; @@ -1809,6 +1810,10 @@ public IProject getProject() { return this.project; } + + public ProjectCache getProjectCache() throws JavaModelException { + return ((JavaProjectElementInfo) getElementInfo()).getProjectCache(this); + } /** * @see IJavaProject Index: model/org/eclipse/jdt/internal/core/JavaProjectElementInfo.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProjectElementInfo.java,v retrieving revision 1.46 diff -u -r1.46 JavaProjectElementInfo.java --- model/org/eclipse/jdt/internal/core/JavaProjectElementInfo.java 23 Apr 2007 10:52:16 -0000 1.46 +++ model/org/eclipse/jdt/internal/core/JavaProjectElementInfo.java 24 Apr 2007 08:28:34 -0000 @@ -37,10 +37,10 @@ static final IPackageFragmentRoot[] NO_ROOTS = new IPackageFragmentRoot[0]; static class ProjectCache { - ProjectCache(IPackageFragmentRoot[] allPkgFragmentRootsCache, HashtableOfArrayToObject allPkgFragmentsCache, Map rootToResolvedEntries) { + ProjectCache(IPackageFragmentRoot[] allPkgFragmentRootsCache, Map rootToResolvedEntries, Map pkgFragmentsCaches) { this.allPkgFragmentRootsCache = allPkgFragmentRootsCache; - this.allPkgFragmentsCache = allPkgFragmentsCache; this.rootToResolvedEntries = rootToResolvedEntries; + this.pkgFragmentsCaches = pkgFragmentsCaches; } /* @@ -50,10 +50,17 @@ /* * A cache of all package fragments in this project. - * (a map from String[] (the package name) to IPackageFragmentRoot[] (the package fragment roots that contain a package fragment with this name) + * (a map from String[] (the package name) to IPackageFragmentRoot[] (the package fragment roots that contain a package fragment with this name)) */ public HashtableOfArrayToObject allPkgFragmentsCache; + /* + * A cache of package fragments for each package fragment root of this project + * (a map from IPackageFragmentRoot to + * a map from String[] (the package name) to IPackageFragmentRoot[] (the package fragment roots that contain a package fragment with this name)) + */ + public Map pkgFragmentsCaches; + public Map rootToResolvedEntries; } @@ -202,47 +209,21 @@ reverseMap.clear(); } - HashMap otherRoots = JavaModelManager.getJavaModelManager().deltaState.otherRoots; - HashtableOfArrayToObject fragmentsCache = new HashtableOfArrayToObject(); - for (int i = 0, length = roots.length; i < length; i++) { + HashMap rootInfos = JavaModelManager.getJavaModelManager().deltaState.roots; + HashMap pkgFragmentsCaches = new HashMap(); + int length = roots.length; + for (int i = 0; i < length; i++) { IPackageFragmentRoot root = roots[i]; - IJavaElement[] frags = null; - try { - if (root.isArchive() - && !root.isOpen() - && otherRoots.get(((JarPackageFragmentRoot) root).jarPath) == null/*only if jar belongs to 1 project (https://bugs.eclipse.org/bugs/show_bug.cgi?id=161175)*/) { - JarPackageFragmentRootInfo info = new JarPackageFragmentRootInfo(); - ((JarPackageFragmentRoot) root).computeChildren(info, new HashMap()); - frags = info.children; - } else - frags = root.getChildren(); - } catch (JavaModelException e) { - // root doesn't exist: ignore - continue; - } - for (int j = 0, length2 = frags.length; j < length2; j++) { - PackageFragment fragment= (PackageFragment) frags[j]; - String[] pkgName = fragment.names; - Object existing = fragmentsCache.get(pkgName); - if (existing == null || existing == NO_ROOTS) { - fragmentsCache.put(pkgName, root); - // ensure super packages (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=119161) - // are also in the map - addSuperPackageNames(pkgName, fragmentsCache); - } else { - if (existing instanceof PackageFragmentRoot) { - fragmentsCache.put(pkgName, new IPackageFragmentRoot[] {(PackageFragmentRoot) existing, root}); - } else { - IPackageFragmentRoot[] entry= (IPackageFragmentRoot[]) existing; - IPackageFragmentRoot[] copy= new IPackageFragmentRoot[entry.length + 1]; - System.arraycopy(entry, 0, copy, 0, entry.length); - copy[entry.length]= root; - fragmentsCache.put(pkgName, copy); - } - } + DeltaProcessor.RootInfo rootInfo = (DeltaProcessor.RootInfo) rootInfos.get(root.getPath()); + if (rootInfo == null || rootInfo.project.equals(project)) { + // compute fragment cache + HashtableOfArrayToObject fragmentsCache = new HashtableOfArrayToObject(); + initializePackageNames(root, fragmentsCache); + pkgFragmentsCaches.put(root, fragmentsCache); } } - cache = new ProjectCache(roots, fragmentsCache, reverseMap); + + cache = new ProjectCache(roots, reverseMap, pkgFragmentsCaches); this.projectCache = cache; } return cache; @@ -258,6 +239,42 @@ } return this.nonJavaResources; } + + private void initializePackageNames(IPackageFragmentRoot root, HashtableOfArrayToObject fragmentsCache) { + IJavaElement[] frags = null; + try { + if (!root.isOpen()) { + PackageFragmentRootInfo info = root.isArchive() ? new JarPackageFragmentRootInfo() : new PackageFragmentRootInfo(); + ((PackageFragmentRoot) root).computeChildren(info, new HashMap()); + frags = info.children; + } else + frags = root.getChildren(); + } catch (JavaModelException e) { + // root doesn't exist: ignore + return; + } + for (int j = 0, length2 = frags.length; j < length2; j++) { + PackageFragment fragment= (PackageFragment) frags[j]; + String[] pkgName = fragment.names; + Object existing = fragmentsCache.get(pkgName); + if (existing == null || existing == NO_ROOTS) { + fragmentsCache.put(pkgName, root); + // ensure super packages (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=119161) + // are also in the map + addSuperPackageNames(pkgName, fragmentsCache); + } else { + if (existing instanceof PackageFragmentRoot) { + fragmentsCache.put(pkgName, new IPackageFragmentRoot[] {(PackageFragmentRoot) existing, root}); + } else { + IPackageFragmentRoot[] entry= (IPackageFragmentRoot[]) existing; + IPackageFragmentRoot[] copy= new IPackageFragmentRoot[entry.length + 1]; + System.arraycopy(entry, 0, copy, 0, entry.length); + copy[entry.length]= root; + fragmentsCache.put(pkgName, copy); + } + } + } + } /* * Returns whether the given path is a classpath entry or an output location. @@ -284,6 +301,56 @@ */ NameLookup newNameLookup(JavaProject project, ICompilationUnit[] workingCopies) { ProjectCache cache = getProjectCache(project); + HashtableOfArrayToObject allPkgFragmentsCache = cache.allPkgFragmentsCache; + if (allPkgFragmentsCache == null) { + HashMap rootInfos = JavaModelManager.getJavaModelManager().deltaState.roots; + IPackageFragmentRoot[] allRoots = cache.allPkgFragmentRootsCache; + int length = allRoots.length; + allPkgFragmentsCache = new HashtableOfArrayToObject(); + for (int i = 0; i < length; i++) { + IPackageFragmentRoot root = allRoots[i]; + DeltaProcessor.RootInfo rootInfo = (DeltaProcessor.RootInfo) rootInfos.get(root.getPath()); + JavaProject rootProject = rootInfo == null ? project : rootInfo.project; + HashtableOfArrayToObject fragmentsCache; + if (rootProject.equals(project)) { + fragmentsCache = (HashtableOfArrayToObject) cache.pkgFragmentsCaches.get(root); + } else { + // retrieve fragment cache from root project + ProjectCache rootProjectCache; + try { + rootProjectCache = rootProject.getProjectCache(); + } catch (JavaModelException e) { + // project doesn't exit + continue; + } + fragmentsCache = (HashtableOfArrayToObject) rootProjectCache.pkgFragmentsCaches.get(root); + } + Object[][] keyTable = fragmentsCache.keyTable; + for (int j = 0, length2 = keyTable.length; j < length2; j++) { + String[] pkgName = (String[]) fragmentsCache.keyTable[j]; + if (pkgName == null) + continue; + Object existing = allPkgFragmentsCache.get(pkgName); + if (existing == null || existing == NO_ROOTS) { + allPkgFragmentsCache.put(pkgName, root); + // ensure super packages (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=119161) + // are also in the map + JavaProjectElementInfo.addSuperPackageNames(pkgName, allPkgFragmentsCache); + } else { + if (existing instanceof PackageFragmentRoot) { + allPkgFragmentsCache.put(pkgName, new IPackageFragmentRoot[] {(PackageFragmentRoot) existing, root}); + } else { + IPackageFragmentRoot[] roots = (IPackageFragmentRoot[]) existing; + int rootLength = roots.length; + System.arraycopy(roots, 0, roots = new IPackageFragmentRoot[rootLength+1], 0, rootLength); + roots[rootLength] = root; + allPkgFragmentsCache.put(pkgName, roots); + } + } + } + } + cache.allPkgFragmentsCache = allPkgFragmentsCache; + } return new NameLookup(cache.allPkgFragmentRootsCache, cache.allPkgFragmentsCache, workingCopies, cache.rootToResolvedEntries); }