package nl.uva.bromance.QL.typechecking;
import nl.uva.bromance.QL.ast.QLNode;
import nl.uva.bromance.QL.ast.QLNodeVisitorInterface;
import nl.uva.bromance.QL.ast.nodes.Calculation;
import nl.uva.bromance.QL.ast.nodes.Form;
import nl.uva.bromance.QL.ast.nodes.Question;
import nl.uva.bromance.QL.ast.nodes.Questionnaire;
import nl.uva.bromance.QL.controlstructures.Else;
import nl.uva.bromance.QL.controlstructures.If;
import nl.uva.bromance.QL.controlstructures.IfSequence;
import nl.uva.bromance.QL.exceptions.TypeCheckingError;
import nl.uva.bromance.QL.expressions.unary.Variable;
import java.util.*;
public class TypeCheckerVisitor implements QLNodeVisitorInterface {
private List<TypeCheckingError> exceptions = new ArrayList<>();
private SymbolTable symbolTable = new SymbolTable();
private Set<String> duplicateQuestionlabels = new HashSet<>();
public List<TypeCheckingError> check(QLNode node)
{
symbolTable = new SymbolTableBuilderVisitor().build(node,exceptions);
exceptions.addAll(new CyclicDependencyVisitor(node).check());
node.accept(this);
return exceptions;
}
@Override
public void visit(QLNode qlNode)
{
}
@Override
public void visit(Form form)
{
}
@Override
public void visit(Question question)
{
question.checkForDuplicateLabels(duplicateQuestionlabels, exceptions);
}
@Override
public void visit(Questionnaire questionnaire)
{
}
@Override
public void visit(If _if)
{
_if.typeCheck(symbolTable, exceptions);
}
@Override
public void visit(Calculation calc)
{
}
@Override
public void visit(Variable var)
{
}
@Override
public void visit()
{
}
@Override
public void exit(If _f)
{
}
@Override
public void visit(Else _else) {
}
@Override
public void visit(IfSequence sequence) {
}
@Override
public void exit(IfSequence sequence) {
}
}