blob: b5ec21849992f772f9471c9e494eee13c010e6f8 [file] [log] [blame]
package org.checkerframework.framework.type.visitor;
import org.checkerframework.framework.type.AnnotatedTypeMirror;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedArrayType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedDeclaredType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedExecutableType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedIntersectionType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedNoType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedNullType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedPrimitiveType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedTypeVariable;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedUnionType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedWildcardType;
/**
* A simple visitor for {@link AnnotatedTypeMirror}s.
*
* @param <R> the return type of this visitor's methods. Use {@link Void} for visitors that do not
* need to return results.
* @param <P> the type of the additional parameter to this visitor's methods. Use {@link Void} for
* visitors that do not need an additional parameter.
*/
public abstract class SimpleAnnotatedTypeVisitor<R, P> implements AnnotatedTypeVisitor<R, P> {
/** The default value to return as a default action. */
protected final R DEFAULT_VALUE;
/**
* Creates an instance of {@link SimpleAnnotatedTypeVisitor} with default value being {@code
* null}.
*/
protected SimpleAnnotatedTypeVisitor() {
this(null);
}
/**
* Creates an instance of {@link SimpleAnnotatedTypeVisitor} with the default value being the
* passed defaultValue.
*
* @param defaultValue the default value this class should return
*/
protected SimpleAnnotatedTypeVisitor(R defaultValue) {
this.DEFAULT_VALUE = defaultValue;
}
/**
* Performs the default action for visiting trees, if subclasses do not override the visitFOO
* node.
*
* <p>This implementation merely returns the default value (as specified by the protected field
* {@code DEFAULT_VALUE}).
*/
protected R defaultAction(AnnotatedTypeMirror type, P p) {
return DEFAULT_VALUE;
}
@Override
public R visit(AnnotatedTypeMirror type) {
return visit(type, null);
}
@Override
public R visit(AnnotatedTypeMirror type, P p) {
return (type == null) ? null : type.accept(this, p);
}
@Override
public R visitDeclared(AnnotatedDeclaredType type, P p) {
return defaultAction(type, p);
}
@Override
public R visitIntersection(AnnotatedIntersectionType type, P p) {
return defaultAction(type, p);
}
@Override
public R visitUnion(AnnotatedUnionType type, P p) {
return defaultAction(type, p);
}
@Override
public R visitArray(AnnotatedArrayType type, P p) {
return defaultAction(type, p);
}
@Override
public R visitExecutable(AnnotatedExecutableType type, P p) {
return defaultAction(type, p);
}
@Override
public R visitTypeVariable(AnnotatedTypeVariable type, P p) {
return defaultAction(type, p);
}
@Override
public R visitWildcard(AnnotatedWildcardType type, P p) {
return defaultAction(type, p);
}
@Override
public R visitPrimitive(AnnotatedPrimitiveType type, P p) {
return defaultAction(type, p);
}
@Override
public R visitNull(AnnotatedNullType type, P p) {
return defaultAction(type, p);
}
@Override
public R visitNoType(AnnotatedNoType type, P p) {
return defaultAction(type, p);
}
}