package edu.ucsd.arcum.interpreter.ast.expressions; import java.util.*; import edu.ucsd.arcum.exceptions.SourceLocation; import edu.ucsd.arcum.interpreter.ast.TraitSignature; import edu.ucsd.arcum.util.StringUtil; public abstract class VariadicOperator extends ConstraintExpression implements Iterable<ConstraintExpression> { protected List<ConstraintExpression> clauses; protected VariadicOperator(SourceLocation location) { super(location); this.clauses = new ArrayList<ConstraintExpression>(); } public void addClause(ConstraintExpression clause) { clauses.add(clause); extendPosition(clause.getPosition()); } public Iterator<ConstraintExpression> iterator() { return clauses.iterator(); } public Collection<ConstraintExpression> getClauses() { return clauses; } public int size() { return clauses.size(); } public abstract String getOperatorLexeme(); @Override public Set<String> getArcumVariableReferences() { Set<String> result = new HashSet<String>(); for (ConstraintExpression clause : clauses) { result.addAll(clause.getArcumVariableReferences()); } return result; } @Override protected void doCheckUserDefinedPredicates(List<TraitSignature> tupleSets, Set<String> varsInScope) { for (ConstraintExpression clause : clauses) { clause.doCheckUserDefinedPredicates(tupleSets, varsInScope); } } @Override public String toString() { StringBuilder buff = new StringBuilder(); buff.append("(("); StringUtil.separate(buff, clauses, ") " + getOperatorLexeme() + " ("); buff.append("))"); return buff.toString(); } }