package org.checkerframework.checker.nullness;
import java.util.Set;
import org.checkerframework.framework.type.AnnotatedTypeMirror;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedNullType;
import org.checkerframework.framework.type.DefaultAnnotatedTypeFormatter;
import org.checkerframework.framework.util.AnnotationFormatter;
import org.checkerframework.framework.util.DefaultAnnotationFormatter;
/** A DefaultAnnotatedTypeFormatter that prints null literals without their annotations. */
public class NullnessAnnotatedTypeFormatter extends DefaultAnnotatedTypeFormatter {
public NullnessAnnotatedTypeFormatter(
boolean printVerboseGenerics, boolean printInvisibleQualifiers) {
super(
new NullnessFormattingVisitor(
new DefaultAnnotationFormatter(),
printVerboseGenerics,
printInvisibleQualifiers));
}
protected static class NullnessFormattingVisitor extends FormattingVisitor {
public NullnessFormattingVisitor(
AnnotationFormatter annoFormatter,
boolean printVerboseGenerics,
boolean defaultInvisiblesSetting) {
super(annoFormatter, printVerboseGenerics, defaultInvisiblesSetting);
}
@Override
public String visitNull(AnnotatedNullType type, Set<AnnotatedTypeMirror> visiting) {
// The null literal will be understood as nullable by readers, therefore omit the annotations
// Note: The visitTypeVariable will still print lower bounds with Null kind as "Void"
if (!currentPrintInvisibleSetting) {
return "null";
} // else
return super.visitNull(type, visiting);
}
}
}