semantic: refactor types and variable handling

This commit is contained in:
Antoine Viallon 2023-05-23 00:47:09 +02:00
parent 98f0465238
commit 159ee81375
Signed by: aviallon
GPG key ID: D126B13AB555E16F

View file

@ -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)})"