visit full ast for AstConditionLevel
Use the new `FullAstVisitor` for `AstConditionLevel`. This will allow
proper formatting of `if / else / endif` and `foreach / endforeach`
blocks.
diff --git a/mesonbuild/ast/postprocess.py b/mesonbuild/ast/postprocess.py
index e9f2513..7acfc03 100644
--- a/mesonbuild/ast/postprocess.py
+++ b/mesonbuild/ast/postprocess.py
@@ -5,7 +5,7 @@
# or an interpreter-based tool
from __future__ import annotations
-from .visitor import AstVisitor
+from .visitor import AstVisitor, FullAstVisitor
import typing as T
if T.TYPE_CHECKING:
@@ -78,32 +78,41 @@
node.ast_id = name + '#' + str(self.counter[name])
self.counter[name] += 1
-class AstConditionLevel(AstVisitor):
+class AstConditionLevel(FullAstVisitor):
def __init__(self) -> None:
self.condition_level = 0
- def visit_default_func(self, node: mparser.BaseNode) -> None:
+ def enter_node(self, node: mparser.BaseNode) -> None:
node.condition_level = self.condition_level
def visit_ForeachClauseNode(self, node: mparser.ForeachClauseNode) -> None:
- self.visit_default_func(node)
- self.condition_level += 1
+ self.enter_node(node)
+ node.foreach_.accept(self)
+ for varname in node.varnames:
+ varname.accept(self)
+ for comma in node.commas:
+ comma.accept(self)
+ node.colon.accept(self)
node.items.accept(self)
+ self.condition_level += 1
node.block.accept(self)
self.condition_level -= 1
-
- def visit_IfClauseNode(self, node: mparser.IfClauseNode) -> None:
- self.visit_default_func(node)
- for i in node.ifs:
- i.accept(self)
- if node.elseblock:
- self.condition_level += 1
- node.elseblock.accept(self)
- self.condition_level -= 1
+ node.endforeach.accept(self)
+ self.exit_node(node)
def visit_IfNode(self, node: mparser.IfNode) -> None:
- self.visit_default_func(node)
- self.condition_level += 1
+ self.enter_node(node)
+ node.if_.accept(self)
node.condition.accept(self)
+ self.condition_level += 1
node.block.accept(self)
self.condition_level -= 1
+ self.exit_node(node)
+
+ def visit_ElseNode(self, node: mparser.ElseNode) -> None:
+ self.enter_node(node)
+ node.else_.accept(self)
+ self.condition_level += 1
+ node.block.accept(self)
+ self.condition_level -= 1
+ self.exit_node(node)