Repository navigation
Commit 865fc07
committed
yeast: Clarify semantics surrounding captured sequences
Copilot's second review sent me down a bit of a rabbit hole.
The fundamental question is the following: what (if anything) does it
mean to capture a query sequence?
That is, consider the following query:
```
(foo ((bar) (baz)) @quux)
```
Here, `@quux` is attached to a subquery that matches a sequence of
nodes, `bar` followerd by `baz`. So, what should this actually capture?
The current implementation treats this in a somewhat surprising way,
equivalent to if we had written
```
(foo ((bar) @quux (baz) @quux))
```
that is, both kinds of child nodes get pushed into the `quux` capture.
To me, this behaviour is very surprising and unintuitive (and since
there is an explicit way to express this anyway, there doesn't seem to
be much reason to prefer the "shorthand" version).
For this reason, the present commit just disallows adding a capture to a
query sequence entirely. A capture is only attached to a single query
node, never a sequence of nodes.
Note that this does not mean that a _capture_ can't contain a sequence
of nodes. Both
```
(foo (bar)* @bars)
```
and
```
(foo ((bar) @bars)*)
```
(which are equivalent) capture all of the `bar` children and put them in
`bars` as a `Vec<Id>`.
In the new AST, we represent the syntax in the order it appears, so
`(bar)* @bars` is a capture of a repeated node match. However, when we
lower this into an executable query, we push the capture in, so it
becomes more like the second version. We're still only capturing a
single node at a time, but we may do so several times due to the
repetition.
(One might consider getting rid of the first syntax entirely, then, but
I think it's more readable to write this as "capture of repeat" rather
than "repeat of capture".)
Finally, in addition to no longer allowing captures to apply to
sequences, we now also do not allow sequences to be empty (i.e. `()`) or
contain a single element. The first would have no effect (an empty
sequence always succeeds), and the second is redundant (a singleton
sequence is equivalent to its single element). All of these checks are
enforced at compile-time.1 parent cafada6 commit 865fc07
4 files changed
Lines changed: 179 additions & 64 deletions
File tree
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
54 | 54 | | |
55 | 55 | | |
56 | 56 | | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
57 | 64 | | |
58 | 65 | | |
59 | 66 | | |
| |||
81 | 88 | | |
82 | 89 | | |
83 | 90 | | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
84 | 112 | | |
85 | 113 | | |
86 | 114 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
128 | 128 | | |
129 | 129 | | |
130 | 130 | | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
131 | 136 | | |
132 | 137 | | |
133 | 138 | | |
| |||
152 | 157 | | |
153 | 158 | | |
154 | 159 | | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
155 | 195 | | |
156 | 196 | | |
157 | 197 | | |
| |||
168 | 208 | | |
169 | 209 | | |
170 | 210 | | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
171 | 214 | | |
172 | 215 | | |
173 | | - | |
| 216 | + | |
174 | 217 | | |
175 | 218 | | |
176 | 219 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
33 | | - | |
34 | | - | |
35 | | - | |
36 | | - | |
37 | | - | |
38 | | - | |
39 | | - | |
40 | | - | |
| 33 | + | |
41 | 34 | | |
42 | 35 | | |
43 | 36 | | |
| |||
116 | 109 | | |
117 | 110 | | |
118 | 111 | | |
119 | | - | |
120 | | - | |
121 | | - | |
| 112 | + | |
| 113 | + | |
122 | 114 | | |
123 | | - | |
| 115 | + | |
| 116 | + | |
124 | 117 | | |
125 | 118 | | |
126 | 119 | | |
| |||
163 | 156 | | |
164 | 157 | | |
165 | 158 | | |
166 | | - | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
167 | 174 | | |
168 | | - | |
169 | | - | |
| 175 | + | |
170 | 176 | | |
171 | 177 | | |
172 | | - | |
| 178 | + | |
| 179 | + | |
173 | 180 | | |
174 | 181 | | |
175 | 182 | | |
| |||
203 | 210 | | |
204 | 211 | | |
205 | 212 | | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
206 | 219 | | |
207 | 220 | | |
208 | 221 | | |
| |||
218 | 231 | | |
219 | 232 | | |
220 | 233 | | |
221 | | - | |
222 | | - | |
| 234 | + | |
223 | 235 | | |
224 | 236 | | |
225 | | - | |
226 | | - | |
227 | | - | |
228 | | - | |
229 | | - | |
230 | | - | |
231 | | - | |
232 | | - | |
233 | | - | |
234 | | - | |
235 | | - | |
236 | | - | |
237 | | - | |
238 | | - | |
239 | | - | |
240 | | - | |
241 | | - | |
242 | | - | |
243 | | - | |
244 | | - | |
245 | | - | |
246 | | - | |
247 | | - | |
248 | | - | |
249 | | - | |
250 | | - | |
251 | | - | |
252 | | - | |
253 | | - | |
254 | | - | |
255 | | - | |
256 | | - | |
257 | | - | |
258 | | - | |
259 | | - | |
260 | | - | |
| 237 | + | |
| 238 | + | |
261 | 239 | | |
262 | 240 | | |
263 | 241 | | |
| |||
517 | 495 | | |
518 | 496 | | |
519 | 497 | | |
520 | | - | |
| 498 | + | |
521 | 499 | | |
522 | | - | |
523 | | - | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
524 | 508 | | |
525 | 509 | | |
526 | 510 | | |
| |||
539 | 523 | | |
540 | 524 | | |
541 | 525 | | |
542 | | - | |
543 | | - | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
| 587 | + | |
544 | 588 | | |
545 | | - | |
| 589 | + | |
546 | 590 | | |
547 | 591 | | |
548 | 592 | | |
549 | | - | |
550 | | - | |
| 593 | + | |
551 | 594 | | |
552 | 595 | | |
553 | 596 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
143 | 143 | | |
144 | 144 | | |
145 | 145 | | |
146 | | - | |
| 146 | + | |
| 147 | + | |
147 | 148 | | |
148 | 149 | | |
149 | 150 | | |
| |||
0 commit comments