package edu.ucsd.arcum.interpreter.ast;
import static edu.ucsd.arcum.interpreter.ast.ASTUtil.PARAMETER_NAME;
import static edu.ucsd.arcum.interpreter.ast.ASTUtil.checkNames;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import edu.ucsd.arcum.interpreter.query.ArcumDeclarationTable;
public abstract class TopLevelConstruct
{
private String name;
private String importsString;
private List<RealizationStatement> realizationStatements;
// check for redefinition of names
abstract public void doTypeCheck(ArcumDeclarationTable table);
public static void checkFormals(List<FormalParameter> params) {
checkNames(params, PARAMETER_NAME);
}
protected TopLevelConstruct(String name, String importsString) {
this.name = name;
this.importsString = importsString;
this.realizationStatements = new ArrayList<RealizationStatement>();
}
public String getName() {
return name;
}
public String getImports() {
return importsString;
}
// singletons can be realized only with other singletons
protected void checkRealizationConsistency(OptionInterface optionInterface)
{
for (RealizationStatement stmt : getRealizationStatements()) {
stmt.typeCheckAndValidate(optionInterface);
}
}
protected void checkRequireClausePredicates(List<TraitSignature> tupleSets)
{
Set<String> varsInScope = TraitSignature.getGlobals(tupleSets);
for (TraitSignature tupleSet : tupleSets) {
// EXAMPLE: This is really the visitor pattern! And a bug that kept on
// happening again and again.
tupleSet.checkUserDefinedPredicates(tupleSets, varsInScope);
}
}
protected void checkExpressionPredicates(RealizationStatement stmt, List<TraitSignature> tupleSets)
{
stmt.checkUserDefinedPredicates(tupleSets);
}
// on interpretation these will all have to be type-checked and matched
public void addRealizationStatement(RealizationStatement statement) {
realizationStatements.add(statement);
}
public List<RealizationStatement> getRealizationStatements() {
return realizationStatements;
}
}