aboutsummaryrefslogtreecommitdiff
path: root/ql/ast/checkers/reference_checker.py
diff options
context:
space:
mode:
Diffstat (limited to 'ql/ast/checkers/reference_checker.py')
-rw-r--r--ql/ast/checkers/reference_checker.py30
1 files changed, 30 insertions, 0 deletions
diff --git a/ql/ast/checkers/reference_checker.py b/ql/ast/checkers/reference_checker.py
new file mode 100644
index 0000000..71407c3
--- /dev/null
+++ b/ql/ast/checkers/reference_checker.py
@@ -0,0 +1,30 @@
+class ReferenceChecker:
+ def __init__(self, table):
+ self.__errors = []
+ self.__check_references(table, [], [])
+
+ @property
+ def errors(self):
+ return self.__errors
+
+ def __check_references(self, table, known_types, unknown_types):
+ (local_known_types, local_unknown_types) = self.__split_known_unknown_types(table)
+ known_types += local_known_types
+ unknown_types += local_unknown_types
+
+ self.__identifier_seen(known_types, unknown_types)
+
+ if table['children']:
+ for child_scope in table['children']:
+ self.__check_references(child_scope, known_types, unknown_types)
+
+ @staticmethod
+ def __split_known_unknown_types(table):
+ known_types = [row['name'] for row in table['content'] if row['type']]
+ unknown_types = [(row['name'], row['line']) for row in table['content'] if not (row['type'])]
+ return known_types, unknown_types
+
+ def __identifier_seen(self, known_types, unknown_types):
+ for (identifier, line) in unknown_types:
+ if not (identifier in known_types):
+ self.__errors.append('Identifier \"{}\" at line {} is unknown'.format(identifier, line))