Coverage for kye/parser/assign_scopes.py: 46%

35 statements  

« prev     ^ index     » next       coverage.py v7.3.2, created at 2023-11-21 15:11 -0700

1from __future__ import annotations 

2from kye.parser.kye_ast import * 

3 

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 = {} 

14 

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 

20 

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) 

27 

28 def __setitem__(self, key, value): 

29 self.definitions[key] = value 

30 

31 def __contains__(self, key): 

32 return key in self.definitions or (self.parent is not None and key in self.parent) 

33 

34 def __repr__(self): 

35 return self.path + '{' + ','.join(self.definitions.keys()) + '}' 

36 

37def assign_scopes(node: AST, scope): 

38 assert scope is not None 

39 # Add definition to parent's scope 

40 if isinstance(node, Definition): 

41 scope[node.name] = node 

42 # Create new child scope for model 

43 if isinstance(node, ModelDefinition): 

44 scope = Scope(name=node.name, parent=scope) 

45 for child in node.children: 

46 assign_scopes(child, scope) 

47 setattr(node, 'scope', scope)