aboutsummaryrefslogtreecommitdiffstats
path: root/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/resolution/typeinference/ConstraintFormulaSet.java
diff options
context:
space:
mode:
Diffstat (limited to 'javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/resolution/typeinference/ConstraintFormulaSet.java')
-rw-r--r--javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/resolution/typeinference/ConstraintFormulaSet.java53
1 files changed, 53 insertions, 0 deletions
diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/resolution/typeinference/ConstraintFormulaSet.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/resolution/typeinference/ConstraintFormulaSet.java
new file mode 100644
index 000000000..bca6e12e4
--- /dev/null
+++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/resolution/typeinference/ConstraintFormulaSet.java
@@ -0,0 +1,53 @@
+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<ConstraintFormula> 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<ConstraintFormula> 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();
+ }
+}