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();
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:
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;
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) {
+ 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;