Bug 390930 - [1.8] Update to ASM 5.x

Change-Id: I2a53eb4d4bb20b4f07a6e3dfa706ee71b41e2fd5
diff --git a/apitools/org.eclipse.pde.api.tools.generator/META-INF/MANIFEST.MF b/apitools/org.eclipse.pde.api.tools.generator/META-INF/MANIFEST.MF
index b80bc9e..22e912a 100644
--- a/apitools/org.eclipse.pde.api.tools.generator/META-INF/MANIFEST.MF
+++ b/apitools/org.eclipse.pde.api.tools.generator/META-INF/MANIFEST.MF
@@ -5,7 +5,7 @@
 Bundle-Version: 1.0.200.qualifier
 Bundle-Vendor: %providerName
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Require-Bundle: org.objectweb.asm;bundle-version="3.3.1",
+Require-Bundle: org.objectweb.asm;bundle-version="[5.0.0,6.0.0)",
  org.eclipse.pde.api.tools;bundle-version="1.0.600",
  org.eclipse.jdt.core;bundle-version="3.8.1",
  org.eclipse.core.runtime;bundle-version="3.8.0"
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 66a56a5..fa32d11 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
@@ -62,11 +62,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;

@@ -1157,7 +1156,7 @@
 	/**

 	 * Class adapter

 	 */

-	static class StubClassAdapter extends ClassAdapter {

+	static class StubClassAdapter extends ClassVisitor {

 		static final int IGNORE_CLASS_FILE = 0x100;

 

 		int flags;

@@ -1170,7 +1169,7 @@
 		 * @param stubtype

 		 */

 		public StubClassAdapter(Type stubtype) {

-			super(new ClassWriter(0));

+			super(Opcodes.ASM5, new ClassWriter(0));

 			this.type = stubtype;

 		}

 

@@ -1261,7 +1260,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/META-INF/MANIFEST.MF b/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF
index 6fc8aa5..5f6f25d 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,6.0.0)",
  org.eclipse.jface;bundle-version="3.8.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 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 c19b26f..e7d7779 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,6.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/BaseApiAnalyzer.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/BaseApiAnalyzer.java
index a706e0c..358df80 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/BaseApiAnalyzer.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/BaseApiAnalyzer.java
@@ -304,13 +304,19 @@
 	 * current version of ASM. Checks the JDT core settings for class file +
 	 * compiler options<br>
 	 * <br>
-	 * Currently the unsupported bytecodes are Java 8 and greater
+	 * For Luna there are no unsupported bytecodes, for Kepler, Java 8 is
+	 * unsupported
 	 * 
 	 * @return true if the backing project is configured to create bytecodes
 	 *         that are not supported
 	 */
 	private boolean unsupportedByteCodes() {
-		return fJavaProject != null && JavaCore.VERSION_1_8.equals(fJavaProject.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, true)) && JavaCore.VERSION_1_8.equals(fJavaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true));
+		return false;
+		// fJavaProject != null &&
+		// JavaCore.VERSION_1_8.equals(fJavaProject.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM,
+		// true)) &&
+		// JavaCore.VERSION_1_8.equals(fJavaProject.getOption(JavaCore.COMPILER_COMPLIANCE,
+		// true));
 	}
 
 	/**
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 619d454..225758c 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
@@ -36,11 +36,10 @@
 import org.eclipse.pde.api.tools.internal.util.Util;
 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.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;
@@ -53,7 +52,7 @@
  * 
  * @since 1.0.0
  */
-public class ReferenceExtractor extends ClassAdapter {
+public class ReferenceExtractor extends ClassVisitor {
 
 	/**
 	 * A visitor for visiting java 5+ signatures
@@ -66,7 +65,7 @@
 	 * visitArrayType | (visitClassType visitTypeArgument* (visitInnerClassType
 	 * visitTypeArgument* )* visitEnd</tt> ) )
 	 */
-	class ClassFileSignatureVisitor implements SignatureVisitor {
+	class ClassFileSignatureVisitor extends SignatureVisitor {
 
 		protected int kind = -1;
 		protected int originalkind = -1;
@@ -77,6 +76,7 @@
 		protected List<Reference> references;
 
 		public ClassFileSignatureVisitor() {
+			super(Opcodes.ASM5);
 			this.references = new ArrayList<Reference>();
 		}
 
@@ -288,7 +288,7 @@
 	 * visit<i>X</i>Insn | visitLabel | visitTryCatchBlock | visitLocalVariable
 	 * | visitLineNumber)* visitMaxs ] visitEnd
 	 */
-	class ClassFileMethodVisitor extends MethodAdapter {
+	class ClassFileMethodVisitor extends MethodVisitor {
 		int argumentcount = 0;
 		LinePositionTracker linePositionTracker;
 		/**
@@ -309,7 +309,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;
@@ -704,7 +704,11 @@
 	 * 
 	 * @since 1.0.600
 	 */
-	class ClassFileFieldVisitor implements FieldVisitor {
+	class ClassFileFieldVisitor extends FieldVisitor {
+
+		ClassFileFieldVisitor() {
+			super(Opcodes.ASM5);
+		}
 
 		/*
 		 * (non-Javadoc)
@@ -1078,7 +1082,7 @@
 	 *            {@link ReferenceModifiers}
 	 */
 	public ReferenceExtractor(IApiType type, Set<Reference> collector, int referenceKinds) {
-		super(new ClassNode());
+		super(Opcodes.ASM5, new ClassNode());
 		fType = type;
 		this.collector = collector;
 		fReferenceKinds = referenceKinds;
@@ -1095,7 +1099,7 @@
 	 * @param tracker
 	 */
 	protected ReferenceExtractor(IApiType type, Set<Reference> 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 8b5f353..d33c6d7 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, 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
@@ -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;
 	}
 
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 41ba0de..42a019d 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,14 +54,15 @@
 	 *            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[])
 	 */
 	@Override
 	public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
@@ -100,9 +96,10 @@
 		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)
 	 */
 	@Override
 	public void visitInnerClass(String name, String outerName, String innerName, int access) {
@@ -135,7 +132,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * @see org.objectweb.asm.ClassAdapter#visitOuterClass(java.lang.String,
+	 * @see org.objectweb.asm.ClassVisitor#visitOuterClass(java.lang.String,
 	 * java.lang.String, java.lang.String)
 	 */
 	@Override
@@ -145,7 +142,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * @see org.objectweb.asm.ClassAdapter#visitField(int, java.lang.String,
+	 * @see org.objectweb.asm.ClassVisitor#visitField(int, java.lang.String,
 	 * java.lang.String, java.lang.String, java.lang.Object)
 	 */
 	@Override
@@ -161,7 +158,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * @see org.objectweb.asm.ClassAdapter#visitMethod(int, java.lang.String,
+	 * @see org.objectweb.asm.ClassVisitor#visitMethod(int, java.lang.String,
 	 * java.lang.String, java.lang.String, java.lang.String[])
 	 */
 	@Override
@@ -179,7 +176,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)) {
 			@Override
 			public AnnotationVisitor visitAnnotation(String sig, boolean visible) {
 				if (visible && "Ljava/lang/invoke/MethodHandle$PolymorphicSignature;".equals(sig)) { //$NON-NLS-1$
@@ -190,23 +187,88 @@
 
 			@Override
 			public AnnotationVisitor visitAnnotationDefault() {
-				return new TraceAnnotationVisitor() {
-					@Override
-					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);
 			}
 		};
 	}
 
+	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;
+	}
+
+	/**
+	 * 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;
+		}
+
+		@Override
+		public void visit(String name, Object value) {
+			if (trace) {
+				appendValue(value);
+				traceCount++;
+				return;
+			}
+			this.value = value;
+		}
+
+		@Override
+		public AnnotationVisitor visitAnnotation(String name, String desc) {
+			trace = true;
+			return this;
+		}
+
+		@Override
+		public void visitEnum(String name, String desc, String value) {
+			if (trace) {
+				appendValue(value);
+				traceCount++;
+				return;
+			}
+			this.value = value;
+		}
+
+		@Override
+		public AnnotationVisitor visitArray(String name) {
+			trace = true;
+			return this;
+		}
+
+		@Override
+		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());
+				}
+			}
+		}
+	}
+
 	/**
 	 * Builds a type structure with the given .class file bytes in the specified
 	 * API component.
@@ -222,11 +284,11 @@
 			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);
-			}
+			logAndReturn(file, e);
 			return null;
+		} catch (IllegalArgumentException iae) {
+			// thrown from ASM 5.0 for bad bytecodes
+			return logAndReturn(file, iae);
 		}
 		return visitor.fType;
 	}
@@ -260,14 +322,14 @@
 		}
 	}
 
-	static class EnclosingMethodSetter extends ClassAdapter {
+	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('.', '/');
 		}
 
@@ -296,11 +358,11 @@
 		}
 	}
 
-	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;
 		}