package org.uva.student.calinwouter.qlqls.ql.staticfieldscollector; import org.uva.student.calinwouter.qlqls.generated.analysis.AnalysisAdapter; import org.uva.student.calinwouter.qlqls.generated.node.*; import org.uva.student.calinwouter.qlqls.ql.interfaces.ITypeDescriptor; import org.uva.student.calinwouter.qlqls.ql.model.AbstractStaticFormField; import org.uva.student.calinwouter.qlqls.ql.model.StaticComputedValueField; import org.uva.student.calinwouter.qlqls.ql.model.StaticFields; import org.uva.student.calinwouter.qlqls.ql.model.StaticQuestionField; import static org.uva.student.calinwouter.qlqls.ql.helper.ASTHelper.*; public class PStatementStaticFieldsCollector extends AnalysisAdapter { private final StaticFields staticFields; private final PTypeCollector pTypeCollector; private void addStaticField(AbstractStaticFormField abstractStaticFormField) { staticFields.addStaticField(abstractStaticFormField); } @Override public void caseAQuestionStatement(final AQuestionStatement node) { final ITypeDescriptor typeOfValue = getType(node); final String label = getString(node); final String identifier = getIdentifier(node); addStaticField(new StaticQuestionField(label, identifier, typeOfValue)); } @Override public void caseAValueStatement(final AValueStatement node) { final ITypeDescriptor typeOfValue = getType(node); final String label = getString(node); final String identifier = getIdentifier(node); addStaticField(new StaticComputedValueField(label, identifier, typeOfValue)); } @Override public void caseAIfElseStatement(AIfElseStatement node) { collectStaticFieldsThenList(node); collectStaticFieldsElseList(node); } @Override public void caseAIfStatement(AIfStatement node) { collectStaticFieldsThenList(node); } private ITypeDescriptor getType(final AValueStatement node) { final PType nodeTypeObject = node.getType(); nodeTypeObject.apply(pTypeCollector); return pTypeCollector.popType(); } private ITypeDescriptor getType(final AQuestionStatement node) { final PType nodeTypeObject = node.getType(); nodeTypeObject.apply(pTypeCollector); return pTypeCollector.popType(); } private void collectStaticFieldsThenList(AIfStatement node) { for (PStatement pStatement : node.getThenStatementList()) { pStatement.apply(this); } } private void collectStaticFieldsThenList(AIfElseStatement node) { for (PStatement pStatement : node.getThenStatementList()) { pStatement.apply(this); } } private void collectStaticFieldsElseList(AIfElseStatement node) { for (PStatement pStatement : node.getElseStatementList()) { pStatement.apply(this); } } public PStatementStaticFieldsCollector(StaticFields staticFields) { this.staticFields = staticFields; this.pTypeCollector = new PTypeCollector(); } }