diff options
| author | Vikas Chandra | 2018-07-23 10:51:52 +0000 |
|---|---|---|
| committer | Vikas Chandra | 2018-07-23 10:51:52 +0000 |
| commit | fa44e339dea9d5629fb76651a63b1377534e264b (patch) | |
| tree | 0d822736ff899b316c892a00bfb2edcc3dad2bd3 | |
| parent | d795c8fe3a2c9c2ce9295485913f9e90ec6eabcf (diff) | |
| download | eclipse.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>
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; + } + } + + } + } |
