@@ -9,6 +9,7 @@ class GDScriptIndenter(Indenter):
9
9
NL_type = "_NL"
10
10
OPEN_PAREN_types = ["LPAR" , "LSQB" , "LBRACE" ]
11
11
CLOSE_PAREN_types = ["RPAR" , "RSQB" , "RBRACE" ]
12
+ LAMBDA_LINE_EXTENSION_types = ["IF" , "WHILE" , "FOR" , "MATCH" ]
12
13
LAMBDA_SEPARATOR_types = ["COMMA" ]
13
14
INDENT_type = "_INDENT"
14
15
DEDENT_type = "_DEDENT"
@@ -42,51 +43,60 @@ def _process(self, stream):
42
43
self .processed_tokens = []
43
44
self .undedented_lambdas_at_paren_level = defaultdict (int )
44
45
46
+ had_newline = False
45
47
for produced_token in super ()._process (self ._record_stream (stream )):
46
48
if (
47
49
produced_token .type in self .CLOSE_PAREN_types
48
50
or produced_token .type in self .LAMBDA_SEPARATOR_types
49
51
):
50
52
# dedenting all undedented lambas (more than one if nested) at current paren level
51
53
while self .undedented_lambdas_at_paren_level [self .paren_level ] > 0 :
52
- yield from self ._dedent_lambda_at_token (produced_token )
54
+ yield from self ._dedent_lambda_at_token (had_newline , produced_token )
55
+ had_newline = False
56
+ had_newline = produced_token .type == self .NL_type
53
57
yield produced_token
54
58
55
59
def _record_stream (self , stream ):
56
60
for token in stream :
57
61
self .processed_tokens .append (token )
58
62
yield token
59
63
64
+ def _in_multiline_lambda (self ):
65
+ return self .undedented_lambdas_at_paren_level [self .paren_level ] > 0
66
+
60
67
# pylint: disable=invalid-name
61
68
def _handle_NL_in_parens (self , token : Token ):
69
+ # Adapted from lark/indendeter.py as that normally disables line handling
70
+ # when paren_level > 0.
71
+ # NOTE: we never raise DedentError here as it doesn't make sense in parens
62
72
indent_str = token .rsplit ("\n " , 1 )[1 ] # tabs and spaces
63
73
indent = indent_str .count (" " ) + indent_str .count ("\t " ) * self .tab_len
64
74
65
- if (
75
+ if indent > self . indent_level [ - 1 ] and (
66
76
self ._current_token_is_just_after_lambda_header ()
67
- and indent > self .indent_level [ - 1 ]
77
+ or self ._in_multiline_lambda ()
68
78
):
69
79
self .indent_level .append (indent )
70
80
self .undedented_lambdas_at_paren_level [self .paren_level ] += 1
71
81
yield token
72
82
yield Token .new_borrow_pos (self .INDENT_type , indent_str , token )
73
- elif (
74
- indent <= self .indent_level [- 1 ]
75
- and self .undedented_lambdas_at_paren_level [self .paren_level ] > 0
76
- ):
83
+ elif indent <= self .indent_level [- 1 ] and self ._in_multiline_lambda ():
77
84
yield token
78
-
79
- while indent < self .indent_level [- 1 ]:
85
+ while indent < self .indent_level [- 1 ] and self ._in_multiline_lambda ():
80
86
self .indent_level .pop ()
81
87
self .undedented_lambdas_at_paren_level [self .paren_level ] -= 1
82
- yield Token .new_borrow_pos (self .DEDENT_type , indent_str , token )
83
-
84
- # never raising DedentError here as it doesn't make sense in parens
88
+ yield Token (self .DEDENT_type , None , None , token .line , None , token .line )
89
+ # If we are still in a situation that can handle newlines, emit an extra
90
+ # one with the same rationale as above
91
+ if self ._in_multiline_lambda ():
92
+ yield token
93
+ # Otherwise do nothing as other expressions don't handle newlines
85
94
86
- def _dedent_lambda_at_token (self , token : Token ):
95
+ def _dedent_lambda_at_token (self , had_newline : bool , token : Token ):
87
96
self .indent_level .pop ()
88
97
self .undedented_lambdas_at_paren_level [self .paren_level ] -= 1
89
- yield Token .new_borrow_pos (self .NL_type , "N/A" , token )
98
+ if not had_newline :
99
+ yield Token .new_borrow_pos (self .NL_type , "N/A" , token )
90
100
yield Token .new_borrow_pos (self .DEDENT_type , "N/A" , token )
91
101
92
102
def _current_token_is_just_after_lambda_header (self ):
0 commit comments