diff options
author | Markus Keller | 2014-08-31 22:43:09 +0000 |
---|---|---|
committer | Jayaprakash Arthanareeswaran | 2014-09-23 07:23:04 +0000 |
commit | cfc66021f700bf87dae5ce885c77781de04bcdf8 (patch) | |
tree | b1c37cf35c824ebc92f2046d569636765044c305 | |
parent | 4d1a219f3d962fc4d802d59fbf61a3c4491b32f3 (diff) | |
download | eclipse.jdt.core-cfc66021f700bf87dae5ce885c77781de04bcdf8.tar.gz eclipse.jdt.core-cfc66021f700bf87dae5ce885c77781de04bcdf8.tar.xz eclipse.jdt.core-cfc66021f700bf87dae5ce885c77781de04bcdf8.zip |
Bug 440470: debugger source lookup is much slower than 4.3v_B88_R37x
Fixes performance regression from bug 410207.
Like every IJavaElement, JarPackageFragmentRoot is supposed to be a *handle*, i.e. it should be very lightweight and its creation should be cheap and should not depend on availability of the referenced element.
-rw-r--r-- | org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java | 21 |
1 files changed, 6 insertions, 15 deletions
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java index 1127e5cd8a..e180c84cb7 100644 --- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java +++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java @@ -40,11 +40,6 @@ public class JarPackageFragmentRoot extends PackageFragmentRoot { private final static ArrayList EMPTY_LIST = new ArrayList(); /** - * Compiler compliance level that was used to produce the jar. - */ - protected final String complianceLevel; - - /** * The path to the jar file * (a workspace relative path if the jar is internal, * or an OS path if the jar is external) @@ -59,9 +54,6 @@ public class JarPackageFragmentRoot extends PackageFragmentRoot { protected JarPackageFragmentRoot(IPath externalJarPath, JavaProject project) { super(null, project); this.jarPath = externalJarPath; - Object file = JavaModel.getTarget(getPath(), true); - long level = Util.getJdkLevel(file); - this.complianceLevel = CompilerOptions.versionFromJdkLevel(level); } /** * Constructs a package fragment root which is the root of the Java package directory hierarchy @@ -70,9 +62,6 @@ public class JarPackageFragmentRoot extends PackageFragmentRoot { protected JarPackageFragmentRoot(IResource resource, JavaProject project) { super(resource, project); this.jarPath = resource.getFullPath(); - Object file = JavaModel.getTarget(getPath(), true); - long level = Util.getJdkLevel(file); - this.complianceLevel = CompilerOptions.versionFromJdkLevel(level); } /** @@ -85,6 +74,9 @@ public class JarPackageFragmentRoot extends PackageFragmentRoot { IJavaElement[] children; ZipFile jar = null; try { + Object file = JavaModel.getTarget(getPath(), true); + long level = Util.getJdkLevel(file); + String compliance = CompilerOptions.versionFromJdkLevel(level); jar = getJar(); // always create the default package @@ -92,7 +84,7 @@ public class JarPackageFragmentRoot extends PackageFragmentRoot { for (Enumeration e= jar.entries(); e.hasMoreElements();) { ZipEntry member= (ZipEntry) e.nextElement(); - initRawPackageInfo(rawPackageInfo, member.getName(), member.isDirectory()); + initRawPackageInfo(rawPackageInfo, member.getName(), member.isDirectory(), compliance); } // loop through all of referenced packages, creating package fragments if necessary @@ -219,7 +211,7 @@ public class JarPackageFragmentRoot extends PackageFragmentRoot { public int hashCode() { return this.jarPath.hashCode(); } - private void initRawPackageInfo(HashtableOfArrayToObject rawPackageInfo, String entryName, boolean isDirectory) { + private void initRawPackageInfo(HashtableOfArrayToObject rawPackageInfo, String entryName, boolean isDirectory, String compliance) { int lastSeparator = isDirectory ? entryName.length()-1 : entryName.lastIndexOf('/'); String[] pkgName = Util.splitOn('/', entryName, 0, lastSeparator); String[] existing = null; @@ -233,8 +225,7 @@ public class JarPackageFragmentRoot extends PackageFragmentRoot { JavaModelManager manager = JavaModelManager.getJavaModelManager(); for (int i = existingLength; i < length; i++) { // sourceLevel must be null because we know nothing about it based on a jar file - // complianceLevel can be retrieved from a jar file - if (Util.isValidFolderNameForPackage(pkgName[i], null, this.complianceLevel)) { + if (Util.isValidFolderNameForPackage(pkgName[i], null, compliance)) { System.arraycopy(existing, 0, existing = new String[i+1], 0, i); existing[i] = manager.intern(pkgName[i]); rawPackageInfo.put(existing, new ArrayList[] { EMPTY_LIST, EMPTY_LIST }); |