Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVikas Chandra2018-07-23 10:51:52 +0000
committerVikas Chandra2018-07-23 10:51:52 +0000
commitfa44e339dea9d5629fb76651a63b1377534e264b (patch)
tree0d822736ff899b316c892a00bfb2edcc3dad2bd3
parentd795c8fe3a2c9c2ce9295485913f9e90ec6eabcf (diff)
downloadeclipse.pde.ui-fa44e339dea9d5629fb76651a63b1377534e264b.tar.gz
eclipse.pde.ui-fa44e339dea9d5629fb76651a63b1377534e264b.tar.xz
eclipse.pde.ui-fa44e339dea9d5629fb76651a63b1377534e264b.zip
Bug 537282 - API analysis is very slow with Java 11 Y20180725-2200
Change-Id: I85323b7001e1d85f339ef5e891db6a181ec2d799 Signed-off-by: Vikas Chandra <Vikas.Chandra@in.ibm.com>
-rw-r--r--apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceExtractor.java8
-rw-r--r--apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/ApiType.java7
-rw-r--r--apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/TypeStructureBuilder.java12
-rw-r--r--apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/util/Util.java19
4 files changed, 43 insertions, 3 deletions
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceExtractor.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceExtractor.java
index d313fbbd83..19814c36f5 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceExtractor.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceExtractor.java
@@ -1345,11 +1345,17 @@ public class ReferenceExtractor extends ClassVisitor {
private Set<Reference> processInnerClass(IApiType type, int refkinds) throws CoreException {
HashSet<Reference> refs = new HashSet<>();
ReferenceExtractor extractor = new ReferenceExtractor(type, refs, refkinds, this.fieldtracker);
- ClassReader reader = new ClassReader(((AbstractApiTypeRoot) type.getTypeRoot()).getContents());
+ byte[] bytes = ((AbstractApiTypeRoot) type.getTypeRoot()).getContents();
+ boolean updated = Util.updateVersionFrom11to10(bytes);
+ ClassReader reader = new ClassReader(bytes);
+ if (updated) {
+ Util.updateVersionFrom10to11(bytes);
+ }
reader.accept(extractor, ClassReader.SKIP_FRAMES);
return refs;
}
+
@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
try {
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/ApiType.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/ApiType.java
index 3a9f4766b8..a7772a644f 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/ApiType.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/ApiType.java
@@ -157,7 +157,12 @@ public class ApiType extends ApiMember implements IApiType {
public List<IReference> extractReferences(int referenceMask, IProgressMonitor monitor) throws CoreException {
HashSet<Reference> references = new HashSet<>();
ReferenceExtractor extractor = new ReferenceExtractor(this, references, referenceMask);
- ClassReader reader = new ClassReader(((AbstractApiTypeRoot) fStorage).getContents());
+ byte[] bytes = ((AbstractApiTypeRoot) fStorage).getContents();
+ boolean updated = Util.updateVersionFrom11to10(bytes);
+ ClassReader reader = new ClassReader(bytes);
+ if (updated) {
+ Util.updateVersionFrom10to11(bytes);
+ }
reader.accept(extractor, ClassReader.SKIP_FRAMES);
return new LinkedList<>(references);
}
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/TypeStructureBuilder.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/TypeStructureBuilder.java
index e9dc97c50b..2b306ee63c 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/TypeStructureBuilder.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/TypeStructureBuilder.java
@@ -27,6 +27,7 @@ import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiComponent;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiType;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiTypeRoot;
+import org.eclipse.pde.api.tools.internal.util.Util;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
@@ -256,7 +257,11 @@ public class TypeStructureBuilder extends ClassVisitor {
public static IApiType buildTypeStructure(byte[] bytes, IApiComponent component, IApiTypeRoot file) {
TypeStructureBuilder visitor = new TypeStructureBuilder(new ClassNode(), component, file);
try {
+ boolean updated = Util.updateVersionFrom11to10(bytes);
ClassReader classReader = new ClassReader(bytes);
+ if (updated) {
+ Util.updateVersionFrom10to11(bytes);
+ }
classReader.accept(visitor, ClassReader.SKIP_CODE | ClassReader.SKIP_FRAMES);
} catch (ArrayIndexOutOfBoundsException e) {
logAndReturn(file, e);
@@ -283,7 +288,12 @@ public class TypeStructureBuilder extends ClassVisitor {
AbstractApiTypeRoot abstractApiTypeRoot = (AbstractApiTypeRoot) typeRoot;
EnclosingMethodSetter visitor = new EnclosingMethodSetter(new ClassNode(), currentAnonymousLocalType.getName());
try {
- ClassReader classReader = new ClassReader(abstractApiTypeRoot.getContents());
+ byte[] bytes = abstractApiTypeRoot.getContents();
+ boolean updated = Util.updateVersionFrom11to10(bytes);
+ ClassReader classReader = new ClassReader(bytes);
+ if (updated) {
+ Util.updateVersionFrom10to11(bytes);
+ }
classReader.accept(visitor, ClassReader.SKIP_FRAMES);
} catch (ArrayIndexOutOfBoundsException e) {
ApiPlugin.log(e);
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/util/Util.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/util/Util.java
index b20def973c..98211f93ce 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/util/Util.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/util/Util.java
@@ -2977,5 +2977,24 @@ public final class Util {
return type;
}
+ public static boolean updateVersionFrom11to10(byte[] bytes) {
+ if (bytes.length >= 8) {
+ if (bytes[7] == 55) {
+ bytes[7] = 54;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static void updateVersionFrom10to11(byte[] bytes) {
+ if (bytes.length >= 8) {
+ if (bytes[7] == 54) {
+ bytes[7] = 55;
+ }
+ }
+
+ }
+
}

Back to the top