Skip to content

Commit e204a49

Browse files
committed
Make custom lexer more generic, #327
1 parent 4b628ed commit e204a49

File tree

2 files changed

+40
-28
lines changed

2 files changed

+40
-28
lines changed

gdtoolkit/parser/gdscript_indenter.py

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -117,31 +117,36 @@ def _dedent_lambda_at_token(self, token: Token):
117117
yield Token.new_borrow_pos(self.DEDENT_type, "N/A", token)
118118

119119
def _current_token_is_just_after_lambda_header(self):
120-
# TODO: handle newlines etc. in between tokens
121-
return (
122-
len(self.processed_tokens) > 0
123-
and self.processed_tokens[-2].type == "COLON"
124-
and self.processed_tokens[-3].type == "RPAR"
125-
and self.processed_tokens[-4].type == "LPAR"
126-
and (
127-
self.processed_tokens[-5].type == "FUNC"
128-
or (
129-
self.processed_tokens[-5].type == "NAME"
130-
and self.processed_tokens[-6].type == "FUNC"
131-
)
132-
)
133-
) or (
134-
len(self.processed_tokens) > 0
135-
and self.processed_tokens[-2].type == "COLON"
136-
and self.processed_tokens[-3].type == "TYPE_HINT"
137-
and self.processed_tokens[-4].value == "->"
138-
and self.processed_tokens[-5].type == "RPAR"
139-
and self.processed_tokens[-6].type == "LPAR"
140-
and (
141-
self.processed_tokens[-7].type == "FUNC"
142-
or (
143-
self.processed_tokens[-7].type == "NAME"
144-
and self.processed_tokens[-8].type == "FUNC"
145-
)
146-
)
147-
)
120+
extra_rpars = [0]
121+
pattern_functions = [
122+
lambda t: t.type == "COLON",
123+
lambda t: t.type == "RPAR",
124+
lambda t: t.type == "LPAR" and extra_rpars[0] == 0,
125+
lambda t: t.type == "FUNC",
126+
]
127+
128+
def lpar_accept_function(token: Token) -> bool:
129+
if token.type == "RPAR":
130+
extra_rpars[0] += 1
131+
elif token.type == "LPAR":
132+
if extra_rpars[0] <= 0:
133+
return False
134+
extra_rpars[0] -= 1
135+
return True
136+
137+
accept_functions = [
138+
lambda t: t.type == "_NL",
139+
lambda t: t.type in ["_NL", "TYPE_HINT"] or t.value == "->",
140+
lpar_accept_function,
141+
lambda t: t.type in ["_NL", "NAME"],
142+
]
143+
i = 0
144+
for processed_token in reversed(self.processed_tokens):
145+
if i >= len(pattern_functions):
146+
return True
147+
if pattern_functions[i](processed_token):
148+
i += 1
149+
continue
150+
if not accept_functions[i](processed_token):
151+
return False
152+
return i >= len(pattern_functions)

tests/valid-gd-scripts/bug_327_multiline_lambda.gd

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,10 @@ func foo(new_button, button_name, menu, _game_flow):
44
var test := ""
55
_game_flow.ref.request_transition(menu[button_name].transition, menu[button_name].data)
66
)
7+
8+
func bar(new_button, button_name, menu, _game_flow):
9+
new_button.pressed.connect(
10+
func(x=(1)) -> void:
11+
var test := ""
12+
_game_flow.ref.request_transition(menu[button_name].transition, menu[button_name].data)
13+
)

0 commit comments

Comments
 (0)