Skip to content

Commit 54d657b

Browse files
committed
Refactor custom lexer
1 parent 96b9d77 commit 54d657b

File tree

1 file changed

+30
-50
lines changed

1 file changed

+30
-50
lines changed

gdtoolkit/parser/gdscript_indenter.py

Lines changed: 30 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -21,67 +21,47 @@ def __init__(self):
2121
self.undedented_lambdas_at_paren_level = defaultdict(int)
2222

2323
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-
2724
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)
3927
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
5340

5441
def _process(self, stream):
5542
self.processed_tokens = []
5643
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)
6144

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
6551
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
7254

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
7959

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
8164

82-
def _handle_lambdas_on_newline_token_in_parens(
83-
self, token: Token, indent: int, indent_str: str
84-
):
8565
if (
8666
self._current_token_is_just_after_lambda_header()
8767
and indent > self.indent_level[-1]

0 commit comments

Comments
 (0)