Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 64691 Details for
Bug 182930
JavaModelCache's size grows when displaying type hierarchy
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
Other improvement v2
182930h.txt (text/plain), 10.18 KB, created by
Jerome Lanneluc
on 2007-04-24 04:29:36 EDT
(
hide
)
Description:
Other improvement v2
Filename:
MIME Type:
Creator:
Jerome Lanneluc
Created:
2007-04-24 04:29:36 EDT
Size:
10.18 KB
patch
obsolete
>### 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); > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 182930
:
64162
|
64576
|
64656
|
64691
|
64707
|
65764