package edu.ucsd.arcum.interpreter.ast.expressions;
import java.util.List;
import java.util.Set;
import com.google.common.collect.Sets;
import edu.ucsd.arcum.exceptions.SourceLocation;
import edu.ucsd.arcum.interpreter.ast.TraitSignature;
import edu.ucsd.arcum.interpreter.query.EntityDataBase;
import edu.ucsd.arcum.interpreter.query.IEntityLookup;
import edu.ucsd.arcum.interpreter.query.OptionMatchTable;
import edu.ucsd.arcum.interpreter.satisfier.Satisfier;
public abstract class ConstraintExpression
{
private SourceLocation position;
protected ConstraintExpression(SourceLocation position) {
this.position = position;
}
public abstract Set<String> getArcumVariableReferences();
public abstract String toString();
public final void checkUserDefinedPredicates(List<TraitSignature> tupleSets,
Set<String> varsInScope)
{
doCheckUserDefinedPredicates(tupleSets, varsInScope);
}
protected abstract void doCheckUserDefinedPredicates(List<TraitSignature> tupleSets,
Set<String> varsInScope);
// TODO: Complete this implementation
public void visitSubExpressions(ISubExpressionVisitor visitor) {}
public abstract Set<String> findAllTraitDependencies();
public abstract Set<String> findNonMonotonicDependencies();
public SourceLocation getPosition() {
return position;
}
protected void extendPosition(SourceLocation end) {
this.position = position.extendedTo(end);
}
public final boolean evaluate(IEntityLookup lookup, EntityDataBase edb,
OptionMatchTable symTab)
{
Satisfier sat = new Satisfier(this);
boolean result = sat.evaluate(lookup, edb, symTab);
return result;
}
protected Set<String> flattenFindAllTraitDependencies(
List<? extends ConstraintExpression>... listsOfExprs)
{
Set<String> result = Sets.newHashSet();
for (List<? extends ConstraintExpression> listOfExprs : listsOfExprs) {
for (ConstraintExpression expr : listOfExprs) {
result.addAll(expr.findAllTraitDependencies());
}
}
return result;
}
protected Set<String> flattenFindNonMonotonicDependencies(
List<? extends ConstraintExpression>... listsOfExprs)
{
Set<String> result = Sets.newHashSet();
for (List<? extends ConstraintExpression> listOfExprs : listsOfExprs) {
for (ConstraintExpression expr : listOfExprs) {
result.addAll(expr.findNonMonotonicDependencies());
}
}
return result;
}
}