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