| package annotations.field; |
| |
| /*>>> |
| import org.checkerframework.checker.nullness.qual.*; |
| */ |
| |
| import java.util.Collection; |
| |
| /** |
| * An {@link ArrayAFT} represents an annotation field type that is an array. |
| */ |
| public final class ArrayAFT extends AnnotationFieldType { |
| |
| /** |
| * The element type of the array, or <code>null</code> if it is unknown |
| * (see {@link annotations.AnnotationBuilder#addEmptyArrayField}). |
| */ |
| public final ScalarAFT elementType; |
| |
| /** |
| * Constructs a new {@link ArrayAFT} representing an array type with |
| * the given element type. <code>elementType</code> may be |
| * <code>null</code> to indicate that the element type is unknown |
| * (see {@link annotations.AnnotationBuilder#addEmptyArrayField}). |
| */ |
| public ArrayAFT(ScalarAFT elementType) { |
| this.elementType = elementType; |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public boolean isValidValue(Object o) { |
| if (! (o instanceof Collection)) { |
| return false; |
| } |
| Collection<?> asCollection = (Collection<?>) o; |
| if (elementType == null) { |
| return (asCollection.size() == 0); |
| } |
| for (Object elt : asCollection) { |
| if (! elementType.isValidValue(elt)) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public String toString() { |
| return (elementType == null ? "unknown" : |
| ((ScalarAFT) elementType).toString()) + "[]"; |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public String format(Object o) { |
| Collection<?> asCollection = (Collection<?>)o; |
| StringBuilder result = new StringBuilder(); |
| result.append("{"); |
| for (Object elt : asCollection) { |
| if (result.length() > 1) { |
| result.append(","); |
| } |
| result.append(elementType.format(elt)); |
| } |
| result.append("}"); |
| return result.toString(); |
| } |
| |
| @Override |
| public <R, T> R accept(AFTVisitor<R, T> v, T arg) { |
| return v.visitArrayAFT(this, arg); |
| } |
| } |