aboutsummaryrefslogtreecommitdiff
path: root/ql/ast/checkers/dependency_checker.py
diff options
context:
space:
mode:
authorBicker <bickerkards@tuta.io>2019-05-22 17:45:37 +0200
committerBicker <bickerkards@tuta.io>2019-05-22 17:45:37 +0200
commit25314fd2aed81aa5281bc3d93dbcc7919368ebe1 (patch)
tree1995521ee652e419926de5fced0f2e3b655e70fb /ql/ast/checkers/dependency_checker.py
Initial commitHEADmaster
Diffstat (limited to 'ql/ast/checkers/dependency_checker.py')
-rw-r--r--ql/ast/checkers/dependency_checker.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/ql/ast/checkers/dependency_checker.py b/ql/ast/checkers/dependency_checker.py
new file mode 100644
index 0000000..473ef6b
--- /dev/null
+++ b/ql/ast/checkers/dependency_checker.py
@@ -0,0 +1,44 @@
+class DependencyChecker:
+ def __init__(self, combinations):
+ self.__errors = []
+ self.__check_dependencies(combinations)
+
+ @property
+ def errors(self):
+ return self.__errors
+
+ def __check_dependencies(self, combinations):
+ for (identifier, identifier_children, identifier_metadata) in combinations:
+ children = self.__find_children(identifier, combinations)
+
+ if identifier in children:
+ self.__errors.append('Cyclic dependency detected in question identifiers on line(s) {}'
+ .format(str(self.__find_lines(children, combinations))[1:-1]))
+
+ def __find_children(self, identifier, combinations):
+ reference, reference_children, _ = combinations[0]
+
+ if len(combinations) == 1 and identifier == reference:
+ return reference_children
+ elif len(combinations) == 1:
+ return []
+ elif identifier == reference:
+ all_children = []
+
+ for new_identifier in reference_children:
+ all_children += self.__find_children(new_identifier, combinations[1:])
+
+ return all_children + reference_children
+
+ return self.__find_children(identifier, combinations[1:])
+
+ @staticmethod
+ def __find_lines(children, combinations):
+ lines = []
+
+ for identifier, _, metadata in combinations:
+ for child in children:
+ if identifier == child:
+ lines.append(metadata.line)
+
+ return lines