Browse Source

serializing formal name

tags/V1_6_12M1
aclement 13 years ago
parent
commit
04b202690d

+ 3
- 0
org.aspectj.matcher/src/org/aspectj/weaver/patterns/AnnotationTypePattern.java View 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:

+ 31
- 8
org.aspectj.matcher/src/org/aspectj/weaver/patterns/ExactAnnotationFieldTypePattern.java View 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;

Loading…
Cancel
Save