]> source.dussan.org Git - aspectj.git/commitdiff
serializing formal name
authoraclement <aclement>
Tue, 31 May 2011 22:10:57 +0000 (22:10 +0000)
committeraclement <aclement>
Tue, 31 May 2011 22:10:57 +0000 (22:10 +0000)
org.aspectj.matcher/src/org/aspectj/weaver/patterns/AnnotationTypePattern.java
org.aspectj.matcher/src/org/aspectj/weaver/patterns/ExactAnnotationFieldTypePattern.java

index 88b84867d0befc8e9049d65ab8d736578176d685..0f610fc49625efad6ecdd829cfdad3eb85702502 100644 (file)
@@ -73,6 +73,7 @@ public abstract class AnnotationTypePattern extends PatternNode {
        public static final byte WILD = 8;
        public static final byte EXACTFIELD = 9;
        public static final byte BINDINGFIELD = 10;
+       public static final byte BINDINGFIELD2 = 11;
 
        public static AnnotationTypePattern read(VersionedDataInputStream s, ISourceContext context) throws IOException {
                byte key = s.readByte();
@@ -93,6 +94,8 @@ public abstract class AnnotationTypePattern extends PatternNode {
                        return ExactAnnotationFieldTypePattern.read(s, context);
                case BINDINGFIELD:
                        return BindingAnnotationFieldTypePattern.read(s, context);
+               case BINDINGFIELD2:
+                       return BindingAnnotationFieldTypePattern.read2(s, context);
                case ELLIPSIS_KEY:
                        return ELLIPSIS;
                case ANY_KEY:
index 41b276075819491428df3188e82f96e418300e7b..627b622ebc96306b09f655ccac36d98f52a107a3 100644 (file)
@@ -93,9 +93,11 @@ public class ExactAnnotationFieldTypePattern extends ExactAnnotationTypePattern
 
                ResolvedType formalBindingType = formalBinding.getType().resolve(scope.getWorld());
 
-               if (!(formalBindingType.isEnum() || formalBindingType.getSignature().equals("Ljava/lang/String;"))) {
-                       scope.message(IMessage.ERROR, this, "The field within the annotation must be an enum or string. '"
-                                       + formalBinding.getType() + "' is not (compiler limitation)");
+               String bindingTypeSignature = formalBindingType.getSignature();
+               if (!(formalBindingType.isEnum() || bindingTypeSignature.equals("Ljava/lang/String;") || bindingTypeSignature.equals("I"))) {
+                       scope.message(IMessage.ERROR, this,
+                                       "The field within the annotation must be an enum, string or int. '" + formalBinding.getType()
+                                                       + "' is not (compiler limitation)");
                }
                bindingPattern = true;
 
@@ -103,14 +105,34 @@ public class ExactAnnotationFieldTypePattern extends ExactAnnotationTypePattern
                ReferenceType theAnnotationType = (ReferenceType) annotationType;
                ResolvedMember[] annotationFields = theAnnotationType.getDeclaredMethods();
                field = null;
+               boolean looksAmbiguous = false;
                for (int i = 0; i < annotationFields.length; i++) {
                        ResolvedMember resolvedMember = annotationFields[i];
                        if (resolvedMember.getReturnType().equals(formalBinding.getType())) {
                                if (field != null) {
-                                       scope.message(IMessage.ERROR, this, "The field type '" + formalBinding.getType()
-                                                       + "' is ambiguous for annotation type '" + theAnnotationType.getName() + "'");
+                                       boolean haveProblem = true;
+                                       // use the name to differentiate
+                                       if (field.getName().equals(formalName)) {
+                                               // don't use this new field
+                                               haveProblem = false;
+                                       } else if (resolvedMember.getName().equals(formalName)) {
+                                               // ok, let's use this one
+                                               field = resolvedMember;
+                                               haveProblem = false;
+                                       }
+                                       if (haveProblem) {
+                                               looksAmbiguous = true;
+                                       }
+                               } else {
+                                       field = resolvedMember;
                                }
-                               field = resolvedMember;
+                       }
+               }
+               if (looksAmbiguous) {
+                       // did we find something that does match by name?
+                       if (field == null || !field.getName().equals(formalName)) {
+                               scope.message(IMessage.ERROR, this, "The field type '" + formalBinding.getType()
+                                               + "' is ambiguous for annotation type '" + theAnnotationType.getName() + "'");
                        }
                }
                if (field == null) {
@@ -118,9 +140,10 @@ public class ExactAnnotationFieldTypePattern extends ExactAnnotationTypePattern
                                        + theAnnotationType.getName() + "'");
                }
 
-               BindingAnnotationFieldTypePattern binding = new BindingAnnotationFieldTypePattern(formalBinding.getType(), formalBinding
-                               .getIndex(), theAnnotationType);
+               BindingAnnotationFieldTypePattern binding = new BindingAnnotationFieldTypePattern(formalBinding.getType(),
+                               formalBinding.getIndex(), theAnnotationType);
                binding.copyLocationFrom(this);
+               binding.formalName = this.formalName;
                bindings.register(binding, scope);
                binding.resolveBinding(scope.getWorld());
                return binding;