package org.nlamah.QL.TypeChecker; import java.util.ArrayList; import java.util.List; import org.nlamah.QBase.Tools.ArrayTools; import org.nlamah.QL.Interfaces.QLNodeVisitor; import org.nlamah.QL.Model.Expression.Binary.AddExpression; import org.nlamah.QL.Model.Expression.Binary.AndExpression; import org.nlamah.QL.Model.Expression.Binary.DivideExpression; import org.nlamah.QL.Model.Expression.Binary.EqualExpression; import org.nlamah.QL.Model.Expression.Binary.GreaterThanEqualExpression; import org.nlamah.QL.Model.Expression.Binary.GreaterThanExpression; import org.nlamah.QL.Model.Expression.Binary.MultiplyExpression; import org.nlamah.QL.Model.Expression.Binary.OrExpression; import org.nlamah.QL.Model.Expression.Binary.SmallerThanEqualExpression; import org.nlamah.QL.Model.Expression.Binary.SmallerThanExpression; import org.nlamah.QL.Model.Expression.Binary.SubtractExpression; import org.nlamah.QL.Model.Expression.Binary.UnEqualExpression; import org.nlamah.QL.Model.Expression.Literal.BooleanLiteral; import org.nlamah.QL.Model.Expression.Literal.IdentifierLiteral; import org.nlamah.QL.Model.Expression.Literal.NumberLiteral; import org.nlamah.QL.Model.Expression.Literal.TextLiteral; import org.nlamah.QL.Model.Expression.Unary.MinusExpression; import org.nlamah.QL.Model.Expression.Unary.NotExpression; import org.nlamah.QL.Model.Expression.Unary.PlusExpression; import org.nlamah.QL.Model.Form.ComputedQuestion; import org.nlamah.QL.Model.Form.ConditionalBlock; import org.nlamah.QL.Model.Form.ElseIfThenBlock; import org.nlamah.QL.Model.Form.ElseThenBlock; import org.nlamah.QL.Model.Form.Form; import org.nlamah.QL.Model.Form.IfThenBlock; import org.nlamah.QL.Model.Form.InputQuestion; import org.nlamah.QL.Model.Form.Abstract.FormElement; import org.nlamah.QL.Model.Form.Abstract.QLNode; public class ReferencedQuestionsCollector implements QLNodeVisitor { private List<IdentifierLiteral> questions; public ReferencedQuestionsCollector(Form form) { questions = new ArrayList<IdentifierLiteral>(); form.accept(this); } public List<IdentifierLiteral> questions() { return this.questions; } @Override public QLNode visit(AddExpression addExpression) { addExpression.leftHandExpression().accept(this); addExpression.rightHandExpression().accept(this); return null; } @Override public QLNode visit(AndExpression andExpression) { andExpression.leftHandExpression().accept(this); andExpression.rightHandExpression().accept(this); return null; } @Override public QLNode visit(DivideExpression divideExpression) { divideExpression.leftHandExpression().accept(this); divideExpression.rightHandExpression().accept(this); return null; } @Override public QLNode visit(EqualExpression equalExpression) { equalExpression.leftHandExpression().accept(this); equalExpression.rightHandExpression().accept(this); return null; } @Override public QLNode visit(GreaterThanExpression greaterThanExpression) { greaterThanExpression.leftHandExpression().accept(this); greaterThanExpression.rightHandExpression().accept(this); return null; } @Override public QLNode visit(GreaterThanEqualExpression greaterThanEqualExpression) { greaterThanEqualExpression.leftHandExpression().accept(this); greaterThanEqualExpression.rightHandExpression().accept(this); return null; } @Override public QLNode visit(MultiplyExpression multiplyExpression) { multiplyExpression.leftHandExpression().accept(this); multiplyExpression.rightHandExpression().accept(this); return null; } @Override public QLNode visit(OrExpression orExpression) { orExpression.leftHandExpression().accept(this); orExpression.rightHandExpression().accept(this); return null; } @Override public QLNode visit(SmallerThanExpression smallerThanExpression) { smallerThanExpression.leftHandExpression().accept(this); smallerThanExpression.rightHandExpression().accept(this); return null; } @Override public QLNode visit(SmallerThanEqualExpression smallerThanEqualExpression) { smallerThanEqualExpression.leftHandExpression().accept(this); smallerThanEqualExpression.rightHandExpression().accept(this); return null; } @Override public QLNode visit(SubtractExpression subtractExpression) { subtractExpression.leftHandExpression().accept(this); subtractExpression.rightHandExpression().accept(this); return null; } @Override public QLNode visit(UnEqualExpression unEqualExpression) { unEqualExpression.leftHandExpression().accept(this); unEqualExpression.rightHandExpression().accept(this); return null; } @Override public QLNode visit(BooleanLiteral booleanLiteral) { return null; } @Override public QLNode visit(IdentifierLiteral identifierLiteral) { questions.add(identifierLiteral); return null; } @Override public QLNode visit(NumberLiteral numberLiteral) { return null; } @Override public QLNode visit(TextLiteral textLiteral) { return null; } @Override public QLNode visit(MinusExpression minusExpression) { minusExpression.expression().accept(this); return null; } @Override public QLNode visit(NotExpression notExpression) { notExpression.expression().accept(this); return null; } @Override public QLNode visit(PlusExpression plusExpression) { plusExpression.expression().accept(this); return null; } @Override public QLNode visit(ConditionalBlock conditionalBlock) { if (conditionalBlock.ifThenBlock() != null) { conditionalBlock.ifThenBlock().accept(this); } if (ArrayTools.arrayExistsAndHasElements(conditionalBlock.elseIfThenBlocks())) { for (ElseIfThenBlock elseIfThenBlock : conditionalBlock.elseIfThenBlocks()) { elseIfThenBlock.accept(this); } } if (conditionalBlock.elseThenBlock() != null) { conditionalBlock.elseThenBlock().accept(this); } return null; } @Override public QLNode visit(ElseIfThenBlock elseIfThenBlock) { elseIfThenBlock.expression().accept(this); for (FormElement childElement : elseIfThenBlock.childElements()) { childElement.accept(this); } return null; } @Override public QLNode visit(ElseThenBlock elseThenBlock) { for (FormElement childElement : elseThenBlock.childElements()) { childElement.accept(this); } return null; } @Override public QLNode visit(IfThenBlock ifThenBlock) { ifThenBlock.expression().accept(this); for (FormElement childElement : ifThenBlock.childElements()) { childElement.accept(this); } return null; } @Override public QLNode visit(Form form) { if (ArrayTools.arrayExistsAndHasElements(form.childElements())) { for (FormElement childElement : form.childElements()) { childElement.accept(this); } } return null; } @Override public QLNode visit(InputQuestion inputQuestion) { return null; } @Override public QLNode visit(ComputedQuestion computedQuestion) { computedQuestion.expression().accept(this); return null; } }