semantic: refactor types and variable handling
This commit is contained in:
parent
98f0465238
commit
159ee81375
1 changed files with 29 additions and 6 deletions
|
|
@ -52,6 +52,7 @@ class Context:
|
|||
def __init__(self, name: str | None = None, parent: Context | None = None):
|
||||
self.parent = parent
|
||||
self.variables: dict[str, Variable] = {}
|
||||
self.types: dict[str, Type] = {}
|
||||
self.child_contexts: dict[str, Context] = {}
|
||||
self.name = str(Context._id_sequence)
|
||||
if name is not None:
|
||||
|
|
@ -63,18 +64,20 @@ class Context:
|
|||
return str(self.name)
|
||||
return f"{self.parent.fully_qualified_name()}::{self.name}"
|
||||
|
||||
def get_variable(self, name: str) -> Variable | None:
|
||||
if name in self.variables:
|
||||
return self.variables[name]
|
||||
@typecheck
|
||||
def _resolve_symbol(self, attribute_name: str, name: str) -> SymbolABC | None:
|
||||
attribute = getattr(self, attribute_name)
|
||||
if name in attribute:
|
||||
return attribute[name]
|
||||
elif self.parent is None:
|
||||
return None
|
||||
elif (var := self.parent.get_variable(name)) is not None:
|
||||
elif (var := self.parent._resolve_symbol(attribute_name, name)) is not None:
|
||||
return var
|
||||
|
||||
return None
|
||||
|
||||
def add_context(self, context: Context) -> None:
|
||||
self.child_contexts[context.name] = context
|
||||
def get_variable(self, name: str) -> Variable | None:
|
||||
return self._resolve_symbol("variables", name)
|
||||
|
||||
def set_variable(self, name: str, value: nodes.Value) -> Variable:
|
||||
variable: Variable
|
||||
|
|
@ -88,6 +91,26 @@ class Context:
|
|||
|
||||
return variable
|
||||
|
||||
@typecheck
|
||||
def set_type(self, name: str, value: nodes.Value) -> Type | None:
|
||||
typedef: Type
|
||||
if name in self.types:
|
||||
typedef = self.types[name]
|
||||
typedef.definitions += [value]
|
||||
else:
|
||||
typedef = Type(self, name, value)
|
||||
|
||||
self.types[name] = typedef
|
||||
|
||||
return typedef
|
||||
|
||||
@typecheck
|
||||
def get_type(self, name: str) -> Type | None:
|
||||
return self._resolve_symbol("types", name)
|
||||
|
||||
def add_context(self, context: Context) -> None:
|
||||
self.child_contexts[context.name] = context
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.__class__.__name__}(id={repr(self.name)})"
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue