Skip to content

Commit 79317ec

Browse files
committed
add further inline-lambda multiline formatting, #154
1 parent 8ae0a1e commit 79317ec

File tree

4 files changed

+173
-6
lines changed

4 files changed

+173
-6
lines changed

gdtoolkit/formatter/expression.py

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@ def _format_foldable_to_multiple_lines(
159159
"annotation_args": _format_args_to_multiple_lines,
160160
"inline_lambda": _format_inline_lambda_to_multiple_lines,
161161
"lambda_header": _format_lambda_header_to_multiple_lines,
162+
"inline_lambda_statements": _format_inline_lambda_statements_to_multiple_lines,
163+
"return_stmt": _format_return_stmt_to_multiple_lines,
162164
} # type: Dict[str, Callable]
163165
return handlers[expression.data](expression, expression_context, context)
164166

@@ -570,11 +572,29 @@ def _format_inline_lambda_to_multiple_lines(
570572
expression_context: ExpressionContext,
571573
context: Context,
572574
) -> FormattedLines:
575+
expression_context_for_header = ExpressionContext(
576+
expression_context.prefix_string, expression_context.prefix_line, "", -1
577+
)
573578
header_lines = _format_concrete_expression(
574-
inline_lambda.children[0], expression_context, context
579+
inline_lambda.children[0], expression_context_for_header, context
580+
)
581+
_, last_header_line = header_lines[-1]
582+
expression_context_for_statements = ExpressionContext(
583+
f"{last_header_line.strip()} ",
584+
expression_context.prefix_line,
585+
expression_context.suffix_string,
586+
expression_context.suffix_line,
587+
)
588+
fake_meta = Meta()
589+
fake_meta.line = inline_lambda.children[1].line
590+
fake_meta.end_line = inline_lambda.children[-1].end_line
591+
fake_expression = Tree(
592+
"inline_lambda_statements", inline_lambda.children[1:], fake_meta
593+
)
594+
statement_lines = _format_concrete_expression(
595+
fake_expression, expression_context_for_statements, context
575596
)
576-
# TODO: statements
577-
return header_lines[:-1] + [(header_lines[-1][0], header_lines[-1][1] + " pass")]
597+
return header_lines[:-1] + statement_lines
578598

579599

580600
def _format_lambda_header_to_multiple_lines(
@@ -604,3 +624,53 @@ def _format_lambda_header_to_multiple_lines(
604624
return _format_concrete_expression(
605625
lambda_header.children[args_offset], new_expression_context, context
606626
)
627+
628+
629+
def _format_inline_lambda_statements_to_multiple_lines(
630+
inline_lambda_statements: Tree,
631+
expression_context: ExpressionContext,
632+
context: Context,
633+
) -> FormattedLines:
634+
lambda_statements = inline_lambda_statements.children
635+
if len(lambda_statements) == 1:
636+
return _format_concrete_expression(
637+
lambda_statements[0], expression_context, context
638+
)
639+
expression_context_for_first_statement = ExpressionContext(
640+
expression_context.prefix_string, expression_context.prefix_line, "", -1
641+
)
642+
first_statement_formatted_lines = _format_concrete_expression(
643+
lambda_statements[0], expression_context_for_first_statement, context
644+
)
645+
_, last_line = first_statement_formatted_lines[-1]
646+
remaining_statements_prefix = last_line.strip()
647+
remaining_statements_expression_context = ExpressionContext(
648+
f"{remaining_statements_prefix} ; ",
649+
expression_context.prefix_line,
650+
expression_context.suffix_string,
651+
expression_context.suffix_line,
652+
)
653+
fake_meta = Meta()
654+
fake_meta.line = lambda_statements[1].line
655+
fake_meta.end_line = lambda_statements[-1].end_line
656+
fake_expression = Tree("inline_lambda_statements", lambda_statements[1:], fake_meta)
657+
return first_statement_formatted_lines[:-1] + _format_concrete_expression(
658+
fake_expression, remaining_statements_expression_context, context
659+
)
660+
661+
662+
def _format_return_stmt_to_multiple_lines(
663+
return_stmt: Tree,
664+
expression_context: ExpressionContext,
665+
context: Context,
666+
) -> FormattedLines:
667+
new_expression_context = ExpressionContext(
668+
f"{expression_context.prefix_string}return ",
669+
expression_context.prefix_line,
670+
expression_context.suffix_string,
671+
expression_context.suffix_line,
672+
)
673+
formatted_lines, _ = format_expression(
674+
return_stmt.children[0], new_expression_context, context
675+
)
676+
return formatted_lines

gdtoolkit/formatter/expression_to_str.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ def expression_to_str(expression: Node) -> str:
115115
"annotation_args": _annotation_args_to_str,
116116
"inline_lambda": _inline_lambda_to_str,
117117
"lambda_header": _lambda_header_to_str,
118+
"inline_lambda_statements": lambda e: " ; ".join(
119+
expression_to_str(statement) for statement in e.children
120+
),
118121
"pass_stmt": lambda _: "pass",
119122
"return_stmt": lambda e: "return {}".format(
120123
standalone_expression_to_str(e.children[0])
@@ -222,10 +225,10 @@ def _annotation_args_to_str(annotation: Tree) -> str:
222225
return "({}{})".format(", ".join(elements), trailing_comma)
223226

224227

225-
def _inline_lambda_to_str(a_lambda: Tree) -> str:
228+
def _inline_lambda_to_str(inline_lambda: Tree) -> str:
229+
fake_expression = Tree("inline_lambda_statements", inline_lambda.children[1:])
226230
return "{} {}".format(
227-
expression_to_str(a_lambda.children[0]),
228-
" ; ".join(expression_to_str(statement) for statement in a_lambda.children[1:]),
231+
expression_to_str(inline_lambda.children[0]), expression_to_str(fake_expression)
229232
)
230233

231234

tests/formatter/input-output-pairs/long-inline-lambdas.in.gd

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,6 @@ func foo():
33
var x2 = func(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23) -> int: pass
44
var x3 = func bar(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23): pass
55
var x4 = func baz(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23) -> int: pass
6+
7+
var x5 = func baz(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23) -> int: pass;pass;return 123
8+
var x6 = func baz(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23) -> int: pass;pass;return [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];pass

tests/formatter/input-output-pairs/long-inline-lambdas.out.gd

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,94 @@ func foo():
9999
p22,
100100
p23
101101
) -> int: pass
102+
103+
var x5 = func baz(
104+
p1,
105+
p2,
106+
p3,
107+
p4,
108+
p5,
109+
p6,
110+
p7,
111+
p8,
112+
p9,
113+
p10,
114+
p11,
115+
p12,
116+
p13,
117+
p14,
118+
p15,
119+
p16,
120+
p17,
121+
p18,
122+
p19,
123+
p20,
124+
p21,
125+
p22,
126+
p23
127+
) -> int: pass ; pass ; return 123
128+
var x6 = func baz(
129+
p1,
130+
p2,
131+
p3,
132+
p4,
133+
p5,
134+
p6,
135+
p7,
136+
p8,
137+
p9,
138+
p10,
139+
p11,
140+
p12,
141+
p13,
142+
p14,
143+
p15,
144+
p16,
145+
p17,
146+
p18,
147+
p19,
148+
p20,
149+
p21,
150+
p22,
151+
p23
152+
) -> int: pass ; pass ; return [
153+
0,
154+
0,
155+
0,
156+
0,
157+
0,
158+
0,
159+
0,
160+
0,
161+
0,
162+
0,
163+
0,
164+
0,
165+
0,
166+
0,
167+
0,
168+
0,
169+
0,
170+
0,
171+
0,
172+
0,
173+
0,
174+
0,
175+
0,
176+
0,
177+
0,
178+
0,
179+
0,
180+
0,
181+
0,
182+
0,
183+
0,
184+
0,
185+
0,
186+
0,
187+
0,
188+
0,
189+
0,
190+
0,
191+
0
192+
] ; pass

0 commit comments

Comments
 (0)