package ql.semantics;
import ql.ast.expression.*;
import ql.ast.form.Form;
import ql.ast.form.FormVisitor;
import ql.ast.statement.*;
/**
* Created by bore on 16/03/15.
*/
public class QuestionDependenciesBuilder extends DefaultExprVisitor<Void> implements FormVisitor<Void>, StatVisitor<Void>
{
private final QuestionDependencies dependencies;
private Question currentQuestion;
public static QuestionDependencies build(Form f)
{
QuestionDependenciesBuilder builder = new QuestionDependenciesBuilder();
f.accept(builder);
return builder.dependencies;
}
private QuestionDependenciesBuilder()
{
this.dependencies = new QuestionDependencies();
}
@Override
public Void visit(Form f)
{
for (Statement statement : f.getBody())
{
statement.accept(this);
}
return null;
}
@Override
public Void visit(IfCondition c)
{
for (Statement statement : c.getBody())
{
statement.accept(this);
}
return null;
}
@Override
public Void visit(Question q)
{
this.dependencies.addQuestion(q.getId());
return null;
}
@Override
public Void visit(CalculatedQuestion q)
{
this.dependencies.addQuestion(q.getId());
this.setScopeForExpr(q);
q.getCalculation().accept(this);
this.resetScopeForExpr();
return null;
}
@Override
public Void visitDefault(Expr e)
{
return null;
}
@Override
public Void visitBinary(BinaryExpr e)
{
e.getLeft().accept(this);
e.getRight().accept(this);
return null;
}
@Override
public Void visitUnary(UnaryExpr e)
{
e.getOperand().accept(this);
return null;
}
@Override
public Void visit(Ident n)
{
if (this.isScopeSet())
{
this.dependencies.addDependency(this.currentQuestion.getId(), n.getId());
}
return null;
}
private void setScopeForExpr(CalculatedQuestion q)
{
this.currentQuestion = q;
}
private void resetScopeForExpr()
{
this.currentQuestion = null;
}
private boolean isScopeSet()
{
return this.currentQuestion != null;
}
}