diff --git a/apitools/org.eclipse.pde.api.tools.generator/src/org/eclipse/pde/api/tools/generator/EEGenerator.java b/apitools/org.eclipse.pde.api.tools.generator/src/org/eclipse/pde/api/tools/generator/EEGenerator.java index cf4ce84..d9a0d1c 100644 --- a/apitools/org.eclipse.pde.api.tools.generator/src/org/eclipse/pde/api/tools/generator/EEGenerator.java +++ b/apitools/org.eclipse.pde.api.tools.generator/src/org/eclipse/pde/api/tools/generator/EEGenerator.java @@ -63,11 +63,10 @@ import org.eclipse.pde.api.tools.internal.provisional.ProfileModifiers; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Attribute; -import org.objectweb.asm.ClassAdapter; import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.MethodAdapter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.w3c.dom.DOMException; @@ -1167,7 +1166,7 @@ /** * Class adapter */ - static class StubClassAdapter extends ClassAdapter { + static class StubClassAdapter extends ClassVisitor { static final int IGNORE_CLASS_FILE = 0x100; int flags; @@ -1180,7 +1179,7 @@ * @param stubtype */ public StubClassAdapter(Type stubtype) { - super(new ClassWriter(0)); + super(Opcodes.ASM5, new ClassWriter(0)); this.type = stubtype; } @@ -1268,7 +1267,7 @@ return null; } final StubMethod method = this.stub.addMethod(methodName, desc); - return new MethodAdapter(super.visitMethod(access, methodName, desc, signature, exceptions)) { + return new MethodVisitor(Opcodes.ASM5, super.visitMethod(access, methodName, desc, signature, exceptions)) { @Override public AnnotationVisitor visitAnnotation(String sig, boolean visible) { if (visible && "Ljava/lang/invoke/MethodHandle$PolymorphicSignature;".equals(sig)) { //$NON-NLS-1$ diff --git a/apitools/org.eclipse.pde.api.tools.tests/API Tools Test Suite.launch b/apitools/org.eclipse.pde.api.tools.tests/API Tools Test Suite.launch index d5f098e..2040997 100644 --- a/apitools/org.eclipse.pde.api.tools.tests/API Tools Test Suite.launch +++ b/apitools/org.eclipse.pde.api.tools.tests/API Tools Test Suite.launch @@ -14,7 +14,7 @@ - + diff --git a/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF b/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF index 4985616..78fe116 100644 --- a/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF +++ b/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF @@ -22,7 +22,7 @@ org.eclipse.jdt.core.tests.builder;bundle-version="[3.8.0,4.0.0)", org.eclipse.jdt.core.tests.compiler;bundle-version="[3.8.0,4.0.0)", org.eclipse.ant.core, - org.objectweb.asm;bundle-version="[3.2.0,4.0.0)", + org.objectweb.asm;bundle-version="5.0.0", org.eclipse.jface;bundle-version="3.8.0" Bundle-RequiredExecutionEnvironment: J2SE-1.5 Export-Package: org.eclipse.pde.api.tools.anttasks.tests, diff --git a/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF b/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF index ff54acb..0e7a4e2 100644 --- a/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF +++ b/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF @@ -14,7 +14,7 @@ org.eclipse.text;bundle-version="[3.4.0,4.0.0)", org.eclipse.core.filebuffers;bundle-version="[3.4.0,4.0.0)", org.eclipse.ant.core;bundle-version="[3.1.300,4.0.0)", - org.objectweb.asm;bundle-version="[3.2.0,4.0.0)", + org.objectweb.asm;bundle-version="5.0.0", org.eclipse.team.core;bundle-version="[3.4.0,4.0.0)", org.eclipse.core.filesystem;bundle-version="[1.2.0,2.0.0)", org.eclipse.equinox.frameworkadmin;bundle-version="[2.0.0,3.0.0)", 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 f269577..b206096 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2013 IBM Corporation and others. + * Copyright (c) 2007, 2014 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -34,11 +34,10 @@ import org.eclipse.pde.api.tools.internal.provisional.model.IApiType; import org.eclipse.pde.api.tools.internal.util.Signatures; import org.eclipse.pde.api.tools.internal.util.Util; -import org.objectweb.asm.ClassAdapter; import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.Label; -import org.objectweb.asm.MethodAdapter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; @@ -51,7 +50,7 @@ * * @since 1.0.0 */ -public class ReferenceExtractor extends ClassAdapter { +public class ReferenceExtractor extends ClassVisitor { /** * A visitor for visiting java 5+ signatures @@ -61,7 +60,7 @@ * MethodSignature = (visitFormalTypeParameter visitClassBound? visitInterfaceBound* )* (visitParameterType visitReturnType visitExceptionType* ) * TypeSignature = visitBaseType | visitTypeVariable | visitArrayType | (visitClassType visitTypeArgument* (visitInnerClassType visitTypeArgument* )* visitEnd ) ) */ - class ClassFileSignatureVisitor implements SignatureVisitor { + class ClassFileSignatureVisitor extends SignatureVisitor { protected int kind = -1; protected int originalkind = -1; @@ -72,6 +71,7 @@ protected List references; public ClassFileSignatureVisitor() { + super(Opcodes.ASM5); this.references = new ArrayList(); } @@ -222,7 +222,7 @@ * Visitor used to visit the methods of a type * [ visitCode ( visitFrame | visitXInsn | visitLabel | visitTryCatchBlock | visitLocalVariable | visitLineNumber)* visitMaxs ] visitEnd */ - class ClassFileMethodVisitor extends MethodAdapter { + class ClassFileMethodVisitor extends MethodVisitor { int argumentcount = 0; LinePositionTracker linePositionTracker; /** @@ -241,7 +241,7 @@ * @param mv */ public ClassFileMethodVisitor(MethodVisitor mv, String name, int argumentcount) { - super(mv); + super(Opcodes.ASM5, mv); this.argumentcount = argumentcount; this.linePositionTracker = new LinePositionTracker(); this.lastLineNumber = -1; @@ -909,7 +909,7 @@ * @param referenceKinds kinds of references to extract as defined by {@link ReferenceModifiers} */ public ReferenceExtractor(IApiType type, Set collector, int referenceKinds) { - super(new ClassNode()); + super(Opcodes.ASM5, new ClassNode()); fType = type; this.collector = collector; fReferenceKinds = referenceKinds; @@ -925,7 +925,7 @@ * @param tracker */ protected ReferenceExtractor(IApiType type, Set collector, int referenceKinds, FieldTracker tracker) { - super(new ClassNode()); + super(Opcodes.ASM5, new ClassNode()); fType = type; this.collector = collector; fReferenceKinds = referenceKinds; diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/comparator/SignatureDecoder.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/comparator/SignatureDecoder.java index 0f861c7..7209c81 100644 --- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/comparator/SignatureDecoder.java +++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/comparator/SignatureDecoder.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2008 IBM Corporation and others. + * Copyright (c) 2007, 2014 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -10,12 +10,13 @@ *******************************************************************************/ package org.eclipse.pde.api.tools.internal.comparator; +import org.objectweb.asm.Opcodes; import org.objectweb.asm.signature.SignatureVisitor; /** * This class is used to decode a generic signature for class or method */ -final class SignatureDecoder implements SignatureVisitor { +final class SignatureDecoder extends SignatureVisitor { static final int CLASS_BOUND = 1; static final int DEFAULT = 0; static final int INTERFACE_BOUND = 2; @@ -28,6 +29,7 @@ SignatureDescriptor signatureDescriptor; public SignatureDecoder(SignatureDescriptor signatureDescriptor) { + super(Opcodes.ASM5); this.signatureDescriptor = signatureDescriptor; } public SignatureVisitor visitArrayType() { @@ -59,6 +61,8 @@ case SUPER_TYPE_ARGUMENT : case NORMAL_TYPE_ARGUMENT : this.signatureDescriptor.addTypeArgument(classTypeName); + break; + default: break; } this.mode = DEFAULT; @@ -115,6 +119,9 @@ break; case SignatureVisitor.INSTANCEOF : this.mode= NORMAL_TYPE_ARGUMENT; + break; + default: + break; } return this; } diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/BundleComponent.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/BundleComponent.java index e463b6c..760fd6c 100644 --- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/BundleComponent.java +++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/BundleComponent.java @@ -834,7 +834,6 @@ } return new String(Util.getInputStreamAsCharArray(stream, -1, IApiCoreConstants.UTF_8)); } catch(IOException e) { - //TODO abort ApiPlugin.log(e); } finally { closingZipFileAndStream(stream, jarFile); @@ -1178,9 +1177,11 @@ temp = new String[] { ProfileModifiers.J2SE_1_5_NAME }; } else if (ProfileModifiers.isJAVASE_1_6(values)) { temp = new String[] { ProfileModifiers.JAVASE_1_6_NAME }; - } else { - // this is 1.7 + } else if (ProfileModifiers.isJAVASE_1_7(values)) { temp = new String[] { ProfileModifiers.JAVASE_1_7_NAME }; + } else { + // this is 1.8 + temp = new String[] { ProfileModifiers.JAVASE_1_8_NAME }; } } if (ProfileModifiers.isCDC_Foundation(values)) { 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 8275598..f1c7f5e 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2013 IBM Corporation and others. + * Copyright (c) 2007, 2014 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -14,8 +14,6 @@ import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; import java.util.HashMap; import java.util.Map; @@ -30,21 +28,18 @@ import org.eclipse.pde.api.tools.internal.provisional.model.IApiType; import org.eclipse.pde.api.tools.internal.provisional.model.IApiTypeRoot; import org.objectweb.asm.AnnotationVisitor; -import org.objectweb.asm.ClassAdapter; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.Label; -import org.objectweb.asm.MethodAdapter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.ClassNode; -import org.objectweb.asm.util.TraceAnnotationVisitor; /** * Class adapter used to create an API type structure */ -public class TypeStructureBuilder extends ClassAdapter { +public class TypeStructureBuilder extends ClassVisitor { ApiType fType; IApiComponent fComponent; IApiTypeRoot fFile; @@ -59,13 +54,13 @@ * @param component originating API component or null if unknown */ TypeStructureBuilder(ClassVisitor cv, IApiComponent component, IApiTypeRoot file) { - super(cv); + super(Opcodes.ASM5, cv); fComponent = component; fFile = file; } - /** - * @see org.objectweb.asm.ClassAdapter#visit(int, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[]) + /* (non-Javadoc) + * @see org.objectweb.asm.ClassVisitor#visit(int, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[]) */ public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { StringBuffer simpleSig = new StringBuffer(); @@ -96,8 +91,9 @@ } super.visit(version, laccess, name, signature, superName, interfaces); } - /** - * @see org.objectweb.asm.ClassAdapter#visitInnerClass(java.lang.String, java.lang.String, java.lang.String, int) + + /* (non-Javadoc) + * @see org.objectweb.asm.ClassVisitor#visitInnerClass(java.lang.String, java.lang.String, java.lang.String, int) */ public void visitInnerClass(String name, String outerName, String innerName, int access) { super.visitInnerClass(name, outerName, innerName, access); @@ -127,14 +123,14 @@ } /* (non-Javadoc) - * @see org.objectweb.asm.ClassAdapter#visitOuterClass(java.lang.String, java.lang.String, java.lang.String) + * @see org.objectweb.asm.ClassVisitor#visitOuterClass(java.lang.String, java.lang.String, java.lang.String) */ public void visitOuterClass(String owner, String name, String desc) { fType.setEnclosingMethodInfo(name, desc); } /* (non-Javadoc) - * @see org.objectweb.asm.ClassAdapter#visitField(int, java.lang.String, java.lang.String, java.lang.String, java.lang.Object) + * @see org.objectweb.asm.ClassVisitor#visitField(int, java.lang.String, java.lang.String, java.lang.String, java.lang.Object) */ public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { int laccess = access; @@ -147,7 +143,7 @@ } /* (non-Javadoc) - * @see org.objectweb.asm.ClassAdapter#visitMethod(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[]) + * @see org.objectweb.asm.ClassVisitor#visitMethod(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[]) */ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { String[] names = null; @@ -163,7 +159,7 @@ } } final ApiMethod method = fType.addMethod(name, desc, signature, laccess, names); - return new MethodAdapter(super.visitMethod(laccess, name, desc, signature, exceptions)) { + return new MethodVisitor(Opcodes.ASM5, super.visitMethod(laccess, name, desc, signature, exceptions)) { public AnnotationVisitor visitAnnotation(String sig, boolean visible) { if (visible && "Ljava/lang/invoke/MethodHandle$PolymorphicSignature;".equals(sig)) { //$NON-NLS-1$ method.isPolymorphic(); @@ -171,18 +167,7 @@ return super.visitAnnotation(sig, visible); } public AnnotationVisitor visitAnnotationDefault() { - return new TraceAnnotationVisitor() { - public void visitEnd() { - super.visitEnd(); - StringWriter stringWriter = new StringWriter(); - PrintWriter writer = new PrintWriter(stringWriter); - print(writer); - writer.flush(); - writer.close(); - String def = String.valueOf(stringWriter.getBuffer()); - method.setDefaultValue(def); - } - }; + return new AnnotationDefaultVisitor(method); } }; } @@ -201,18 +186,28 @@ try { ClassReader classReader = new ClassReader(bytes); classReader.accept(visitor, ClassReader.SKIP_CODE | ClassReader.SKIP_FRAMES); - } catch (ArrayIndexOutOfBoundsException e) { - if(ApiPlugin.DEBUG_BUILDER) { - IStatus status = new Status(IStatus.ERROR, - ApiPlugin.PLUGIN_ID, - NLS.bind(Messages.TypeStructureBuilder_badClassFileEncountered, file.getTypeName()), - e); - ApiPlugin.log(status); - } - return null; + } + catch (ArrayIndexOutOfBoundsException e) { + return logAndReturn(file, e); + } + catch(IllegalArgumentException iae){ + //thrown from ASM 5.0 for bad bytcodes + return logAndReturn(file, iae); } return visitor.fType; } + + private static IApiType logAndReturn(IApiTypeRoot file, Exception e) { + if(ApiPlugin.DEBUG_BUILDER) { + IStatus status = new Status(IStatus.ERROR, + ApiPlugin.PLUGIN_ID, + NLS.bind(Messages.TypeStructureBuilder_badClassFileEncountered, file.getTypeName()), + e); + ApiPlugin.log(status); + } + return null; + } + /** * Builds a type structure with the given .class file bytes in the specified * API component. @@ -241,14 +236,73 @@ } } } - static class EnclosingMethodSetter extends ClassAdapter { + /** + * Visit the default value for an annotation + */ + static class AnnotationDefaultVisitor extends AnnotationVisitor { + ApiMethod method; + Object value; + StringBuffer buff = new StringBuffer(); + boolean trace = false; + int traceCount = 0; + + public AnnotationDefaultVisitor(ApiMethod method) { + super(Opcodes.ASM5); + this.method = method; + } + public void visit(String name, Object value) { + if(trace) { + appendValue(value); + traceCount++; + return; + } + this.value = value; + } + public AnnotationVisitor visitAnnotation(String name, String desc) { + trace = true; + return this; + } + public void visitEnum(String name, String desc, String value) { + if(trace) { + appendValue(value); + traceCount++; + return; + } + this.value = value; + } + public AnnotationVisitor visitArray(String name) { + trace = true; + return this; + } + public void visitEnd() { + if(trace) { + this.value = buff.toString(); + traceCount--; + trace = traceCount != 0; + } + else { + method.setDefaultValue(this.value == null ? null : this.value.toString()); + } + } + void appendValue(Object val) { + if(val != null) { + if(buff.length() < 1) { + buff.append(val.toString()); + } + else { + buff.append(',').append(val.toString()); + } + } + } + } + static class EnclosingMethodSetter extends ClassVisitor { String name; String signature; boolean found = false; String typeName; public EnclosingMethodSetter(ClassVisitor cv, String typeName) { - super(cv); + super(Opcodes.ASM5, cv); this.typeName = typeName.replace('.', '/'); } public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { @@ -274,11 +328,11 @@ return null; } } - static class TypeNameFinder extends MethodAdapter { + static class TypeNameFinder extends MethodVisitor { protected EnclosingMethodSetter setter; public TypeNameFinder(MethodVisitor mv, EnclosingMethodSetter enclosingMethodSetter) { - super(mv); + super(Opcodes.ASM5, mv); this.setter = enclosingMethodSetter; } public void visitTypeInsn(int opcode, String type) {