Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Keller2014-08-31 22:43:09 +0000
committerJayaprakash Arthanareeswaran2014-09-23 07:23:04 +0000
commitcfc66021f700bf87dae5ce885c77781de04bcdf8 (patch)
treeb1c37cf35c824ebc92f2046d569636765044c305
parent4d1a219f3d962fc4d802d59fbf61a3c4491b32f3 (diff)
downloadeclipse.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.java21
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 });

Back to the top