Skip to content

Commit 7350420

Browse files
refactor: Extract functions
1 parent a64b105 commit 7350420

File tree

1 file changed

+23
-22
lines changed

1 file changed

+23
-22
lines changed

parser/cst/treegen.py

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -130,34 +130,35 @@ def _parse_expr_or_assign(self, idx: int) -> tuple[AnyNode, int]:
130130
raise self.err(f"Expected semicolon at end of expr, "
131131
f"got {self[idx].name}", self[idx])
132132

133-
def _parse_decl(self, start: int):
134-
idx = start
135-
if self.matches(idx, KwdM('let')):
136-
scope_type = DeclScope_Let
137-
elif self.matches(idx, KwdM('global')):
138-
scope_type = DeclScope_Global
139-
else:
140-
assert 0, "Unknown decl scope"
141-
scope = scope_type.of(self[idx])
142-
idx += 1
143-
if isinstance(self[idx], LSqBracket):
144-
sqb_start = idx
145-
idx += 1
146-
if not isinstance(self[idx], RSqBracket):
147-
raise self.err("Expected ']' after '[' in list decl", self[idx])
148-
idx += 1
149-
tp_node = DeclType_List(self.tok_region(sqb_start, idx))
150-
else:
151-
loc = self[idx - 1].region.end # Have to give region, so say char after 'let'
152-
tp_node = DeclType_Variable(StrRegion(loc, loc))
153-
decl_items, idx = self._parse_decl_item_list(idx)
133+
def _parse_decl(self, idx: int): # e.g. global [] foo=bar, ...;
134+
scope, idx = self._parse_decl_scope(idx) # ~~~~~^ ^^ ~~^~~~~~~~~~
135+
tp_node, idx = self._parse_decl_sqb_or(idx) # ~/ |
136+
decl_items, idx = self._parse_decl_item_list(idx) # ~~~/
154137
if not self.matches(idx, SemicolonToken):
155138
raise self.err(f"Expected ';' or ',' after decl_item,"
156139
f" got {self[idx].name}", self[idx])
157140
idx += 1
158141
return self.node_from_children(DeclNode, [scope, tp_node, decl_items]), idx
159142

160-
def _parse_decl_item_list(self, idx):
143+
def _parse_decl_scope(self, idx: int) -> tuple[AnyNode, int]:
144+
if self.matches(idx, KwdM('let')):
145+
return DeclScope_Let.of(self[idx]), idx + 1
146+
if self.matches(idx, KwdM('global')):
147+
return DeclScope_Global.of(self[idx]), idx + 1
148+
assert 0, "Unknown decl scope"
149+
150+
def _parse_decl_sqb_or(self, idx: int) -> tuple[AnyNode, int]:
151+
if not isinstance(self[idx], LSqBracket):
152+
loc = self[idx - 1].region.end # Have to give region, so say char after 'let'
153+
return DeclType_Variable(StrRegion(loc, loc)), idx
154+
sqb_start = idx
155+
idx += 1
156+
if not isinstance(self[idx], RSqBracket):
157+
raise self.err("Expected ']' after '[' in list decl (eg. 'let[] a;')", self[idx])
158+
idx += 1
159+
return DeclType_List(self.tok_region(sqb_start, idx)), idx
160+
161+
def _parse_decl_item_list(self, idx: int) -> tuple[AnyNode, int]:
161162
items = []
162163
while True:
163164
item, idx = self._parse_decl_item(idx)

0 commit comments

Comments
 (0)