semantic+nodes: record variable definitions
This commit is contained in:
parent
88526aa5e6
commit
8c26293416
2 changed files with 16 additions and 7 deletions
|
|
@ -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()}")
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue