diff options
| author | Bicker <bickerkards@tuta.io> | 2019-05-22 17:45:37 +0200 |
|---|---|---|
| committer | Bicker <bickerkards@tuta.io> | 2019-05-22 17:45:37 +0200 |
| commit | 25314fd2aed81aa5281bc3d93dbcc7919368ebe1 (patch) | |
| tree | 1995521ee652e419926de5fced0f2e3b655e70fb /ql/ast/visitors/dependency_visitor.py | |
Diffstat (limited to 'ql/ast/visitors/dependency_visitor.py')
| -rw-r--r-- | ql/ast/visitors/dependency_visitor.py | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/ql/ast/visitors/dependency_visitor.py b/ql/ast/visitors/dependency_visitor.py new file mode 100644 index 0000000..8bb81eb --- /dev/null +++ b/ql/ast/visitors/dependency_visitor.py @@ -0,0 +1,54 @@ +from multimethods import multimethod + +from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode +from ql.ast.nodes.expressions.literals.literal import LiteralNode +from ql.ast.nodes.expressions.unary_operators.unary_operator import UnaryOperatorNode +from ql.ast.nodes.expressions.variable import VariableNode +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 + + +class DependencyVisitor: + def __init__(self): + self.__all_dependencies = [] + self.__current_dependencies = [] + + @property + def identifier_dependencies(self): + return self.__all_dependencies + + @multimethod(FormNode) + def visit(self, node): + for child in node.block: + child.accept(self) + + @multimethod(IfNode) + def visit(self, node): + node.condition.accept(self) + for child in node.block: + child.accept(self) + + @multimethod(QuestionNode) + def visit(self, node): + if node.computed: + self.__current_dependencies = [] + node.answer.accept(self) + self.__all_dependencies.append((node.identifier, self.__current_dependencies, node.metadata)) + + @multimethod(BinaryOperatorNode) + def visit(self, node): + node.left_expression.accept(self) + node.right_expression.accept(self) + + @multimethod(UnaryOperatorNode) + def visit(self, node): + node.expression.accept(self) + + @multimethod(VariableNode) + def visit(self, node): + self.__current_dependencies.append(node.identifier) + + @multimethod(LiteralNode) + def visit(self, node): + pass |