Skip to content
This repository was archived by the owner on Jan 13, 2026. It is now read-only.

Commit de999a5

Browse files
committed
Add delegate prefix to ExpressionStatement
1 parent 26da08f commit de999a5

File tree

4 files changed

+43
-5
lines changed

4 files changed

+43
-5
lines changed

rewrite/rewrite/python/format/blank_lines.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import annotations
22

3-
from typing import Optional, TypeVar
3+
from typing import Optional, TypeVar, cast
44

55
from rewrite import Tree, P, Cursor
66
from rewrite.java import J, Space, Statement
@@ -22,8 +22,15 @@ def visit_compilation_unit(self, compilation_unit: CompilationUnit, p: P) -> J:
2222
return super().visit_compilation_unit(compilation_unit, p)
2323

2424
def visit_statement(self, statement: Statement, p: P) -> J:
25-
statement = statement.with_prefix(Space.EMPTY)
26-
return super().visit_statement(statement, p)
25+
statement = super().visit_statement(statement, p)
26+
27+
parent_cursor = self.cursor.parent_tree_cursor()
28+
top_level = isinstance(parent_cursor.value, CompilationUnit)
29+
if top_level and statement != cast(CompilationUnit, parent_cursor.value).statements[0]:
30+
statement = statement.with_prefix(statement.prefix.with_whitespace('\n\n'))
31+
elif top_level:
32+
statement = statement.with_prefix(statement.prefix.with_whitespace(''))
33+
return statement
2734

2835
def post_visit(self, tree: T, p: P) -> Optional[T]:
2936
if self._stop_after and tree == self._stop_after:

rewrite/rewrite/python/tree.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,13 @@ def id(self) -> UUID:
719719
def with_id(self, id: UUID) -> ExpressionStatement:
720720
return self if id is self._id else replace(self, _id=id)
721721

722+
@property
723+
def prefix(self) -> Space:
724+
return self._expression.prefix
725+
726+
def with_prefix(self, prefix: Space) -> ExpressionStatement:
727+
return self.with_expression(self._expression.with_prefix(prefix))
728+
722729
_expression: Expression
723730

724731
@property
@@ -790,7 +797,7 @@ def prefix(self) -> Space:
790797
return self._statement.prefix
791798

792799
def with_prefix(self, prefix: Space) -> StatementExpression:
793-
return self._statement.with_prefix(prefix)
800+
return self.with_statement(self._statement.with_prefix(prefix))
794801

795802
_statement: Statement
796803

rewrite/rewrite/python/visitor.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,14 @@ def visit_compilation_unit(self, compilation_unit: CompilationUnit, p: P) -> J:
9898
return compilation_unit
9999

100100
def visit_expression_statement(self, expression_statement: ExpressionStatement, p: P) -> J:
101+
temp_statement = cast(Statement, self.visit_statement(expression_statement, p))
102+
if not isinstance(temp_statement, ExpressionStatement):
103+
return temp_statement
104+
expression_statement = cast(ExpressionStatement, temp_statement)
105+
temp_expression = cast(Expression, self.visit_expression(expression_statement, p))
106+
if not isinstance(temp_expression, ExpressionStatement):
107+
return temp_expression
108+
expression_statement = cast(ExpressionStatement, temp_expression)
101109
expression_statement = expression_statement.with_expression(self.visit_and_cast(expression_statement.expression, Expression, p))
102110
return expression_statement
103111

@@ -112,6 +120,14 @@ def visit_expression_type_tree(self, expression_type_tree: ExpressionTypeTree, p
112120
return expression_type_tree
113121

114122
def visit_statement_expression(self, statement_expression: StatementExpression, p: P) -> J:
123+
temp_statement = cast(Statement, self.visit_statement(statement_expression, p))
124+
if not isinstance(temp_statement, StatementExpression):
125+
return temp_statement
126+
statement_expression = cast(StatementExpression, temp_statement)
127+
temp_expression = cast(Expression, self.visit_expression(statement_expression, p))
128+
if not isinstance(temp_expression, StatementExpression):
129+
return temp_expression
130+
statement_expression = cast(StatementExpression, temp_expression)
115131
statement_expression = statement_expression.with_statement(self.visit_and_cast(statement_expression.statement, Statement, p))
116132
return statement_expression
117133

rewrite/rewrite/visitor.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
from dataclasses import dataclass
4-
from typing import Protocol, TypeVar, Optional, Dict, List, Any, cast, Type, ClassVar, TYPE_CHECKING
4+
from typing import Protocol, TypeVar, Optional, Dict, List, Any, cast, Type, ClassVar
55

66
from .execution import RecipeRunException
77
from .markers import Marker, Markers
@@ -25,6 +25,14 @@ class Cursor:
2525
def get_message(self, key: str, default_value: O) -> O:
2626
return default_value if self.messages is None else cast(O, self.messages.get(key))
2727

28+
def parent_tree_cursor(self) -> Optional[Cursor]:
29+
c = self.parent
30+
while c is not None:
31+
if isinstance(c.value, Tree):
32+
return c
33+
c = c.parent
34+
return None
35+
2836
def first_enclosing_or_throw(self, type: Type[P]) -> P:
2937
result = self.first_enclosing(type)
3038
if result is None:

0 commit comments

Comments
 (0)