aboutsummaryrefslogtreecommitdiff
path: root/ql/ast/visitors/model_generator.py
blob: f2cf5d828e4ecb4a08e0346b68b083d340e3ef6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from multimethods import multimethod

from gui.model.form import FormModel
from gui.model.question import QuestionModel
from ql.ast.nodes.expressions.binary_operators.and_operator import AndOperatorNode
from ql.ast.nodes.statements.form_statement import FormNode
from ql.ast.nodes.statements.if_statement import IfNode
from ql.ast.nodes.statements.question_statement import QuestionNode
from ql.types.boolean import QLBoolean
from ql.types.undefined import QLUndefined


class ModelGenerator:
    def __init__(self):
        self.form = None
        self.condition = QLBoolean.get_literal_node(True)

    @multimethod(FormNode)
    def visit(self, node):
        self.form = FormModel(node.identifier)

        for child in node.block:
            child.accept(self)

    @multimethod(IfNode)
    def visit(self, node):
        previous_condition = self.condition
        self.condition = AndOperatorNode(None, QLBoolean, self.condition, node.condition, QLUndefined())

        for child in node.block:
            child.accept(self)

        self.condition = previous_condition

    @multimethod(QuestionNode)
    def visit(self, node):
        question_model = QuestionModel(node.label, node.identifier, node.answer_type,
                                       node.answer, node.computed, self.condition)
        self.form.block.append(question_model)