summaryrefslogtreecommitdiff
path: root/mesonbuild/mformat.py
diff options
context:
space:
mode:
authorCharles Brunet <charles.brunet@optelgroup.com>2025-09-23 11:20:49 -0400
committerDylan Baker <dylan@pnwbakers.com>2025-09-24 08:13:04 -0700
commit97e9e2fb66895d2fc1b4a714a428468aeebf9648 (patch)
tree6189ef4480fe5703e5fabc6445e937f9031c141f /mesonbuild/mformat.py
parentb91fede6d263286fa1e20d424f92d1e10668a8ed (diff)
downloadmeson-97e9e2fb66895d2fc1b4a714a428468aeebf9648.tar.gz
format: Fix indentation with parentheses
- Split long expressions in () according to max line length - Partly revert d028502 . Fixes #14935. - Fixes #15032.
Diffstat (limited to 'mesonbuild/mformat.py')
-rw-r--r--mesonbuild/mformat.py79
1 files changed, 68 insertions, 11 deletions
diff --git a/mesonbuild/mformat.py b/mesonbuild/mformat.py
index 6b0429b2f..1bf7effd9 100644
--- a/mesonbuild/mformat.py
+++ b/mesonbuild/mformat.py
@@ -255,6 +255,19 @@ class MultilineArgumentDetector(FullAstVisitor):
super().visit_ArgumentNode(node)
+class MultilineParenthesesDetector(FullAstVisitor):
+
+ def __init__(self) -> None:
+ self.last_whitespaces: T.Optional[mparser.WhitespaceNode] = None
+
+ def enter_node(self, node: mparser.BaseNode) -> None:
+ self.last_whitespaces = None
+
+ def exit_node(self, node: mparser.BaseNode) -> None:
+ if node.whitespaces and node.whitespaces.value:
+ self.last_whitespaces = node.whitespaces
+
+
class TrimWhitespaces(FullAstVisitor):
def __init__(self, config: FormatterConfig):
@@ -288,6 +301,8 @@ class TrimWhitespaces(FullAstVisitor):
def add_space_after(self, node: mparser.BaseNode) -> None:
if not node.whitespaces.value:
node.whitespaces.value = ' '
+ elif '#' not in node.whitespaces.value:
+ node.whitespaces.value = ' '
def add_nl_after(self, node: mparser.BaseNode, force: bool = False) -> None:
if not node.whitespaces.value:
@@ -540,18 +555,28 @@ class TrimWhitespaces(FullAstVisitor):
def visit_ParenthesizedNode(self, node: mparser.ParenthesizedNode) -> None:
self.enter_node(node)
- is_multiline = node.lpar.lineno != node.rpar.lineno
- if is_multiline:
+ if node.lpar.whitespaces and '#' in node.lpar.whitespaces.value:
+ node.is_multiline = True
+
+ elif not node.is_multiline:
+ ml_detector = MultilineParenthesesDetector()
+ node.inner.accept(ml_detector)
+ if ml_detector.last_whitespaces and '\n' in ml_detector.last_whitespaces.value:
+ # We keep it multiline if last parenthesis is on a separate line
+ node.is_multiline = True
+
+ if node.is_multiline:
self.indent_comments += self.config.indent_by
node.lpar.accept(self)
node.inner.accept(self)
- if is_multiline:
+ if node.is_multiline:
node.inner.whitespaces.value = self.dedent(node.inner.whitespaces.value)
self.indent_comments = self.dedent(self.indent_comments)
- if node.lpar.whitespaces and '\n' in node.lpar.whitespaces.value:
- self.add_nl_after(node.inner)
+ self.add_nl_after(node.inner)
+ else:
+ node.inner.whitespaces = None
node.rpar.accept(self)
self.move_whitespaces(node.rpar, node)
@@ -564,6 +589,7 @@ class ArgumentFormatter(FullAstVisitor):
self.level = 0
self.indent_after = False
self.is_function_arguments = False
+ self.par_level = 0
def add_space_after(self, node: mparser.BaseNode) -> None:
if not node.whitespaces.value:
@@ -573,7 +599,7 @@ class ArgumentFormatter(FullAstVisitor):
if not node.whitespaces.value or node.whitespaces.value == ' ':
node.whitespaces.value = '\n'
indent_by = (node.condition_level + indent) * self.config.indent_by
- if indent_by:
+ if indent_by and node.whitespaces.value.endswith('\n'):
node.whitespaces.value += indent_by
def visit_ArrayNode(self, node: mparser.ArrayNode) -> None:
@@ -682,11 +708,11 @@ class ArgumentFormatter(FullAstVisitor):
# keep '--arg', 'value' on same line
self.add_space_after(node.commas[arg_index])
elif arg_index < len(node.commas):
- self.add_nl_after(node.commas[arg_index], self.level)
+ self.add_nl_after(node.commas[arg_index], self.level + self.par_level)
arg_index += 1
for comma in node.commas[arg_index:-1]:
- self.add_nl_after(comma, self.level)
+ self.add_nl_after(comma, self.level + self.par_level)
if node.arguments or node.kwargs:
self.add_nl_after(node, self.level - 1)
@@ -701,17 +727,38 @@ class ArgumentFormatter(FullAstVisitor):
def visit_ParenthesizedNode(self, node: mparser.ParenthesizedNode) -> None:
self.enter_node(node)
- is_multiline = '\n' in node.lpar.whitespaces.value
- if is_multiline:
+ if node.is_multiline:
+ self.par_level += 1
current_indent_after = self.indent_after
self.indent_after = True
node.lpar.accept(self)
+ if node.is_multiline:
+ self.add_nl_after(node.lpar, indent=self.level + self.par_level)
node.inner.accept(self)
- if is_multiline:
+ if node.is_multiline:
+ self.par_level -= 1
self.indent_after = current_indent_after
node.rpar.accept(self)
self.exit_node(node)
+ def visit_OrNode(self, node: mparser.OrNode) -> None:
+ self.enter_node(node)
+ node.left.accept(self)
+ if self.par_level:
+ self.add_nl_after(node.left, indent=self.level + self.par_level)
+ node.operator.accept(self)
+ node.right.accept(self)
+ self.exit_node(node)
+
+ def visit_AndNode(self, node: mparser.AndNode) -> None:
+ self.enter_node(node)
+ node.left.accept(self)
+ if self.par_level:
+ self.add_nl_after(node.left, indent=self.level + self.par_level)
+ node.operator.accept(self)
+ node.right.accept(self)
+ self.exit_node(node)
+
class ComputeLineLengths(FullAstVisitor):
@@ -811,6 +858,16 @@ class ComputeLineLengths(FullAstVisitor):
self.split_if_needed(node.args) # split if closing bracket is too far
self.exit_node(node)
+ def visit_ParenthesizedNode(self, node: mparser.ParenthesizedNode) -> None:
+ self.enter_node(node)
+ node.lpar.accept(self)
+ node.inner.accept(self)
+ node.rpar.accept(self)
+ if not node.is_multiline and self.length > self.config.max_line_length:
+ node.is_multiline = True
+ self.need_regenerate = True
+ self.exit_node(node)
+
class SubdirFetcher(FullAstVisitor):