semantic+nodes: record variable definitions

This commit is contained in:
Antoine Viallon 2023-05-24 00:22:22 +02:00
parent 88526aa5e6
commit 8c26293416
Signed by: aviallon
GPG key ID: D126B13AB555E16F
2 changed files with 16 additions and 7 deletions

View file

@ -416,7 +416,7 @@ class Definition(Assignment):
def __init__(self, identifier: Identifier, type_identifier: Identifier, value: Value | None,
*pseudo_nodes: PseudoNode):
super().__init__(identifier, value)
super(Definition, self).__init__(identifier, value)
self.type_identifier = type_identifier
self.pseudo_nodes = list(pseudo_nodes)
@ -440,7 +440,8 @@ class Definition(Assignment):
def semantic_analysis(self, context: semantic.Context):
super(Assignment, self).semantic_analysis(context)
name = self.identifier.value
variable = context.define_variable(name, type_identifier=self.type_identifier, value=self.value)
variable = context.define_variable(name, definition=self, type_identifier=self.type_identifier,
value=self.value)
self.variable = variable
logger.debug(f"Added variable {variable} to context {context.fully_qualified_name()}")

View file

@ -12,13 +12,17 @@ logger = Logger(__name__)
class SymbolABC(abc.ABC):
def __init__(self, context: Context, name: str, value: nodes.Value | None | Literal["builtin"] = None):
def __init__(self, context: Context, name: str,
definition: nodes.Node | None = None,
value: nodes.Node | None | Literal["builtin"] = None):
self.context = context
self.name = name
self.writes: list[nodes.Node] = []
if isinstance(value, nodes.Node):
self.writes += [value]
self.definition = definition
self.reads: list[nodes.Node] = []
self._repr_guard: bool = False
@ -39,8 +43,10 @@ class SymbolABC(abc.ABC):
class Type(SymbolABC):
def __init__(self, context: Context, name: str, value: nodes.Value | None | Literal["builtin"] = None):
super().__init__(context, name, value=value)
def __init__(self, context: Context, name: str,
definition: nodes.Node | None = None,
value: nodes.Value | None | Literal["builtin"] = None):
super().__init__(context, name, definition=definition, value=value)
class Function(Type):
@ -50,9 +56,10 @@ class Function(Type):
class Variable(SymbolABC):
@typecheck
def __init__(self, context: Context, name: str,
definition: nodes.Definition | None = None,
value: nodes.Value | None = None,
typedef: Type | None = None):
super().__init__(context, name, value=value)
super().__init__(context, name, definition=definition, value=value)
self.type = typedef if typedef is not None else context.get_type("__unknown")
def __str__(self):
@ -100,6 +107,7 @@ class Context:
return self._get_symbol("variables", name, reader)
def define_variable(self, name: str,
definition: nodes.Definition,
type_identifier: nodes.Identifier, value: nodes.Value) -> Variable:
if name in self.variables:
raise SemanticAnalysisError(value.location())
@ -109,7 +117,7 @@ class Context:
raise SemanticAnalysisError(location=type_identifier.location(),
message=f"Unknown type '{type_identifier.value}'")
variable = Variable(self, name, value=value, typedef=typedef)
variable = Variable(self, name, definition=definition, value=value, typedef=typedef)
self.variables[name] = variable