blob: 800aab15afd470f9225df6e5116c37a7c6d9f0ca [file] [log] [blame]
package org.checkerframework.framework.util.typeinference.constraint;
import java.util.Set;
import org.checkerframework.framework.type.AnnotatedTypeFactory;
import org.checkerframework.framework.type.AnnotatedTypeMirror;
/**
* A2FReducer takes an A2F constraint that is not irreducible (@see AFConstraint.isIrreducible) and
* reduces it by one step. The resulting constraint may still be reducible.
*
* <p>Generally reductions should map to corresponding rules in
* https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.12.2.7
*/
public class A2FReducer implements AFReducer {
protected final A2FReducingVisitor visitor;
public A2FReducer(final AnnotatedTypeFactory typeFactory) {
this.visitor = new A2FReducingVisitor(typeFactory);
}
@Override
public boolean reduce(AFConstraint constraint, Set<AFConstraint> newConstraints) {
if (constraint instanceof A2F) {
final A2F a2f = (A2F) constraint;
visitor.visit(a2f.argument, a2f.formalParameter, newConstraints);
return true;
} else {
return false;
}
}
/**
* Given an A2F constraint of the form: A2F( typeFromMethodArgument, typeFromFormalParameter )
*
* <p>A2FReducingVisitor visits the constraint as follows: visit ( typeFromMethodArgument,
* typeFromFormalParameter, newConstraints )
*
* <p>The visit method will determine if the given constraint should either:
*
* <ul>
* <li>be discarded -- in this case, the visitor just returns
* <li>reduced to a simpler constraint or set of constraints -- in this case, the new constraint
* or set of constraints is added to newConstraints
* </ul>
*/
private static class A2FReducingVisitor extends AFReducingVisitor {
public A2FReducingVisitor(AnnotatedTypeFactory typeFactory) {
super(A2F.class, typeFactory);
}
@Override
public AFConstraint makeConstraint(AnnotatedTypeMirror subtype, AnnotatedTypeMirror supertype) {
return new A2F(subtype, supertype);
}
@Override
public AFConstraint makeInverseConstraint(
AnnotatedTypeMirror subtype, AnnotatedTypeMirror supertype) {
return new F2A(subtype, supertype);
}
@Override
public AFConstraint makeEqualityConstraint(
AnnotatedTypeMirror subtype, AnnotatedTypeMirror supertype) {
return new FIsA(supertype, subtype);
}
}
}