package com.github.javaparser.symbolsolver.resolution.typeinference; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; import java.util.LinkedList; import java.util.List; /** * @author Federico Tomassetti */ public class ConstraintFormulaSet { private List constraintFormulas; public ConstraintFormulaSet withConstraint(ConstraintFormula constraintFormula) { ConstraintFormulaSet newInstance = new ConstraintFormulaSet(); newInstance.constraintFormulas.addAll(this.constraintFormulas); newInstance.constraintFormulas.add(constraintFormula); return newInstance; } private static final ConstraintFormulaSet EMPTY = new ConstraintFormulaSet(); public static ConstraintFormulaSet empty() { return EMPTY; } private ConstraintFormulaSet() { constraintFormulas = new LinkedList<>(); } /** * Takes a compatibility assertion about an expression or type, called a constraint formula, and reduces it to a * set of bounds on inference variables. Often, a constraint formula reduces to other constraint formulas, * which must be recursively reduced. A procedure is followed to identify these additional constraint formulas and, * ultimately, to express via a bound set the conditions under which the choices for inferred types would render * each constraint formula true. */ public BoundSet reduce(TypeSolver typeSolver) { List constraints = new LinkedList<>(constraintFormulas); BoundSet boundSet = BoundSet.empty(); while (constraints.size() > 0) { ConstraintFormula constraintFormula = constraints.remove(0); ConstraintFormula.ReductionResult reductionResult = constraintFormula.reduce(boundSet); constraints.addAll(reductionResult.getConstraintFormulas()); boundSet.incorporate(reductionResult.getBoundSet(), typeSolver); } return boundSet; } public boolean isEmpty() { return constraintFormulas.isEmpty(); } }