@@ -136,9 +136,9 @@ def _format_foldable_to_multiple_lines(
136
136
"actual_type_cast" : _format_operator_chain_based_expression_to_multiple_lines ,
137
137
"await_expr" : _format_await_expression_to_multiple_lines ,
138
138
"standalone_call" : _format_call_expression_to_multiple_lines ,
139
- "getattr_call" : _collapse_to_getattr_chain_and_format_to_multiple_lines ,
140
- "getattr" : _collapse_to_getattr_chain_and_format_to_multiple_lines ,
141
- "subscr_expr" : _format_subscription_to_multiple_lines ,
139
+ "getattr_call" : _collapse_getattr_tree_to_dot_chain_and_format_to_multiple_lines ,
140
+ "getattr" : _collapse_getattr_tree_to_dot_chain_and_format_to_multiple_lines ,
141
+ "subscr_expr" : _collapse_subscr_expr_tree_to_dot_chain_and_format_to_multiple_lines ,
142
142
"par_expr" : _format_parentheses_to_multiple_lines ,
143
143
"array" : _format_array_to_multiple_lines ,
144
144
"string" : _format_string_to_multiple_lines ,
@@ -188,8 +188,9 @@ def _format_foldable_to_multiple_lines(
188
188
"func_var_inf" : lambda e , ec , c : _append_to_expression_context_and_pass_standalone (
189
189
f"var { expression_to_str (e .children [0 ])} := " , e .children [1 ], ec , c
190
190
),
191
- "getattr_chain " : _format_operator_chain_based_expression_to_multiple_lines ,
191
+ "dot_chain " : _format_operator_chain_based_expression_to_multiple_lines ,
192
192
"actual_getattr_call" : _format_call_expression_to_multiple_lines ,
193
+ "actual_subscr_expr" : _format_subscription_to_multiple_lines ,
193
194
} # type: Dict[str, Callable]
194
195
return handlers [expression .data ](expression , expression_context , context )
195
196
@@ -380,14 +381,23 @@ def _format_call_expression_to_multiple_lines(
380
381
)
381
382
382
383
383
- def _collapse_to_getattr_chain_and_format_to_multiple_lines (
384
+ def _collapse_getattr_tree_to_dot_chain_and_format_to_multiple_lines (
384
385
expression : Tree , expression_context : ExpressionContext , context : Context
385
386
) -> FormattedLines :
386
387
return _format_foldable_to_multiple_lines (
387
- _collapse_getattr_tree_to_getattr_chain (expression ), expression_context , context
388
+ _collapse_getattr_tree_to_dot_chain (expression ), expression_context , context
388
389
)
389
390
390
391
392
+ def _collapse_subscr_expr_tree_to_dot_chain_and_format_to_multiple_lines (
393
+ expression : Tree , expression_context : ExpressionContext , context : Context
394
+ ) -> FormattedLines :
395
+ dot_chain = _collapse_subscr_expr_tree_to_dot_chain (expression )
396
+ if len (dot_chain .children ) == 1 :
397
+ dot_chain = dot_chain .children [0 ]
398
+ return _format_foldable_to_multiple_lines (dot_chain , expression_context , context )
399
+
400
+
391
401
def _format_subscription_to_multiple_lines (
392
402
expression : Tree , expression_context : ExpressionContext , context : Context
393
403
) -> FormattedLines :
@@ -699,20 +709,20 @@ def _format_inline_lambda_statements_to_multiple_lines(
699
709
)
700
710
701
711
702
- def _collapse_getattr_tree_to_getattr_chain (expression : Tree ) -> Tree :
703
- reversed_getattr_chain_children = [] # type: List[Node]
712
+ def _collapse_getattr_tree_to_dot_chain (expression : Tree ) -> Tree :
713
+ reversed_dot_chain_children = [] # type: List[Node]
704
714
pending_getattr_call_to_match = None
705
715
next_expression_to_process = expression # type: Optional[Node]
706
716
while next_expression_to_process is not None :
707
717
if isinstance (next_expression_to_process , Token ):
708
- reversed_getattr_chain_children .append (next_expression_to_process )
718
+ reversed_dot_chain_children .append (next_expression_to_process )
709
719
next_expression_to_process = None
710
720
elif next_expression_to_process .data == "getattr_call" :
711
721
pending_getattr_call_to_match = next_expression_to_process
712
722
next_expression_to_process = next_expression_to_process .children [0 ]
713
723
elif next_expression_to_process .data == "getattr" :
714
724
if pending_getattr_call_to_match is None :
715
- reversed_getattr_chain_children += reversed (
725
+ reversed_dot_chain_children += reversed (
716
726
next_expression_to_process .children [1 :]
717
727
)
718
728
else :
@@ -726,21 +736,64 @@ def _collapse_getattr_tree_to_getattr_chain(expression: Tree) -> Tree:
726
736
fake_meta ,
727
737
)
728
738
pending_getattr_call_to_match = None
729
- reversed_getattr_chain_children .append (fake_expression )
730
- reversed_getattr_chain_children += reversed (
739
+ reversed_dot_chain_children .append (fake_expression )
740
+ reversed_dot_chain_children += reversed (
731
741
next_expression_to_process .children [1 :- 1 ]
732
742
)
733
743
next_expression_to_process = next_expression_to_process .children [0 ]
744
+ elif next_expression_to_process .data == "subscr_expr" :
745
+ sub_dot_chain = _collapse_subscr_expr_tree_to_dot_chain (
746
+ next_expression_to_process
747
+ )
748
+ reversed_dot_chain_children = reversed_dot_chain_children + list (
749
+ reversed (sub_dot_chain .children )
750
+ )
751
+ next_expression_to_process = None
734
752
else :
735
- reversed_getattr_chain_children .append (next_expression_to_process )
753
+ reversed_dot_chain_children .append (next_expression_to_process )
736
754
next_expression_to_process = None
737
- getattr_chain_children = list (reversed (reversed_getattr_chain_children ))
755
+ dot_chain_children = list (reversed (reversed_dot_chain_children ))
756
+ fake_meta = Meta ()
757
+ fake_meta .line = dot_chain_children [0 ].line
758
+ fake_meta .end_line = dot_chain_children [- 1 ].end_line
759
+ fake_expression = Tree (
760
+ "dot_chain" ,
761
+ dot_chain_children ,
762
+ fake_meta ,
763
+ )
764
+ return fake_expression
765
+
766
+
767
+ def _collapse_subscr_expr_tree_to_dot_chain (expression : Tree ) -> Tree :
768
+ subscriptee = expression .children [0 ]
769
+ subscript_to_match = expression .children [1 ]
770
+ collapsers = {
771
+ "subscr_expr" : _collapse_subscr_expr_tree_to_dot_chain ,
772
+ "getattr" : _collapse_getattr_tree_to_dot_chain ,
773
+ "getattr_call" : _collapse_getattr_tree_to_dot_chain ,
774
+ }
775
+ sub_dot_chain = (
776
+ collapsers [subscriptee .data ](subscriptee ).children
777
+ if isinstance (subscriptee , Tree ) and subscriptee .data in collapsers
778
+ else [subscriptee ]
779
+ )
780
+ matching_expr = sub_dot_chain [- 1 ]
781
+ fake_meta = Meta ()
782
+ fake_meta .line = matching_expr .line
783
+ fake_meta .end_line = expression .end_line
784
+ fake_expression = Tree (
785
+ "actual_subscr_expr" ,
786
+ [matching_expr , subscript_to_match ],
787
+ fake_meta ,
788
+ )
789
+
790
+ dot_chain_children = sub_dot_chain [:- 1 ] + [fake_expression ]
738
791
fake_meta = Meta ()
739
- fake_meta .line = getattr_chain_children [0 ].line
740
- fake_meta .end_line = getattr_chain_children [- 1 ].end_line
792
+ fake_meta .line = dot_chain_children [0 ].line
793
+ fake_meta .end_line = dot_chain_children [- 1 ].end_line
741
794
fake_expression = Tree (
742
- "getattr_chain " ,
743
- getattr_chain_children ,
795
+ "dot_chain " ,
796
+ dot_chain_children ,
744
797
fake_meta ,
745
798
)
746
799
return fake_expression
0 commit comments