framework.src.org.checkerframework.qualframework.base.SetQualifierVisitor Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of checker Show documentation
Show all versions of checker Show documentation
The Checker Framework enhances Java’s type system to
make it more powerful and useful. This lets software developers
detect and prevent errors in their Java programs.
The Checker Framework includes compiler plug-ins ("checkers")
that find bugs or verify their absence. It also permits you to
write your own compiler plug-ins.
package org.checkerframework.qualframework.base;
import org.checkerframework.qualframework.base.QualifiedTypeMirror.QualifiedArrayType;
import org.checkerframework.qualframework.base.QualifiedTypeMirror.QualifiedDeclaredType;
import org.checkerframework.qualframework.base.QualifiedTypeMirror.QualifiedExecutableType;
import org.checkerframework.qualframework.base.QualifiedTypeMirror.QualifiedIntersectionType;
import org.checkerframework.qualframework.base.QualifiedTypeMirror.QualifiedNoType;
import org.checkerframework.qualframework.base.QualifiedTypeMirror.QualifiedNullType;
import org.checkerframework.qualframework.base.QualifiedTypeMirror.QualifiedParameterDeclaration;
import org.checkerframework.qualframework.base.QualifiedTypeMirror.QualifiedPrimitiveType;
import org.checkerframework.qualframework.base.QualifiedTypeMirror.QualifiedTypeDeclaration;
import org.checkerframework.qualframework.base.QualifiedTypeMirror.QualifiedTypeVariable;
import org.checkerframework.qualframework.base.QualifiedTypeMirror.QualifiedUnionType;
import org.checkerframework.qualframework.base.QualifiedTypeMirror.QualifiedWildcardType;
/** Visitor that replaces the qualifier of a {@link QualifiedTypeMirror}.
*/
public class SetQualifierVisitor implements QualifiedTypeVisitor, Q> {
// This class has no fields that refer to `Q`, so all instances have the
// same representation. That means we can reuse a single instance for all
// instantiations of `Q`.
@SuppressWarnings("rawtypes")
private static SetQualifierVisitor INSTANCE = new SetQualifierVisitor();
/**
* Get an instance of {@code SetQualifierVisitor}. This method may be more
* efficient than calling the constructor, since it may reuse instances
* sometimes.
*/
@SuppressWarnings("unchecked")
public static SetQualifierVisitor getInstance() {
return (SetQualifierVisitor)INSTANCE;
}
/**
* Helper method to apply a {@code SetQualifierVisitor} to a {@link
* QualifiedTypeMirror}.
*
* Calling {@code apply(...)} is like {@code getInstance().visit(...)}, but
* doesn't require an explicit type argument like {@code getInstance}
* does.
*/
public static QualifiedTypeMirror apply(QualifiedTypeMirror type, Q newQual) {
return SetQualifierVisitor.getInstance().visit(type, newQual);
}
@Override
public QualifiedTypeMirror visit(QualifiedTypeMirror type) {
return visit(type, null);
}
@Override
public QualifiedTypeMirror visit(QualifiedTypeMirror type, Q newQual) {
if (type == null) {
return null;
}
return type.accept(this, newQual);
}
@Override
public QualifiedTypeMirror visitArray(QualifiedArrayType type, Q newQual) {
return new QualifiedArrayType(type.getUnderlyingType(),
newQual,
type.getComponentType()
);
}
@Override
public QualifiedTypeMirror visitDeclared(QualifiedDeclaredType type, Q newQual) {
return new QualifiedDeclaredType(type.getUnderlyingType(),
newQual,
type.getTypeArguments()
);
}
@Override
public QualifiedTypeMirror visitExecutable(QualifiedExecutableType type, Q newQual) {
return new QualifiedExecutableType(type.getUnderlyingType(),
type.getParameterTypes(),
type.getReceiverType(),
type.getReturnType(),
type.getThrownTypes(),
type.getTypeParameters()
);
}
@Override
public QualifiedTypeMirror visitIntersection(QualifiedIntersectionType type, Q newQual) {
return new QualifiedIntersectionType(type.getUnderlyingType(),
newQual,
type.getBounds()
);
}
@Override
public QualifiedTypeMirror visitNoType(QualifiedNoType type, Q newQual) {
return new QualifiedNoType(type.getUnderlyingType(),
newQual
);
}
@Override
public QualifiedTypeMirror visitNull(QualifiedNullType type, Q newQual) {
return new QualifiedNullType(type.getUnderlyingType(),
newQual
);
}
@Override
public QualifiedTypeMirror visitPrimitive(QualifiedPrimitiveType type, Q newQual) {
return new QualifiedPrimitiveType(type.getUnderlyingType(),
newQual
);
}
@Override
public QualifiedTypeMirror visitTypeVariable(QualifiedTypeVariable type, Q newQual) {
return new QualifiedTypeVariable(type.getUnderlyingType(),
newQual
);
}
@Override
public QualifiedTypeMirror visitUnion(QualifiedUnionType type, Q newQual) {
return new QualifiedUnionType(type.getUnderlyingType(),
newQual,
type.getAlternatives()
);
}
@Override
public QualifiedTypeMirror visitWildcard(QualifiedWildcardType type, Q newQual) {
return new QualifiedWildcardType(type.getUnderlyingType(),
type.getExtendsBound(),
type.getSuperBound()
);
}
@Override
public QualifiedTypeMirror visitTypeDeclaration(QualifiedTypeDeclaration type, Q newQual) {
return new QualifiedTypeDeclaration(type.getUnderlyingType(),
newQual,
type.getTypeParameters()
);
}
@Override
public QualifiedTypeMirror visitParameterDeclaration(QualifiedParameterDeclaration type, Q newQual) {
return new QualifiedParameterDeclaration(type.getUnderlyingType());
}
}