Skip to content

Commit 8bd03f5

Browse files
committed
Adapt to cedarscript-grammar==0.5.0:
Add support for line_filter with LineFilter
1 parent be2b6a4 commit 8bd03f5

File tree

2 files changed

+24
-15
lines changed

2 files changed

+24
-15
lines changed

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ classifiers = [
2626
]
2727
keywords = ["parser", "ast", "cedarscript", "code-editing", "refactoring", "code-analysis", "sql-like", "ai-assisted-development"]
2828
dependencies = [
29-
"cedarscript-grammar>=0.4.0",
29+
"cedarscript-grammar>=0.5.0",
3030
]
3131
requires-python = ">=3.8"
3232

src/cedarscript_ast_parser/cedarscript_ast_parser.py

+23-14
Original file line numberDiff line numberDiff line change
@@ -268,16 +268,18 @@ class CaseAction:
268268
indent: int | None = None
269269
content: Optional[str | tuple[Region, int | None]] = None
270270

271+
class LineFilter:
272+
pass
271273

272274
@dataclass
273-
class CaseStatement:
275+
class CaseStatement(LineFilter):
274276
"""Represents a CASE statement with when-then pairs and optional else"""
275277
cases: list[tuple[CaseWhen, CaseAction]]
276278
else_action: Optional[CaseAction] = None
277279

278280

279281
@dataclass
280-
class EdScript:
282+
class EdScript(LineFilter):
281283
"""Represents an ED script content"""
282284
script: str
283285

@@ -643,7 +645,7 @@ def parse_relative_indentation(self, node) -> int | None:
643645

644646
def parse_content(self, node) -> str | tuple[Region, int | None] | None:
645647
content = self.find_first_by_type(node.named_children, [
646-
'content_literal', 'content_from_segment', 'ed_stmt', 'case_stmt'
648+
'content_literal', 'content_from_segment', 'line_filter'
647649
])
648650
if not content:
649651
return None
@@ -652,13 +654,27 @@ def parse_content(self, node) -> str | tuple[Region, int | None] | None:
652654
return self.parse_content_literal(content) # str
653655
case 'content_from_segment':
654656
return self.parse_content_from_segment_clause(content) # tuple[Region, int]
655-
case 'ed_stmt':
656-
return self.parse_ed_stmt(content) # EdScript
657-
case 'case_stmt':
658-
return self.parse_case_stmt(content) # CaseStatement
657+
case 'line_filter':
658+
return self.parse_line_filter(content)
659659
case _:
660660
raise ValueError(f"Invalid content type: {content.type}")
661661

662+
def parse_line_filter(self, node) -> LineFilter:
663+
node = node.named_children[0]
664+
match node.type:
665+
case 'ed_stmt':
666+
return self.parse_ed_stmt(node) # EdScript
667+
case 'case_stmt':
668+
return self.parse_case_stmt(node) # CaseStatement
669+
670+
671+
def parse_ed_stmt(self, node) -> EdScript:
672+
"""Parse an ED script statement"""
673+
ed_script = self.find_first_by_type(node.children, 'string')
674+
if ed_script is None:
675+
raise ValueError("No ED script found in ed_stmt")
676+
return EdScript(script=self.parse_string(ed_script))
677+
662678
def parse_case_stmt(self, node) -> CaseStatement:
663679
"""Parse a CASE statement"""
664680
cases = []
@@ -738,13 +754,6 @@ def parse_case_action(self, node) -> CaseAction:
738754

739755
return action
740756

741-
def parse_ed_stmt(self, node) -> EdScript:
742-
"""Parse an ED script statement"""
743-
ed_script = self.find_first_by_type(node.children, 'string')
744-
if ed_script is None:
745-
raise ValueError("No ED script found in ed_stmt")
746-
return EdScript(script=self.parse_string(ed_script))
747-
748757
def parse_singlefile_clause(self, node):
749758
if node is None or node.type != 'singlefile_clause':
750759
raise ValueError("Expected singlefile_clause node")

0 commit comments

Comments
 (0)