summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Weißmann <volker.weissmann@gmx.de>2025-03-16 17:11:59 +0100
committerDylan Baker <dylan@pnwbakers.com>2025-05-29 09:20:27 -0700
commit398fa02343217980043311962ccc12111688eef7 (patch)
tree27e06bf1486faceb1fd2f8d20aed52164cb24da5
parente8f27f5912f1266adb0390fbf54aa3b14f9bf7da (diff)
downloadmeson-398fa02343217980043311962ccc12111688eef7.tar.gz
rewriter: Refactoring of assignment tracking
Replace `AstInterpreter.reverse_assignment` with `AstInterpreter.all_assignment_nodes`. This does not give us an immediate advantage but will be useful in future commits.
-rw-r--r--mesonbuild/ast/interpreter.py8
-rw-r--r--mesonbuild/rewriter.py10
2 files changed, 8 insertions, 10 deletions
diff --git a/mesonbuild/ast/interpreter.py b/mesonbuild/ast/interpreter.py
index 8dc5eb31f..30847b1a0 100644
--- a/mesonbuild/ast/interpreter.py
+++ b/mesonbuild/ast/interpreter.py
@@ -105,8 +105,8 @@ class AstInterpreter(InterpreterBase):
self.visitors = visitors if visitors is not None else []
self.nesting: T.List[int] = []
self.cur_assignments: T.DefaultDict[str, T.List[T.Tuple[T.List[int], T.Union[BaseNode, UnknownValue]]]] = defaultdict(list)
+ self.all_assignment_nodes: T.DefaultDict[str, T.List[AssignmentNode]] = defaultdict(list)
self.assign_vals: T.Dict[str, T.Any] = {}
- self.reverse_assignment: T.Dict[str, BaseNode] = {}
self.funcs.update({'project': self.func_do_nothing,
'test': self.func_do_nothing,
'benchmark': self.func_do_nothing,
@@ -392,8 +392,7 @@ class AstInterpreter(InterpreterBase):
def assignment(self, node: AssignmentNode) -> None:
assert isinstance(node, AssignmentNode)
self.cur_assignments[node.var_name.value].append((self.nesting.copy(), node.value))
- if node.value.ast_id:
- self.reverse_assignment[node.value.ast_id] = node
+ self.all_assignment_nodes[node.var_name.value].append(node)
self.assign_vals[node.var_name.value] = self.evaluate_statement(node.value) # Evaluate the value just in case
def evaluate_plusassign(self, node: PlusAssignmentNode) -> None:
@@ -406,9 +405,8 @@ class AstInterpreter(InterpreterBase):
else:
newval = mparser.ArithmeticNode(operation='add', left=lhs, operator=_symbol('+'), right=node.value)
self.cur_assignments[node.var_name.value].append((self.nesting.copy(), newval))
+ self.all_assignment_nodes[node.var_name.value].append(node)
- if node.value.ast_id:
- self.reverse_assignment[node.value.ast_id] = node
self.assign_vals[node.var_name.value] = self.evaluate_statement(node.value)
def resolve_node(self, node: BaseNode, include_unknown_args: bool = False, id_loop_detect: T.Optional[T.List[str]] = None) -> T.Optional[T.Any]:
diff --git a/mesonbuild/rewriter.py b/mesonbuild/rewriter.py
index 3360f6fc9..c8f6c864a 100644
--- a/mesonbuild/rewriter.py
+++ b/mesonbuild/rewriter.py
@@ -618,11 +618,11 @@ class Rewriter:
if num_changed > 0 and node not in self.modified_nodes:
self.modified_nodes += [node]
- def find_assignment_node(self, node: BaseNode) -> AssignmentNode:
- if node.ast_id and node.ast_id in self.interpreter.reverse_assignment:
- ret = self.interpreter.reverse_assignment[node.ast_id]
- assert isinstance(ret, AssignmentNode)
- return ret
+ def find_assignment_node(self, node: BaseNode) -> T.Optional[AssignmentNode]:
+ for k, v in self.interpreter.all_assignment_nodes.items():
+ for ass in v:
+ if ass.value == node:
+ return ass
return None
@RequiredKeys(rewriter_keys['target'])