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