Coverage for kye/parser/assign_scopes.py: 46%
35 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-13 15:17 -0700
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-13 15:17 -0700
1from __future__ import annotations
2from kye.parser.kye_ast import *
4class Scope:
5 def __init__(self, name, parent: Scope):
6 if name is None or parent is None:
7 assert name is None and parent is None
8 else:
9 assert name is not None
10 assert parent is not None
11 self.name = name
12 self.parent = parent
13 self.definitions = {}
15 @property
16 def path(self):
17 if self.parent and self.parent.name:
18 return self.parent.path + '.' + self.name
19 return self.name
21 def __getitem__(self, key):
22 if key in self.definitions:
23 return self.definitions[key]
24 if self.parent is not None:
25 return self.parent[key]
26 raise KeyError(key)
28 def __setitem__(self, key, value):
29 self.definitions[key] = value
31 def __contains__(self, key):
32 return key in self.definitions or (self.parent is not None and key in self.parent)
34 def __repr__(self):
35 return self.path + '{' + ','.join(self.definitions.keys()) + '}'
37def assign_scopes(node: AST, scope):
38 assert scope is not None
39 # Add definition to parent's scope
40 if isinstance(node, (Model, Edge, TypeAlias)):
41 scope[node.name] = node
42 # Create new child scope for model
43 if isinstance(node, Model):
44 scope = Scope(name=node.name, parent=scope)
45 for child in node.children:
46 assign_scopes(child, scope)
47 setattr(node, 'scope', scope)