11from typing import Dict , Callable , List , Optional
2+ from importlib import import_module
23
34from lark import Tree , Token
45from lark .tree import Meta
@@ -149,6 +150,8 @@ def _format_foldable_to_multiple_lines(
149150 "dict" : _format_dict_to_multiple_lines ,
150151 "c_dict_element" : _format_kv_pair_to_multiple_lines ,
151152 "eq_dict_element" : _format_kv_pair_to_multiple_lines ,
153+ "lambda" : _format_lambda_to_multiple_lines ,
154+ "lambda_header" : _format_lambda_header_to_multiple_lines ,
152155 # fake expressions:
153156 "func_args" : _format_args_to_multiple_lines ,
154157 "func_arg_regular" : _format_func_arg_to_multiple_lines ,
@@ -165,33 +168,6 @@ def _format_foldable_to_multiple_lines(
165168 ),
166169 "annotation" : _format_annotation_to_multiple_lines ,
167170 "annotation_args" : _format_args_to_multiple_lines ,
168- "inline_lambda" : _format_inline_lambda_to_multiple_lines ,
169- "lambda_header" : _format_lambda_header_to_multiple_lines ,
170- "inline_lambda_statements" : _format_inline_lambda_statements_to_multiple_lines ,
171- "pass_stmt" : _format_concrete_expression_to_single_line ,
172- "return_stmt" : lambda e , ec , c : _append_to_expression_context_and_pass_standalone (
173- "return " , e .children [0 ], ec , c
174- ),
175- "expr_stmt" : lambda e , ec , c : _format_standalone_expression (
176- e .children [0 ].children [0 ], ec , c
177- ),
178- "func_var_stmt" : lambda e , ec , c : _format_standalone_expression (
179- e .children [0 ], ec , c
180- ),
181- "func_var_empty" : _format_concrete_expression_to_single_line ,
182- "func_var_assigned" : lambda e , ec , c : _append_to_expression_context_and_pass_standalone (
183- f"var { expression_to_str (e .children [0 ])} = " , e .children [1 ], ec , c
184- ),
185- "func_var_typed" : _format_concrete_expression_to_single_line ,
186- "func_var_typed_assgnd" : lambda e , ec , c : _append_to_expression_context_and_pass_standalone (
187- f"var { expression_to_str (e .children [0 ])} : { expression_to_str (e .children [1 ])} = " ,
188- e .children [2 ],
189- ec ,
190- c ,
191- ),
192- "func_var_inf" : lambda e , ec , c : _append_to_expression_context_and_pass_standalone (
193- f"var { expression_to_str (e .children [0 ])} := " , e .children [1 ], ec , c
194- ),
195171 "dot_chain" : _format_dot_chain_to_multiple_lines ,
196172 "actual_getattr_call" : _format_call_expression_to_multiple_lines ,
197173 "actual_subscr_expr" : _format_subscription_to_multiple_lines ,
@@ -645,100 +621,6 @@ def _format_annotation_to_multiple_lines(
645621 )
646622
647623
648- def _format_inline_lambda_to_multiple_lines (
649- inline_lambda : Tree ,
650- expression_context : ExpressionContext ,
651- context : Context ,
652- ) -> FormattedLines :
653- expression_context_for_header = ExpressionContext (
654- expression_context .prefix_string , expression_context .prefix_line , "" , - 1
655- )
656- header_lines = _format_concrete_expression (
657- inline_lambda .children [0 ], expression_context_for_header , context
658- )
659- last_header_line_number , last_header_line = header_lines [- 1 ]
660- assert last_header_line_number is not None
661- expression_context_for_statements = ExpressionContext (
662- f"{ last_header_line .strip ()} " ,
663- last_header_line_number , # type:ignore
664- expression_context .suffix_string ,
665- expression_context .suffix_line ,
666- )
667- fake_meta = Meta ()
668- fake_meta .line = get_line (inline_lambda .children [1 ])
669- fake_meta .end_line = get_end_line (inline_lambda .children [- 1 ])
670- fake_expression = Tree (
671- "inline_lambda_statements" , inline_lambda .children [1 :], fake_meta
672- )
673- statement_lines = _format_concrete_expression (
674- fake_expression , expression_context_for_statements , context
675- )
676- return header_lines [:- 1 ] + statement_lines
677-
678-
679- def _format_lambda_header_to_multiple_lines (
680- lambda_header : Tree ,
681- expression_context : ExpressionContext ,
682- context : Context ,
683- ) -> FormattedLines :
684- append_to_prefix = (
685- f"func { lambda_header .children [0 ].value } "
686- if isinstance (lambda_header .children [0 ], Token )
687- else "func"
688- )
689- args_offset = 1 if isinstance (lambda_header .children [0 ], Token ) else 0
690- theres_something_after_args = len (lambda_header .children ) > args_offset + 1
691- optional_type_hint = (
692- f" -> { lambda_header .children [args_offset + 1 ]} "
693- if theres_something_after_args
694- else ""
695- )
696- prepend_to_suffix = f"{ optional_type_hint } :"
697- new_expression_context = ExpressionContext (
698- f"{ expression_context .prefix_string } { append_to_prefix } " ,
699- expression_context .prefix_line ,
700- f"{ prepend_to_suffix } { expression_context .suffix_string } " ,
701- expression_context .suffix_line ,
702- )
703- return _format_concrete_expression (
704- lambda_header .children [args_offset ], new_expression_context , context
705- )
706-
707-
708- def _format_inline_lambda_statements_to_multiple_lines (
709- inline_lambda_statements : Tree ,
710- expression_context : ExpressionContext ,
711- context : Context ,
712- ) -> FormattedLines :
713- lambda_statements = inline_lambda_statements .children
714- if len (lambda_statements ) == 1 :
715- return _format_concrete_expression (
716- lambda_statements [0 ], expression_context , context
717- )
718- expression_context_for_first_statement = ExpressionContext (
719- expression_context .prefix_string , expression_context .prefix_line , "" , - 1
720- )
721- first_statement_formatted_lines = _format_concrete_expression (
722- lambda_statements [0 ], expression_context_for_first_statement , context
723- )
724- last_line_number , last_line = first_statement_formatted_lines [- 1 ]
725- assert last_line_number is not None
726- remaining_statements_prefix = last_line .strip ()
727- remaining_statements_expression_context = ExpressionContext (
728- f"{ remaining_statements_prefix } ; " ,
729- last_line_number , # type: ignore
730- expression_context .suffix_string ,
731- expression_context .suffix_line ,
732- )
733- fake_meta = Meta ()
734- fake_meta .line = get_line (lambda_statements [1 ])
735- fake_meta .end_line = get_end_line (lambda_statements [- 1 ])
736- fake_expression = Tree ("inline_lambda_statements" , lambda_statements [1 :], fake_meta )
737- return first_statement_formatted_lines [:- 1 ] + _format_concrete_expression (
738- fake_expression , remaining_statements_expression_context , context
739- )
740-
741-
742624def _collapse_getattr_tree_to_dot_chain (expression : Tree ) -> Tree :
743625 reversed_dot_chain_children = [] # type: List[Node]
744626 pending_getattr_call_to_match = None
@@ -883,3 +765,66 @@ def _format_dot_chain_to_multiple_lines_bottom_up(
883765 fake_meta ,
884766 )
885767 return _format_concrete_expression (new_actual_expr , expression_context , context )
768+
769+
770+ def _format_lambda_to_multiple_lines (
771+ a_lambda : Tree ,
772+ expression_context : ExpressionContext ,
773+ context : Context ,
774+ ) -> FormattedLines :
775+ expression_context_for_header = ExpressionContext (
776+ expression_context .prefix_string , expression_context .prefix_line , "" , - 1
777+ )
778+ header_lines = _format_concrete_expression (
779+ a_lambda .children [0 ], expression_context_for_header , context
780+ )
781+
782+ block_module = import_module ("gdtoolkit.formatter.block" )
783+ function_statement_module = import_module ("gdtoolkit.formatter.function_statement" )
784+ child_context = context .create_child_context (expression_context .prefix_line )
785+ (block_lines , _ ) = block_module .format_block (
786+ a_lambda .children [1 :],
787+ function_statement_module .format_func_statement ,
788+ child_context ,
789+ )
790+ last_block_line_number , last_block_line_content = block_lines [- 1 ]
791+
792+ return (
793+ header_lines
794+ + block_lines [:- 1 ]
795+ + [
796+ (
797+ last_block_line_number ,
798+ f"{ last_block_line_content } { expression_context .suffix_string } " ,
799+ )
800+ ]
801+ )
802+
803+
804+ def _format_lambda_header_to_multiple_lines (
805+ lambda_header : Tree ,
806+ expression_context : ExpressionContext ,
807+ context : Context ,
808+ ) -> FormattedLines :
809+ append_to_prefix = (
810+ f"func { lambda_header .children [0 ].value } "
811+ if isinstance (lambda_header .children [0 ], Token )
812+ else "func"
813+ )
814+ args_offset = 1 if isinstance (lambda_header .children [0 ], Token ) else 0
815+ theres_something_after_args = len (lambda_header .children ) > args_offset + 1
816+ optional_type_hint = (
817+ f" -> { lambda_header .children [args_offset + 1 ]} "
818+ if theres_something_after_args
819+ else ""
820+ )
821+ prepend_to_suffix = f"{ optional_type_hint } :"
822+ new_expression_context = ExpressionContext (
823+ f"{ expression_context .prefix_string } { append_to_prefix } " ,
824+ expression_context .prefix_line ,
825+ f"{ prepend_to_suffix } { expression_context .suffix_string } " ,
826+ expression_context .suffix_line ,
827+ )
828+ return _format_concrete_expression (
829+ lambda_header .children [args_offset ], new_expression_context , context
830+ )
0 commit comments