Skip to content

Commit 2bffe0b

Browse files
committed
Add Branch nodes to alternation parser and tests
1 parent e3a6378 commit 2bffe0b

12 files changed

Lines changed: 325 additions & 230 deletions

File tree

crates/plotnik-lib/src/ql/ast_tests.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,15 @@ fn reference() {
100100
#[test]
101101
fn alternation_unlabeled() {
102102
let query = Query::new("[(identifier) (number)]");
103-
insta::assert_snapshot!(query.snapshot_ast(), @r#"
103+
insta::assert_snapshot!(query.snapshot_ast(), @r"
104104
Root
105105
Def
106106
Alt
107-
Tree identifier
108-
Tree number
109-
"#);
107+
Branch
108+
Tree identifier
109+
Branch
110+
Tree number
111+
");
110112
}
111113

112114
#[test]

crates/plotnik-lib/src/ql/parser/grammar.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,9 @@ impl Parser<'_> {
385385
self.parse_branch_lowercase_label();
386386
}
387387
} else if EXPR_FIRST.contains(kind) {
388+
self.start_node(SyntaxKind::Branch);
388389
self.parse_expr();
390+
self.finish_node();
389391
} else if ALT_RECOVERY.contains(kind) {
390392
break;
391393
} else {

crates/plotnik-lib/src/ql/parser/tests/grammar/alternations.rs

Lines changed: 119 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@ fn alternation() {
1717
Def
1818
Alt
1919
BracketOpen "["
20-
Tree
21-
ParenOpen "("
22-
Id "identifier"
23-
ParenClose ")"
24-
Tree
25-
ParenOpen "("
26-
Id "string"
27-
ParenClose ")"
20+
Branch
21+
Tree
22+
ParenOpen "("
23+
Id "identifier"
24+
ParenClose ")"
25+
Branch
26+
Tree
27+
ParenOpen "("
28+
Id "string"
29+
ParenClose ")"
2830
BracketClose "]"
2931
"#);
3032
}
@@ -41,10 +43,12 @@ fn alternation_with_anonymous() {
4143
Def
4244
Alt
4345
BracketOpen "["
44-
Lit
45-
StringLit "\"true\""
46-
Lit
47-
StringLit "\"false\""
46+
Branch
47+
Lit
48+
StringLit "\"true\""
49+
Branch
50+
Lit
51+
StringLit "\"false\""
4852
BracketClose "]"
4953
"#);
5054
}
@@ -62,17 +66,53 @@ fn alternation_with_capture() {
6266
Capture
6367
Alt
6468
BracketOpen "["
69+
Branch
70+
Tree
71+
ParenOpen "("
72+
Id "identifier"
73+
ParenClose ")"
74+
Branch
75+
Tree
76+
ParenOpen "("
77+
Id "string"
78+
ParenClose ")"
79+
BracketClose "]"
80+
At "@"
81+
Id "value"
82+
"#);
83+
}
84+
85+
#[test]
86+
fn alternation_with_quantifier() {
87+
let input = indoc! {r#"
88+
[
89+
(identifier)
90+
(string)* @strings
91+
]
92+
"#};
93+
94+
let query = Query::new(input);
95+
insta::assert_snapshot!(query.snapshot_cst(), @r#"
96+
Root
97+
Def
98+
Alt
99+
BracketOpen "["
100+
Branch
65101
Tree
66102
ParenOpen "("
67103
Id "identifier"
68104
ParenClose ")"
69-
Tree
70-
ParenOpen "("
71-
Id "string"
72-
ParenClose ")"
73-
BracketClose "]"
74-
At "@"
75-
Id "value"
105+
Branch
106+
Capture
107+
Quantifier
108+
Tree
109+
ParenOpen "("
110+
Id "string"
111+
ParenClose ")"
112+
Star "*"
113+
At "@"
114+
Id "strings"
115+
BracketClose "]"
76116
"#);
77117
}
78118

@@ -92,14 +132,16 @@ fn alternation_nested() {
92132
Id "expr"
93133
Alt
94134
BracketOpen "["
95-
Tree
96-
ParenOpen "("
97-
Id "binary"
98-
ParenClose ")"
99-
Tree
100-
ParenOpen "("
101-
Id "unary"
102-
ParenClose ")"
135+
Branch
136+
Tree
137+
ParenOpen "("
138+
Id "binary"
139+
ParenClose ")"
140+
Branch
141+
Tree
142+
ParenOpen "("
143+
Id "unary"
144+
ParenClose ")"
103145
BracketClose "]"
104146
ParenClose ")"
105147
"#);
@@ -124,14 +166,16 @@ fn alternation_in_field() {
124166
Colon ":"
125167
Alt
126168
BracketOpen "["
127-
Tree
128-
ParenOpen "("
129-
Id "string"
130-
ParenClose ")"
131-
Tree
132-
ParenOpen "("
133-
Id "number"
134-
ParenClose ")"
169+
Branch
170+
Tree
171+
ParenOpen "("
172+
Id "string"
173+
ParenClose ")"
174+
Branch
175+
Tree
176+
ParenOpen "("
177+
Id "number"
178+
ParenClose ")"
135179
BracketClose "]"
136180
ParenClose ")"
137181
"#);
@@ -149,18 +193,21 @@ fn unlabeled_alternation_three_items() {
149193
Def
150194
Alt
151195
BracketOpen "["
152-
Tree
153-
ParenOpen "("
154-
Id "identifier"
155-
ParenClose ")"
156-
Tree
157-
ParenOpen "("
158-
Id "number"
159-
ParenClose ")"
160-
Tree
161-
ParenOpen "("
162-
Id "string"
163-
ParenClose ")"
196+
Branch
197+
Tree
198+
ParenOpen "("
199+
Id "identifier"
200+
ParenClose ")"
201+
Branch
202+
Tree
203+
ParenOpen "("
204+
Id "number"
205+
ParenClose ")"
206+
Branch
207+
Tree
208+
ParenOpen "("
209+
Id "string"
210+
ParenClose ")"
164211
BracketClose "]"
165212
"#);
166213
}
@@ -177,14 +224,16 @@ fn upper_ident_in_alternation_not_followed_by_colon() {
177224
Def
178225
Alt
179226
BracketOpen "["
180-
Ref
181-
ParenOpen "("
182-
Id "Expr"
183-
ParenClose ")"
184-
Ref
185-
ParenOpen "("
186-
Id "Statement"
187-
ParenClose ")"
227+
Branch
228+
Ref
229+
ParenOpen "("
230+
Id "Expr"
231+
ParenClose ")"
232+
Branch
233+
Ref
234+
ParenOpen "("
235+
Id "Statement"
236+
ParenClose ")"
188237
BracketClose "]"
189238
---
190239
error: undefined reference: `Expr`
@@ -555,10 +604,11 @@ fn mixed_tagged_and_untagged() {
555604
ParenOpen "("
556605
Id "a"
557606
ParenClose ")"
558-
Tree
559-
ParenOpen "("
560-
Id "b"
561-
ParenClose ")"
607+
Branch
608+
Tree
609+
ParenOpen "("
610+
Id "b"
611+
ParenClose ")"
562612
Branch
563613
Id "Another"
564614
Colon ":"
@@ -590,14 +640,16 @@ fn tagged_alternation_with_nested_alternation() {
590640
Colon ":"
591641
Alt
592642
BracketOpen "["
593-
Tree
594-
ParenOpen "("
595-
Id "number"
596-
ParenClose ")"
597-
Tree
598-
ParenOpen "("
599-
Id "string"
600-
ParenClose ")"
643+
Branch
644+
Tree
645+
ParenOpen "("
646+
Id "number"
647+
ParenClose ")"
648+
Branch
649+
Tree
650+
ParenOpen "("
651+
Id "string"
652+
ParenClose ")"
601653
BracketClose "]"
602654
Branch
603655
Id "Ident"

crates/plotnik-lib/src/ql/parser/tests/grammar/captures.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -258,14 +258,16 @@ fn alternation_capture_with_type() {
258258
Capture
259259
Alt
260260
BracketOpen "["
261-
Tree
262-
ParenOpen "("
263-
Id "identifier"
264-
ParenClose ")"
265-
Tree
266-
ParenOpen "("
267-
Id "number"
268-
ParenClose ")"
261+
Branch
262+
Tree
263+
ParenOpen "("
264+
Id "identifier"
265+
ParenClose ")"
266+
Branch
267+
Tree
268+
ParenOpen "("
269+
Id "number"
270+
ParenClose ")"
269271
BracketClose "]"
270272
At "@"
271273
Id "value"

0 commit comments

Comments
 (0)