AspectJ 1.8.13 dev
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/BuildArgParser.class b/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/BuildArgParser.class
index 50257aa..93ae7f4 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/BuildArgParser.class
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/BuildArgParser.class
Binary files differ
diff --git a/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/messages.properties b/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/messages.properties
index 836cc9a..e0c9429 100644
--- a/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/messages.properties
+++ b/org.aspectj.ajde/classes/org/aspectj/ajdt/ajc/messages.properties
@@ -4,7 +4,7 @@
      The -Xlintfile:lint.properties allows fine-grained control. In tools.jar, see
      org/aspectj/weaver/XlintDefault.properties for the default behavior and a template to copy. 
 ### AspectJ-specific messages 
-compiler.name = AspectJ Compiler 1.8.11
+compiler.name = AspectJ Compiler 1.8.12
 compiler.version = Eclipse Compiler Neon.2 #75dbfad0, 3.12
 compiler.copyright = 
 
diff --git a/org.aspectj.ajde/source/org/aspectj/ajdt/ajc/messages.properties b/org.aspectj.ajde/source/org/aspectj/ajdt/ajc/messages.properties
index 836cc9a..e0c9429 100644
--- a/org.aspectj.ajde/source/org/aspectj/ajdt/ajc/messages.properties
+++ b/org.aspectj.ajde/source/org/aspectj/ajdt/ajc/messages.properties
@@ -4,7 +4,7 @@
      The -Xlintfile:lint.properties allows fine-grained control. In tools.jar, see
      org/aspectj/weaver/XlintDefault.properties for the default behavior and a template to copy. 
 ### AspectJ-specific messages 
-compiler.name = AspectJ Compiler 1.8.11
+compiler.name = AspectJ Compiler 1.8.12
 compiler.version = Eclipse Compiler Neon.2 #75dbfad0, 3.12
 compiler.copyright = 
 
diff --git a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/Constants.class b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/Constants.class
index 48ad5c2..386deb6 100644
--- a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/Constants.class
+++ b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/Constants.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/ExceptionConstants.class b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/ExceptionConstants.class
index 7b6f53d..72ebc38 100644
--- a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/ExceptionConstants.class
+++ b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/ExceptionConstants.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/classfile/ConstantPool.class b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/classfile/ConstantPool.class
index 9eca769..71cd4cb 100644
--- a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/classfile/ConstantPool.class
+++ b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/classfile/ConstantPool.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/generic/MethodGen.class b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/generic/MethodGen.class
index b0fb56d..2b19e29 100644
--- a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/generic/MethodGen.class
+++ b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/generic/MethodGen.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/ClassLoaderRepository$SoftHashMap$SpecialValue.class b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/ClassLoaderRepository$SoftHashMap$SpecialValue.class
index fcd1fc2..699ebc4 100644
--- a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/ClassLoaderRepository$SoftHashMap$SpecialValue.class
+++ b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/ClassLoaderRepository$SoftHashMap$SpecialValue.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/ClassLoaderRepository$SoftHashMap.class b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/ClassLoaderRepository$SoftHashMap.class
index 186983a..95b894c 100644
--- a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/ClassLoaderRepository$SoftHashMap.class
+++ b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/ClassLoaderRepository$SoftHashMap.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/ClassLoaderRepository.class b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/ClassLoaderRepository.class
index e7b2eec..bfea261 100644
--- a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/ClassLoaderRepository.class
+++ b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/ClassLoaderRepository.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/NonCachingClassLoaderRepository$SoftHashMap.class b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/NonCachingClassLoaderRepository$SoftHashMap.class
index 2def251..be9f52e 100644
--- a/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/NonCachingClassLoaderRepository$SoftHashMap.class
+++ b/org.aspectj.weaver/classes/org/aspectj/apache/bcel/util/NonCachingClassLoaderRepository$SoftHashMap.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/bridge/Version.class b/org.aspectj.weaver/classes/org/aspectj/bridge/Version.class
index 1bd9262..6dcc00b 100644
--- a/org.aspectj.weaver/classes/org/aspectj/bridge/Version.class
+++ b/org.aspectj.weaver/classes/org/aspectj/bridge/Version.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/Dump.class b/org.aspectj.weaver/classes/org/aspectj/weaver/Dump.class
index 90de912..5d8b3f2 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/Dump.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/Dump.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/AnnotationFinder.class b/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/AnnotationFinder.class
index 4c8a04f..c91ddb8 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/AnnotationFinder.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/AnnotationFinder.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/Java15AnnotationFinder.class b/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/Java15AnnotationFinder.class
index b1ad479..41eebb8 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/Java15AnnotationFinder.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/Java15AnnotationFinder.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionBasedResolvedMemberImpl.class b/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionBasedResolvedMemberImpl.class
index 9ed6426..91f707a 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionBasedResolvedMemberImpl.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionBasedResolvedMemberImpl.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionWorld$ExceptionBasedMessageHandler.class b/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionWorld$ExceptionBasedMessageHandler.class
index eae358c..b797682 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionWorld$ExceptionBasedMessageHandler.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionWorld$ExceptionBasedMessageHandler.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException.class b/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException.class
index db00f0c..0808dab 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionWorld.class b/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionWorld.class
index 5c5a64e..5e32169 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionWorld.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/reflect/ReflectionWorld.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/PointcutParser$1.class b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/PointcutParser$1.class
index 22d3058..68cffde 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/PointcutParser$1.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/PointcutParser$1.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/PointcutParser.class b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/PointcutParser.class
index 08e1f86..1d58460 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/PointcutParser.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/PointcutParser.class
Binary files differ
diff --git a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/WeavingAdaptor.class b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/WeavingAdaptor.class
index d538e43..e3aaa77 100644
--- a/org.aspectj.weaver/classes/org/aspectj/weaver/tools/WeavingAdaptor.class
+++ b/org.aspectj.weaver/classes/org/aspectj/weaver/tools/WeavingAdaptor.class
Binary files differ
diff --git a/org.aspectj.weaver/source/org/aspectj/bridge/Version.java b/org.aspectj.weaver/source/org/aspectj/bridge/Version.java
index e1893d5..391c179 100644
--- a/org.aspectj.weaver/source/org/aspectj/bridge/Version.java
+++ b/org.aspectj.weaver/source/org/aspectj/bridge/Version.java
@@ -37,7 +37,7 @@
       * Time text set by build script using SIMPLE_DATE_FORMAT.
       * (if DEVELOPMENT version, invalid)
       */
-    public static final String time_text = "Monday Oct 30, 2017 at 16:44:03 GMT";
+    public static final String time_text = "Monday Oct 30, 2017 at 17:23:54 GMT";
 
     /** 
       * time in seconds-since-... format, used by programmatic clients.
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/reflect/AnnotationFinder.java b/org.aspectj.weaver/source/org/aspectj/weaver/reflect/AnnotationFinder.java
index 7efeac9..90ce368 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/reflect/AnnotationFinder.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/reflect/AnnotationFinder.java
@@ -1,18 +1,16 @@
 /* *******************************************************************
- * Copyright (c) 2005 Contributors.
+ * Copyright (c) 2005, 2017 Contributors.
+ * 
  * 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 
  * http://eclipse.org/legal/epl-v10.html 
  *  
- * Contributors: 
- *   Adrian Colyer			Initial implementation
  * ******************************************************************/
 package org.aspectj.weaver.reflect;
 
 import java.lang.reflect.Member;
-import java.util.Set;
 
 import org.aspectj.weaver.AnnotationAJ;
 import org.aspectj.weaver.ResolvedType;
@@ -20,7 +18,8 @@
 import org.aspectj.weaver.World;
 
 /**
- * @author colyer Used in 1.4 code to access annotations safely
+ * @author Adrian Colyer
+ * @author Andy Clement
  */
 public interface AnnotationFinder {
 
@@ -32,14 +31,13 @@
 
 	Object getAnnotationFromMember(ResolvedType annotationType, Member aMember);
 
-	public AnnotationAJ getAnnotationOfType(UnresolvedType ofType,
-			Member onMember);
+	public AnnotationAJ getAnnotationOfType(UnresolvedType ofType, Member onMember);
 
 	public String getAnnotationDefaultValue(Member onMember);
 
-	Object getAnnotationFromClass(ResolvedType annotationType, Class aClass);
+	Object getAnnotationFromClass(ResolvedType annotationType, Class<?> aClass);
 
-	Set/* ResolvedType */getAnnotations(Member onMember);
+	ResolvedType[] getAnnotations(Member onMember, boolean runtimeAnnotationsOnly);
 
 	ResolvedType[][] getParameterAnnotationTypes(Member onMember);
 }
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/reflect/Java15AnnotationFinder.java b/org.aspectj.weaver/source/org/aspectj/weaver/reflect/Java15AnnotationFinder.java
index a978d96..016becf 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/reflect/Java15AnnotationFinder.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/reflect/Java15AnnotationFinder.java
@@ -1,13 +1,10 @@
 /* *******************************************************************
- * Copyright (c) 2005 Contributors.
+ * Copyright (c) 2005, 2017 Contributors.
  * 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 
  * http://eclipse.org/legal/epl-v10.html 
- *  
- * Contributors: 
- *   Adrian Colyer			Initial implementation
  * ******************************************************************/
 package org.aspectj.weaver.reflect;
 
@@ -17,15 +14,13 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
 
 import org.aspectj.apache.bcel.classfile.AnnotationDefault;
 import org.aspectj.apache.bcel.classfile.Attribute;
 import org.aspectj.apache.bcel.classfile.JavaClass;
 import org.aspectj.apache.bcel.classfile.LocalVariable;
 import org.aspectj.apache.bcel.classfile.LocalVariableTable;
+import org.aspectj.apache.bcel.util.ClassLoaderRepository;
 import org.aspectj.apache.bcel.util.NonCachingClassLoaderRepository;
 import org.aspectj.apache.bcel.util.Repository;
 import org.aspectj.weaver.AnnotationAJ;
@@ -36,36 +31,44 @@
 import org.aspectj.weaver.bcel.BcelWeakClassLoaderReference;
 
 /**
- * Find the given annotation (if present) on the given object
  * 
+ * @author Adrian Colyer
+ * @author Andy Clement
  */
 public class Java15AnnotationFinder implements AnnotationFinder, ArgNameFinder {
 
+	public static final ResolvedType[][] NO_PARAMETER_ANNOTATIONS = new ResolvedType[][] {};
+
 	private Repository bcelRepository;
 	private BcelWeakClassLoaderReference classLoaderRef;
 	private World world;
+	private static boolean useCachingClassLoaderRepository;
+	
+	static {
+		try {
+			useCachingClassLoaderRepository = System.getProperty("Xset:bcelRepositoryCaching","true").equalsIgnoreCase("true");
+		} catch (Throwable t) {
+			useCachingClassLoaderRepository = false;
+		}
+	}
 
 	// must have no-arg constructor for reflective construction
 	public Java15AnnotationFinder() {
 	}
 
 	public void setClassLoader(ClassLoader aLoader) {
-		// TODO: No easy way to ask the world factory for the right kind of
-		// repository so
-		// default to the safe one! (pr160674)
 		this.classLoaderRef = new BcelWeakClassLoaderReference(aLoader);
-		this.bcelRepository = new NonCachingClassLoaderRepository(classLoaderRef);
+		if (useCachingClassLoaderRepository) {
+			this.bcelRepository = new ClassLoaderRepository(classLoaderRef);
+		} else {
+			this.bcelRepository = new NonCachingClassLoaderRepository(classLoaderRef);
+		}
 	}
 
 	public void setWorld(World aWorld) {
 		this.world = aWorld;
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.aspectj.weaver.reflect.AnnotationFinder#getAnnotation(org.aspectj .weaver.ResolvedType, java.lang.Object)
-	 */
 	public Object getAnnotation(ResolvedType annotationType, Object onObject) {
 		try {
 			Class<? extends Annotation> annotationClass = (Class<? extends Annotation>) Class.forName(annotationType.getName(),
@@ -155,7 +158,6 @@
 		} catch (ClassNotFoundException cnfEx) {
 			// just use reflection then
 		}
-
 		return null;
 	}
 
@@ -186,80 +188,76 @@
 		} catch (ClassNotFoundException cnfEx) {
 			// just use reflection then
 		}
-
 		return null;
 	}
 
-	public Set getAnnotations(Member onMember) {
-		if (!(onMember instanceof AccessibleObject))
-			return Collections.EMPTY_SET;
-		// here we really want both the runtime visible AND the class visible
-		// annotations
-		// so we bail out to Bcel and then chuck away the JavaClass so that we
-		// don't hog
-		// memory.
-		try {
-			JavaClass jc = bcelRepository.loadClass(onMember.getDeclaringClass());
-			org.aspectj.apache.bcel.classfile.annotation.AnnotationGen[] anns = new org.aspectj.apache.bcel.classfile.annotation.AnnotationGen[0];
-			if (onMember instanceof Method) {
-				org.aspectj.apache.bcel.classfile.Method bcelMethod = jc.getMethod((Method) onMember);
-				if (bcelMethod == null) {
-					// fallback on reflection - see pr220430
-					// System.err.println(
-					// "Unexpected problem in Java15AnnotationFinder: cannot retrieve annotations on method '"
-					// +
-					// onMember.getName()+"' in class '"+jc.getClassName()+"'");
-				} else {
-					anns = bcelMethod.getAnnotations();
+	public ResolvedType[] getAnnotations(Member onMember, boolean areRuntimeAnnotationsSufficient) {
+		if (!(onMember instanceof AccessibleObject)) {
+			return ResolvedType.NONE;
+		}
+		// If annotations with class level retention are required then we need to open
+		// open the class file. If only runtime retention annotations are required
+		// we can just use reflection.
+		if (!areRuntimeAnnotationsSufficient) {
+			try {
+				JavaClass jc = bcelRepository.loadClass(onMember.getDeclaringClass());
+				org.aspectj.apache.bcel.classfile.annotation.AnnotationGen[] anns = null;
+				if (onMember instanceof Method) {
+					org.aspectj.apache.bcel.classfile.Method bcelMethod = jc.getMethod((Method) onMember);
+					if (bcelMethod != null) {
+						anns = bcelMethod.getAnnotations();
+					}
+				} else if (onMember instanceof Constructor) {
+					org.aspectj.apache.bcel.classfile.Method bcelCons = jc.getMethod((Constructor) onMember);
+					anns = bcelCons.getAnnotations();
+				} else if (onMember instanceof Field) {
+					org.aspectj.apache.bcel.classfile.Field bcelField = jc.getField((Field) onMember);
+					anns = bcelField.getAnnotations();
 				}
-			} else if (onMember instanceof Constructor) {
-				org.aspectj.apache.bcel.classfile.Method bcelCons = jc.getMethod((Constructor) onMember);
-				anns = bcelCons.getAnnotations();
-			} else if (onMember instanceof Field) {
-				org.aspectj.apache.bcel.classfile.Field bcelField = jc.getField((Field) onMember);
-				anns = bcelField.getAnnotations();
+				// the answer is cached and we don't want to hold on to memory
+				bcelRepository.clear();
+				if (anns == null || anns.length == 0) {
+					return ResolvedType.NONE;
+				}
+				ResolvedType[] annotationTypes = new ResolvedType[anns.length];
+				for (int i = 0; i < anns.length; i++) {
+					annotationTypes[i] = world.resolve(UnresolvedType.forSignature(anns[i].getTypeSignature()));
+				}
+				return annotationTypes;
+			} catch (ClassNotFoundException cnfEx) {
+				// just use reflection then
 			}
-			// the answer is cached and we don't want to hold on to memory
-			bcelRepository.clear();
-			// OPTIMIZE make this a constant 0 size array
-			if (anns == null)
-				anns = new org.aspectj.apache.bcel.classfile.annotation.AnnotationGen[0];
-			// convert to our Annotation type
-			Set<ResolvedType> annSet = new HashSet<ResolvedType>();
-			for (int i = 0; i < anns.length; i++) {
-				annSet.add(world.resolve(UnresolvedType.forSignature(anns[i].getTypeSignature())));
-			}
-			return annSet;
-		} catch (ClassNotFoundException cnfEx) {
-			// just use reflection then
 		}
 
 		AccessibleObject ao = (AccessibleObject) onMember;
 		Annotation[] anns = ao.getDeclaredAnnotations();
-		Set<UnresolvedType> annSet = new HashSet<UnresolvedType>();
-		for (int i = 0; i < anns.length; i++) {
-			annSet.add(UnresolvedType.forName(anns[i].annotationType().getName()).resolve(world));
+		if (anns.length == 0) {
+			return ResolvedType.NONE;
 		}
-		return annSet;
+		ResolvedType[] annotationTypes = new ResolvedType[anns.length];
+		for (int i = 0; i < anns.length; i++) {
+			annotationTypes[i] = UnresolvedType.forName(anns[i].annotationType().getName()).resolve(world);
+		}
+		return annotationTypes;
 	}
 
 	public ResolvedType[] getAnnotations(Class forClass, World inWorld) {
 		// here we really want both the runtime visible AND the class visible
-		// annotations
-		// so we bail out to Bcel and then chuck away the JavaClass so that we
-		// don't hog
-		// memory.
+		// annotations so we bail out to Bcel and then chuck away the JavaClass so that we
+		// don't hog memory.
 		try {
 			JavaClass jc = bcelRepository.loadClass(forClass);
 			org.aspectj.apache.bcel.classfile.annotation.AnnotationGen[] anns = jc.getAnnotations();
 			bcelRepository.clear();
-			if (anns == null)
+			if (anns == null) {
 				return ResolvedType.NONE;
-			ResolvedType[] ret = new ResolvedType[anns.length];
-			for (int i = 0; i < ret.length; i++) {
-				ret[i] = inWorld.resolve(UnresolvedType.forSignature(anns[i].getTypeSignature()));
+			} else {
+				ResolvedType[] ret = new ResolvedType[anns.length];
+				for (int i = 0; i < ret.length; i++) {
+					ret[i] = inWorld.resolve(UnresolvedType.forSignature(anns[i].getTypeSignature()));
+				}
+				return ret;
 			}
-			return ret;
 		} catch (ClassNotFoundException cnfEx) {
 			// just use reflection then
 		}
@@ -313,8 +311,6 @@
 		return ret;
 	}
 
-	public static final ResolvedType[][] NO_PARAMETER_ANNOTATIONS = new ResolvedType[][] {};
-
 	public ResolvedType[][] getParameterAnnotationTypes(Member onMember) {
 		if (!(onMember instanceof AccessibleObject))
 			return NO_PARAMETER_ANNOTATIONS;
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/reflect/ReflectionBasedResolvedMemberImpl.java b/org.aspectj.weaver/source/org/aspectj/weaver/reflect/ReflectionBasedResolvedMemberImpl.java
index 28c8aac..ba8f133 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/reflect/ReflectionBasedResolvedMemberImpl.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/reflect/ReflectionBasedResolvedMemberImpl.java
@@ -1,18 +1,15 @@
 /* *******************************************************************
- * Copyright (c) 2005 Contributors.
+ * Copyright (c) 2005, 2017 Contributors.
  * 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 
  * http://eclipse.org/legal/epl-v10.html 
  *  
- * Contributors: 
- *   Adrian Colyer			Initial implementation
  * ******************************************************************/
 package org.aspectj.weaver.reflect;
 
 import java.lang.reflect.Member;
-import java.util.Set;
 
 import org.aspectj.weaver.AnnotationAJ;
 import org.aspectj.weaver.MemberKind;
@@ -24,37 +21,29 @@
 /**
  * Subtype of ResolvedMemberImpl used in reflection world. Knows how to get annotations from a java.lang.reflect.Member
  * 
+ * @author Adrian Colyer
+ * @author Andy Clement
  */
 public class ReflectionBasedResolvedMemberImpl extends ResolvedMemberImpl {
 
 	private AnnotationFinder annotationFinder = null;
 	private GenericSignatureInformationProvider gsigInfoProvider = new Java14GenericSignatureInformationProvider();
+	
+	/**
+	 * If true then only runtime visible annotations have been resolved via reflection. If class retention
+	 * annotations are also required (later) then the cache will have to be rebuilt using a more detailed
+	 * dig into the class file.
+	 */
+	private boolean onlyRuntimeAnnotationsCached;
 
 	private Member reflectMember;
 
-	/**
-	 * @param kind
-	 * @param declaringType
-	 * @param modifiers
-	 * @param returnType
-	 * @param name
-	 * @param parameterTypes
-	 */
 	public ReflectionBasedResolvedMemberImpl(MemberKind kind, UnresolvedType declaringType, int modifiers,
 			UnresolvedType returnType, String name, UnresolvedType[] parameterTypes, Member reflectMember) {
 		super(kind, declaringType, modifiers, returnType, name, parameterTypes);
 		this.reflectMember = reflectMember;
 	}
 
-	/**
-	 * @param kind
-	 * @param declaringType
-	 * @param modifiers
-	 * @param returnType
-	 * @param name
-	 * @param parameterTypes
-	 * @param checkedExceptions
-	 */
 	public ReflectionBasedResolvedMemberImpl(MemberKind kind, UnresolvedType declaringType, int modifiers,
 			UnresolvedType returnType, String name, UnresolvedType[] parameterTypes, UnresolvedType[] checkedExceptions,
 			Member reflectMember) {
@@ -62,16 +51,6 @@
 		this.reflectMember = reflectMember;
 	}
 
-	/**
-	 * @param kind
-	 * @param declaringType
-	 * @param modifiers
-	 * @param returnType
-	 * @param name
-	 * @param parameterTypes
-	 * @param checkedExceptions
-	 * @param backingGenericMember
-	 */
 	public ReflectionBasedResolvedMemberImpl(MemberKind kind, UnresolvedType declaringType, int modifiers,
 			UnresolvedType returnType, String name, UnresolvedType[] parameterTypes, UnresolvedType[] checkedExceptions,
 			ResolvedMember backingGenericMember, Member reflectMember) {
@@ -79,13 +58,6 @@
 		this.reflectMember = reflectMember;
 	}
 
-	/**
-	 * @param kind
-	 * @param declaringType
-	 * @param modifiers
-	 * @param name
-	 * @param signature
-	 */
 	public ReflectionBasedResolvedMemberImpl(MemberKind kind, UnresolvedType declaringType, int modifiers, String name,
 			String signature, Member reflectMember) {
 		super(kind, declaringType, modifiers, name, signature);
@@ -96,89 +68,64 @@
 		return this.reflectMember;
 	}
 
-	// generic signature support
-
 	public void setGenericSignatureInformationProvider(GenericSignatureInformationProvider gsigProvider) {
 		this.gsigInfoProvider = gsigProvider;
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.aspectj.weaver.ResolvedMemberImpl#getGenericParameterTypes()
-	 */
 	@Override
 	public UnresolvedType[] getGenericParameterTypes() {
 		return this.gsigInfoProvider.getGenericParameterTypes(this);
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.aspectj.weaver.ResolvedMemberImpl#getGenericReturnType()
-	 */
 	@Override
 	public UnresolvedType getGenericReturnType() {
 		return this.gsigInfoProvider.getGenericReturnType(this);
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.aspectj.weaver.ResolvedMemberImpl#isSynthetic()
-	 */
 	@Override
 	public boolean isSynthetic() {
 		return this.gsigInfoProvider.isSynthetic(this);
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.aspectj.weaver.ResolvedMemberImpl#isVarargsMethod()
-	 */
 	@Override
 	public boolean isVarargsMethod() {
 		return this.gsigInfoProvider.isVarArgs(this);
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.aspectj.weaver.ResolvedMemberImpl#isBridgeMethod()
-	 */
 	@Override
 	public boolean isBridgeMethod() {
 		return this.gsigInfoProvider.isBridge(this);
 	}
 
-	// annotation support
-
 	public void setAnnotationFinder(AnnotationFinder finder) {
 		this.annotationFinder = finder;
 	}
 
 	@Override
 	public boolean hasAnnotation(UnresolvedType ofType) {
-		unpackAnnotations();
+		boolean areRuntimeRetentionAnnotationsSufficient = false;
+		if (ofType instanceof ResolvedType) {
+			areRuntimeRetentionAnnotationsSufficient = ((ResolvedType)ofType).isAnnotationWithRuntimeRetention();
+		}
+		unpackAnnotations(areRuntimeRetentionAnnotationsSufficient);
 		return super.hasAnnotation(ofType);
 	}
 
 	@Override
 	public boolean hasAnnotations() {
-		unpackAnnotations();
+		unpackAnnotations(false);
 		return super.hasAnnotations();
 	}
 
 	@Override
 	public ResolvedType[] getAnnotationTypes() {
-		unpackAnnotations();
+		unpackAnnotations(false);
 		return super.getAnnotationTypes();
 	}
 
 	@Override
 	public AnnotationAJ getAnnotationOfType(UnresolvedType ofType) {
-		unpackAnnotations();
+		unpackAnnotations(false);
 		if (annotationFinder == null || annotationTypes == null) {
 			return null;
 		}
@@ -206,18 +153,10 @@
 		return parameterAnnotationTypes;
 	}
 
-	private void unpackAnnotations() {
-		if (annotationTypes == null && annotationFinder != null) {
-			Set<?> s = annotationFinder.getAnnotations(reflectMember);
-			if (s.size() == 0) {
-				annotationTypes = ResolvedType.EMPTY_ARRAY;
-			} else {
-				annotationTypes = new ResolvedType[s.size()];
-				int i = 0;
-				for (Object o : s) {
-					annotationTypes[i++] = (ResolvedType) o;
-				}
-			}
+	private void unpackAnnotations(boolean areRuntimeRetentionAnnotationsSufficient) {
+		if (annotationFinder != null && (annotationTypes == null || (!areRuntimeRetentionAnnotationsSufficient && onlyRuntimeAnnotationsCached))) {
+			annotationTypes = annotationFinder.getAnnotations(reflectMember, areRuntimeRetentionAnnotationsSufficient);
+			onlyRuntimeAnnotationsCached = areRuntimeRetentionAnnotationsSufficient;
 		}
 	}
 }
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/reflect/ReflectionWorld.java b/org.aspectj.weaver/source/org/aspectj/weaver/reflect/ReflectionWorld.java
index 98e8002..ac1f5e1 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/reflect/ReflectionWorld.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/reflect/ReflectionWorld.java
@@ -1,17 +1,16 @@
 /* *******************************************************************
- * Copyright (c) 2005 Contributors.
+ * Copyright (c) 2005-2017 Contributors.
  * 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 
  * http://eclipse.org/legal/epl-v10.html 
- *  
- * Contributors: 
- *   Adrian Colyer			Initial implementation
  * ******************************************************************/
 package org.aspectj.weaver.reflect;
 
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 
 import org.aspectj.bridge.AbortException;
@@ -31,14 +30,47 @@
  * A ReflectionWorld is used solely for purposes of type resolution based on the runtime classpath (java.lang.reflect). It does not
  * support weaving operations (creation of mungers etc..).
  * 
+ * @author Adrian Colyer
+ * @author Andy Clement
  */
 public class ReflectionWorld extends World implements IReflectionWorld {
 
+	private static Map<WeakClassLoaderReference, ReflectionWorld> rworlds = Collections.synchronizedMap(new HashMap<WeakClassLoaderReference, ReflectionWorld>());
+
 	private WeakClassLoaderReference classLoaderReference;
 	private AnnotationFinder annotationFinder;
 	private boolean mustUseOneFourDelegates = false; // for testing
 	private Map<String,Class<?>> inProgressResolutionClasses = new HashMap<String,Class<?>>();
-
+	
+	public static ReflectionWorld getReflectionWorldFor(WeakClassLoaderReference classLoaderReference) {
+		return new ReflectionWorld(classLoaderReference);
+//		synchronized (rworlds) {
+//			// Tidyup any no longer relevant entries...
+//			for (Iterator<Map.Entry<WeakClassLoaderReference, ReflectionWorld>> it = rworlds.entrySet().iterator();
+//					it.hasNext();) {
+//				Map.Entry<WeakClassLoaderReference, ReflectionWorld> entry = it.next();
+//				if (entry.getKey().getClassLoader() == null) {
+//					it.remove();
+//				}
+//			}
+//			ReflectionWorld rworld = null;
+//			if (classLoaderReference.getClassLoader() != null) {
+//				rworld = rworlds.get(classLoaderReference);
+//				if (rworld == null) {
+//					rworld = new ReflectionWorld(classLoaderReference);
+//					rworlds.put(classLoaderReference, rworld);
+//				}
+//			}
+//			return rworld;
+//		}
+	}
+	
+	public static void cleanUpWorlds() {
+		synchronized (rworlds) {
+			rworlds.clear();
+		}
+	}
+	
 	private ReflectionWorld() {
 		// super();
 		// this.setMessageHandler(new ExceptionBasedMessageHandler());
@@ -49,6 +81,13 @@
 		// makeAnnotationFinderIfAny(classLoaderReference.getClassLoader(),
 		// this);
 	}
+	
+	public ReflectionWorld(WeakClassLoaderReference classloaderRef) {
+		this.setMessageHandler(new ExceptionBasedMessageHandler());
+		setBehaveInJava5Way(LangUtil.is15VMOrGreater());
+		classLoaderReference = classloaderRef;
+		annotationFinder = makeAnnotationFinderIfAny(classLoaderReference.getClassLoader(), this);
+	}
 
 	public ReflectionWorld(ClassLoader aClassLoader) {
 		super();
@@ -71,7 +110,7 @@
 		AnnotationFinder annotationFinder = null;
 		try {
 			if (LangUtil.is15VMOrGreater()) {
-				Class java15AnnotationFinder = Class.forName("org.aspectj.weaver.reflect.Java15AnnotationFinder");
+				Class<?> java15AnnotationFinder = Class.forName("org.aspectj.weaver.reflect.Java15AnnotationFinder");
 				annotationFinder = (AnnotationFinder) java15AnnotationFinder.newInstance();
 				annotationFinder.setClassLoader(loader);
 				annotationFinder.setWorld(world);
@@ -99,7 +138,7 @@
 		return resolve(this, aClass);
 	}
 
-	public static ResolvedType resolve(World world, Class aClass) {
+	public static ResolvedType resolve(World world, Class<?> aClass) {
 		// classes that represent arrays return a class name that is the
 		// signature of the array type, ho-hum...
 		String className = aClass.getName();
diff --git a/org.aspectj.weaver/source/org/aspectj/weaver/tools/PointcutParser.java b/org.aspectj.weaver/source/org/aspectj/weaver/tools/PointcutParser.java
index 649aa0b..4e3b2bd 100644
--- a/org.aspectj.weaver/source/org/aspectj/weaver/tools/PointcutParser.java
+++ b/org.aspectj.weaver/source/org/aspectj/weaver/tools/PointcutParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
+ * Copyright (c) 2004, 2017 Contributors
  * 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
@@ -51,6 +51,9 @@
 
 /**
  * A PointcutParser can be used to build PointcutExpressions for a user-defined subset of AspectJ's pointcut language
+ * 
+ * @author Adrian Colyer
+ * @author Andy Clement
  */
 public class PointcutParser {
 
@@ -123,7 +126,7 @@
 	 * @throws UnsupportedOperationException if the set contains if, cflow, or cflow below
 	 */
 	public static PointcutParser getPointcutParserSupportingSpecifiedPrimitivesAndUsingContextClassloaderForResolution(
-			Set supportedPointcutKinds) {
+			Set<PointcutPrimitive> supportedPointcutKinds) {
 		PointcutParser p = new PointcutParser(supportedPointcutKinds);
 		p.setClassLoader(Thread.currentThread().getContextClassLoader());
 		return p;
@@ -163,7 +166,7 @@
 	 * @throws UnsupportedOperationException if the set contains if, cflow, or cflow below
 	 */
 	public static PointcutParser getPointcutParserSupportingSpecifiedPrimitivesAndUsingSpecifiedClassLoaderForResolution(
-			Set supportedPointcutKinds, ClassLoader classLoader) {
+			Set<PointcutPrimitive> supportedPointcutKinds, ClassLoader classLoader) {
 		PointcutParser p = new PointcutParser(supportedPointcutKinds);
 		p.setClassLoader(classLoader);
 		return p;
@@ -216,7 +219,22 @@
 	 */
 	protected void setClassLoader(ClassLoader aLoader) {
 		this.classLoaderReference = new WeakClassLoaderReference(aLoader);
-		world = new ReflectionWorld(this.classLoaderReference.getClassLoader());
+		world = ReflectionWorld.getReflectionWorldFor(this.classLoaderReference);
+	}
+	
+	/**
+	 * Set the classloader that this parser should use for type resolution.
+	 * 
+	 * @param aLoader
+	 * @param shareWorlds if true then two PointcutParsers operating using the same classloader will share a ReflectionWorld
+	 */
+	protected void setClassLoader(ClassLoader aLoader, boolean shareWorlds) {
+		this.classLoaderReference = new WeakClassLoaderReference(aLoader);
+		if (shareWorlds) {
+			world = ReflectionWorld.getReflectionWorldFor(this.classLoaderReference);
+		} else {
+			world = new ReflectionWorld(classLoaderReference);
+		}
 	}
 
 	/**
@@ -261,7 +279,7 @@
 	 * @param type
 	 * @return
 	 */
-	public PointcutParameter createPointcutParameter(String name, Class type) {
+	public PointcutParameter createPointcutParameter(String name, Class<?> type) {
 		return new PointcutParameterImpl(name, type);
 	}
 
@@ -287,7 +305,7 @@
 	 *         supported by this PointcutParser.
 	 * @throws IllegalArgumentException if the expression is not a well-formed pointcut expression
 	 */
-	public PointcutExpression parsePointcutExpression(String expression, Class inScope, PointcutParameter[] formalParameters)
+	public PointcutExpression parsePointcutExpression(String expression, Class<?> inScope, PointcutParameter[] formalParameters)
 			throws UnsupportedPointcutPrimitiveException, IllegalArgumentException {
 		PointcutExpressionImpl pcExpr = null;
 		try {
@@ -303,7 +321,7 @@
 		return pcExpr;
 	}
 
-	protected Pointcut resolvePointcutExpression(String expression, Class inScope, PointcutParameter[] formalParameters) {
+	protected Pointcut resolvePointcutExpression(String expression, Class<?> inScope, PointcutParameter[] formalParameters) {
 		try {
 			PatternParser parser = new PatternParser(expression);
 			parser.setPointcutDesignatorHandlers(pointcutDesignators, world);
@@ -317,7 +335,7 @@
 		}
 	}
 
-	protected Pointcut concretizePointcutExpression(Pointcut pc, Class inScope, PointcutParameter[] formalParameters) {
+	protected Pointcut concretizePointcutExpression(Pointcut pc, Class<?> inScope, PointcutParameter[] formalParameters) {
 		ResolvedType declaringTypeForResolution = null;
 		if (inScope != null) {
 			declaringTypeForResolution = getWorld().resolve(inScope.getName());
@@ -355,7 +373,7 @@
 	}
 
 	/* for testing */
-	Set getSupportedPrimitives() {
+	Set<PointcutPrimitive> getSupportedPrimitives() {
 		return supportedPrimitives;
 	}
 
@@ -366,7 +384,7 @@
 		return current;
 	}
 
-	private IScope buildResolutionScope(Class inScope, PointcutParameter[] formalParameters) {
+	private IScope buildResolutionScope(Class<?> inScope, PointcutParameter[] formalParameters) {
 		if (formalParameters == null) {
 			formalParameters = new PointcutParameter[0];
 		}
@@ -398,7 +416,7 @@
 		}
 	}
 
-	private UnresolvedType toUnresolvedType(Class clazz) {
+	private UnresolvedType toUnresolvedType(Class<?> clazz) {
 		if (clazz.isArray()) {
 			return UnresolvedType.forSignature(clazz.getName().replace('.', '/'));
 		} else {
@@ -560,4 +578,5 @@
 		msg.append("\n");
 		return msg.toString();
 	}
+	
 }
diff --git a/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/codeconversion/ITDAwareNameEnvironment.java b/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/codeconversion/ITDAwareNameEnvironment.java
index 417cd9e..67827d6 100644
--- a/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/codeconversion/ITDAwareNameEnvironment.java
+++ b/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/codeconversion/ITDAwareNameEnvironment.java
@@ -112,7 +112,7 @@
                             sourceTypes[index++] = newOtherInfo; // AspectJ Change
                         }
                     }
-                    return new NameEnvironmentAnswer(sourceTypes, getRestriction(answer), null);
+                    return new NameEnvironmentAnswer(sourceTypes, getRestriction(answer), null, null);
                 } catch (JavaModelException npe) {
                     return null;
                 }
diff --git a/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/javaelements/BinaryAspectElementInfo.java b/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/javaelements/BinaryAspectElementInfo.java
index a97489a..f9a042e 100644
--- a/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/javaelements/BinaryAspectElementInfo.java
+++ b/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/javaelements/BinaryAspectElementInfo.java
@@ -156,4 +156,8 @@
 		return null;
 	}
 
+	public char[] getModule() {
+		return null;
+	}
+
 }
diff --git a/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/text/ITDAwareSelectionRequestor.java b/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/text/ITDAwareSelectionRequestor.java
index 3e8e0e6..737c721 100644
--- a/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/text/ITDAwareSelectionRequestor.java
+++ b/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/text/ITDAwareSelectionRequestor.java
@@ -432,6 +432,11 @@
         return (IJavaElement[]) accepted.toArray(new IJavaElement[accepted.size()]);
     }
 
+	public void acceptModule(char[] arg0, char[] arg1, int arg2, int arg3) {
+		// TODO Auto-generated method stub
+		
+	}
+
     /**
      * Converts from a 'Q' kind of signature to an 'L' kind of signature.
      * This is actually quite tricky.
diff --git a/org.eclipse.ajdt.releng/build.properties b/org.eclipse.ajdt.releng/build.properties
index 98caa50..f6f0ba4 100644
--- a/org.eclipse.ajdt.releng/build.properties
+++ b/org.eclipse.ajdt.releng/build.properties
@@ -41,8 +41,8 @@
 # 1.8.11.20161216164900 - 1.8.11 first build
 # 1.8.11.20161216172400 - 1.8.11 
 # 1.8.11.20171005105600 - 1.8.11 release (plus one extra fix)
-# 1.8.13.20171030094800 - 1.8.13 dev
-ajde.version=1.8.13.20171030094800
+# 1.8.13.20171030102906 - 1.8.13 dev
+ajde.version=1.8.13.20171030102906
 
 
 builder=.
diff --git a/org.eclipse.ajdt.ui/src/org/eclipse/ajdt/internal/launching/AJClasspathModel.java b/org.eclipse.ajdt.ui/src/org/eclipse/ajdt/internal/launching/AJClasspathModel.java
index 8bbc9e8..7fc965a 100755
--- a/org.eclipse.ajdt.ui/src/org/eclipse/ajdt/internal/launching/AJClasspathModel.java
+++ b/org.eclipse.ajdt.ui/src/org/eclipse/ajdt/internal/launching/AJClasspathModel.java
@@ -192,7 +192,7 @@
 	/**
 	 * Copied from super class - create an entry
 	 */
-	private ClasspathGroup createGroupEntry(IRuntimeClasspathEntry[] entries,
+	public ClasspathGroup createGroupEntry(IRuntimeClasspathEntry[] entries,
 			ClasspathGroup entryParent, String name, boolean canBeRemoved,
 			boolean addEntry) {
 
diff --git a/org.eclipse.contribution.weaving.jdt.tests/src/org/eclipse/contribution/weaving/jdt/tests/sourceprovider/SourceTransformerTests.java b/org.eclipse.contribution.weaving.jdt.tests/src/org/eclipse/contribution/weaving/jdt/tests/sourceprovider/SourceTransformerTests.java
index b9991a3..de7fab2 100644
--- a/org.eclipse.contribution.weaving.jdt.tests/src/org/eclipse/contribution/weaving/jdt/tests/sourceprovider/SourceTransformerTests.java
+++ b/org.eclipse.contribution.weaving.jdt.tests/src/org/eclipse/contribution/weaving/jdt/tests/sourceprovider/SourceTransformerTests.java
@@ -39,6 +39,7 @@
 import org.eclipse.jdt.internal.core.BinaryType;
 import org.eclipse.jdt.internal.core.JavaElement;
 import org.eclipse.jdt.internal.core.JavaModelManager;
+import org.eclipse.jdt.internal.core.NamedMember;
 import org.eclipse.jdt.internal.core.SourceMapper;
 import org.eclipse.jdt.internal.core.search.indexing.IndexManager;
 import org.eclipse.jdt.internal.corext.fix.CleanUpConstants;
@@ -142,14 +143,21 @@
     class MockSourceMaper extends SourceMapper {
         boolean sourceMapped = false;
         
-        @Override
-        public void mapSource(IType type, char[] contents, IBinaryType info) {
-            // ensure that the contents have been transformed
+        public void mapSource(NamedMember typeOrModule, char[] contents, IBinaryType info) {
+        	// ensure that the contents have been transformed
             if (new String(contents).equals(
                     new String(new MockSourceTransformer().convert(new char[0])))) {
                 sourceMapped = true;
             }
         }
+        
+//        public void mapSource(IType type, char[] contents, IBinaryType info) {
+//            // ensure that the contents have been transformed
+//            if (new String(contents).equals(
+//                    new String(new MockSourceTransformer().convert(new char[0])))) {
+//                sourceMapped = true;
+//            }
+//        }
     }
 
     class MockBinaryInfo implements IBinaryType {
@@ -247,5 +255,9 @@
 		public ExternalAnnotationStatus getExternalAnnotationStatus() {
 			return null;
 		}
+
+		public char[] getModule() {
+			return null;
+		}
     }
 }