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;
+ }
}
}