package org.fugazi.ql.ast.form.form_data.visitor; import org.fugazi.ql.ast.IASTVisitor; import org.fugazi.ql.ast.expression.Expression; import org.fugazi.ql.ast.expression.comparison.*; import org.fugazi.ql.ast.expression.literal.BOOL; import org.fugazi.ql.ast.expression.literal.ID; import org.fugazi.ql.ast.expression.literal.INT; import org.fugazi.ql.ast.expression.literal.STRING; import org.fugazi.ql.ast.expression.logical.And; import org.fugazi.ql.ast.expression.logical.Or; import org.fugazi.ql.ast.expression.numerical.Add; import org.fugazi.ql.ast.expression.numerical.Div; import org.fugazi.ql.ast.expression.numerical.Mul; import org.fugazi.ql.ast.expression.numerical.Sub; import org.fugazi.ql.ast.expression.unary.Negative; import org.fugazi.ql.ast.expression.unary.Not; import org.fugazi.ql.ast.expression.unary.Positive; import org.fugazi.ql.ast.form.Form; import org.fugazi.ql.ast.form.form_data.QLFormDataStorage; import org.fugazi.ql.ast.statement.ComputedQuestion; import org.fugazi.ql.ast.statement.IfStatement; import org.fugazi.ql.ast.statement.Question; import org.fugazi.ql.ast.statement.Statement; import org.fugazi.ql.ast.type.*; import org.fugazi.ql.type_checker.issue.ASTIssueHandler; import org.fugazi.ql.type_checker.issue.ASTNodeIssue; import java.util.List; /* This class performs a full AST Tree traversal. Class can inherit and override methods where they need to perform additional actions. */ public abstract class FullQLFormVisitor implements IASTVisitor<Void> { protected final ASTIssueHandler astIssueHandler; protected final QLFormDataStorage formData; public FullQLFormVisitor(QLFormDataStorage _formData){ this.formData = _formData; this.astIssueHandler = new ASTIssueHandler(); } /** * ======================= * General visitors * ======================= */ @Override public Void visitForm(Form form) { List<Statement> statementList = form.getBody(); for (Statement statement : statementList) { statement.accept(this); } return null; } @Override public Void visitQuestion(Question question) { Type type = question.getType(); ID identifier = question.getIdentifier(); type.accept(this); identifier.accept(this); return null; } @Override public Void visitIfStatement(IfStatement ifStatement) { Expression expression = ifStatement.getCondition(); List<Statement> statementList = ifStatement.getBody(); expression.accept(this); for (Statement statement : statementList) { statement.accept(this); } return null; } @Override public Void visitComputedQuestion(ComputedQuestion assignQuest) { Expression computed = assignQuest.getComputedExpression(); computed.accept(this); return null; } /** * ======================= * Binary visitors * ======================= */ @Override public Void visitAnd(And and) { return null; } @Override public Void visitOr(Or or) { return null; } @Override public Void visitNot(Not not) { return null; } @Override public Void visitEQ(EQ eq) { return null; } @Override public Void visitGE(GE ge) { return null; } @Override public Void visitGreater(Greater greater) { return null; } @Override public Void visitLE(LE le) { return null; } @Override public Void visitLesser(Less less) { return null; } @Override public Void visitNotEq(NotEq notEq) { return null; } /** * ======================= * Numerical visitors * ======================= */ @Override public Void visitNegative(Negative negative) { return null; } @Override public Void visitPositive(Positive positive) { return null; } @Override public Void visitAdd(Add add) { return null; } @Override public Void visitSub(Sub sub) { return null; } @Override public Void visitMul(Mul mul) { return null; } @Override public Void visitDiv(Div div) { return null; } /** * ======================= * Literal visitors * ======================= */ @Override public Void visitID(ID idLiteral) { return null; } @Override public Void visitINT(INT intLiteral) { return null; } @Override public Void visitSTRING(STRING stringLiteral) { return null; } @Override public Void visitBOOL(BOOL boolLiteral) { return null; } /** * ======================= * Type visitors * ======================= */ @Override public Void visitBoolType(BoolType boolType) { return null; } @Override public Void visitIntType(IntType intType) { return null; } @Override public Void visitStringType(StringType stringType) { return null; } @Override public Void visitUndefinedType(UndefinedType undefinedType) { return null; } /** * ======================= * Error handling * ======================= */ public List<ASTNodeIssue> getErrors() { return this.astIssueHandler.getErrors(); } public List<ASTNodeIssue> getWarnings() { return this.astIssueHandler.getWarnings(); } public boolean hasErrors() { return this.astIssueHandler.hasErrors(); } public boolean hasWarnings() { return this.astIssueHandler.hasWarnings(); } public void clearErrorsAndWarnings() { this.astIssueHandler.clearErrorsAndWarnings(); } }