@@ -21,67 +21,47 @@ def __init__(self):
21
21
self .undedented_lambdas_at_paren_level = defaultdict (int )
22
22
23
23
def handle_NL (self , token : Token ) -> Iterator [Token ]:
24
- indent_str = token .rsplit ("\n " , 1 )[1 ] # Tabs and spaces
25
- indent = indent_str .count (" " ) + indent_str .count ("\t " ) * self .tab_len
26
-
27
24
if self .paren_level > 0 :
28
- yield from self ._handle_lambdas_on_newline_token_in_parens (
29
- token , indent , indent_str
30
- )
31
- # special handling for lambdas
32
- return
33
-
34
- yield token
35
-
36
- if indent > self .indent_level [- 1 ]:
37
- self .indent_level .append (indent )
38
- yield Token .new_borrow_pos (self .INDENT_type , indent_str , token )
25
+ # NL handling inside parens - required for multiline lambdas
26
+ yield from self ._handle_NL_in_parens (token )
39
27
else :
40
- while indent < self .indent_level [- 1 ]:
41
- self .indent_level .pop ()
42
- yield Token (
43
- self .DEDENT_type , indent_str , None , token .line , None , token .line
44
- )
45
- # produce extra newline after dedent to simplify grammar:
46
- yield token
47
-
48
- if indent != self .indent_level [- 1 ]:
49
- raise DedentError (
50
- "Unexpected dedent to column %s. Expected dedent to %s"
51
- % (indent , self .indent_level [- 1 ])
52
- )
28
+ # regular NL handling
29
+ for produced_token in super ().handle_NL (token ):
30
+ if produced_token .type == self .DEDENT_type :
31
+ # couple tweaks for handling multiline lambdas:
32
+ # 1) setting custom DEDENT metadata
33
+ yield Token (
34
+ self .DEDENT_type , None , None , token .line , None , token .line
35
+ )
36
+ # 2) producing extra NL after DEDENT to simplify grammar
37
+ yield token
38
+ else :
39
+ yield produced_token
53
40
54
41
def _process (self , stream ):
55
42
self .processed_tokens = []
56
43
self .undedented_lambdas_at_paren_level = defaultdict (int )
57
- for token in stream :
58
- self .processed_tokens .append (token )
59
- if token .type == self .NL_type :
60
- yield from self .handle_NL (token )
61
44
62
- if token .type in self .OPEN_PAREN_types :
63
- self .paren_level += 1
64
- elif token .type in self .CLOSE_PAREN_types :
45
+ for produced_token in super ()._process (self ._record_stream (stream )):
46
+ if (
47
+ produced_token .type in self .CLOSE_PAREN_types
48
+ or produced_token .type in self .LAMBDA_SEPARATOR_types
49
+ ):
50
+ # dedenting all undedented lambas (more than one if nested) at current paren level
65
51
while self .undedented_lambdas_at_paren_level [self .paren_level ] > 0 :
66
- yield from self ._dedent_lambda_at_token (token )
67
- self .paren_level -= 1
68
- assert self .paren_level >= 0
69
- elif token .type in self .LAMBDA_SEPARATOR_types :
70
- if self .undedented_lambdas_at_paren_level [self .paren_level ] > 0 :
71
- yield from self ._dedent_lambda_at_token (token )
52
+ yield from self ._dedent_lambda_at_token (produced_token )
53
+ yield produced_token
72
54
73
- if token .type != self .NL_type :
74
- yield token
75
-
76
- while len (self .indent_level ) > 1 :
77
- self .indent_level .pop ()
78
- yield Token (self .DEDENT_type , "" )
55
+ def _record_stream (self , stream ):
56
+ for token in stream :
57
+ self .processed_tokens .append (token )
58
+ yield token
79
59
80
- assert self .indent_level == [0 ], self .indent_level
60
+ # pylint: disable=invalid-name
61
+ def _handle_NL_in_parens (self , token : Token ):
62
+ indent_str = token .rsplit ("\n " , 1 )[1 ] # tabs and spaces
63
+ indent = indent_str .count (" " ) + indent_str .count ("\t " ) * self .tab_len
81
64
82
- def _handle_lambdas_on_newline_token_in_parens (
83
- self , token : Token , indent : int , indent_str : str
84
- ):
85
65
if (
86
66
self ._current_token_is_just_after_lambda_header ()
87
67
and indent > self .indent_level [- 1 ]
0 commit comments