Skip to content

Commit f704a93

Browse files
committed
Treat loop do as a pattern terminator
Prism rejected pattern-matching loop conditions with a trailing comma before the `do` delimiter, while parse.y accepts them. Treat `PM_TOKEN_KEYWORD_DO_LOOP` as a terminator after a trailing comma, so the loop `do` delimiter is not parsed as another pattern.
1 parent 70147e5 commit f704a93

7 files changed

Lines changed: 249 additions & 115 deletions

File tree

snapshots/for.txt

Lines changed: 100 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
@ ProgramNode (location: (1,0)-(27,3))
1+
@ ProgramNode (location: (1,0)-(29,25))
22
├── flags: ∅
3-
├── locals: [:i, :j, :k, :a, :b, :c, :d]
3+
├── locals: [:i, :j, :k, :a, :b, :c, :d, :x]
44
└── statements:
5-
@ StatementsNode (location: (1,0)-(27,3))
5+
@ StatementsNode (location: (1,0)-(29,25))
66
├── flags: ∅
7-
└── body: (length: 8)
7+
└── body: (length: 9)
88
├── @ ForNode (location: (1,0)-(3,3))
99
│ ├── flags: newline
1010
│ ├── index:
@@ -270,64 +270,106 @@
270270
│ ├── in_keyword_loc: (21,14)-(21,16) = "in"
271271
│ ├── do_keyword_loc: ∅
272272
│ └── end_keyword_loc: (23,0)-(23,3) = "end"
273-
└── @ ForNode (location: (25,0)-(27,3))
273+
├── @ ForNode (location: (25,0)-(27,3))
274+
│ ├── flags: newline
275+
│ ├── index:
276+
│ │ @ MultiTargetNode (location: (25,4)-(25,17))
277+
│ │ ├── flags: ∅
278+
│ │ ├── lefts: (length: 1)
279+
│ │ │ └── @ MultiTargetNode (location: (25,4)-(25,10))
280+
│ │ │ ├── flags: ∅
281+
│ │ │ ├── lefts: (length: 2)
282+
│ │ │ │ ├── @ LocalVariableTargetNode (location: (25,5)-(25,6))
283+
│ │ │ │ │ ├── flags: ∅
284+
│ │ │ │ │ ├── name: :a
285+
│ │ │ │ │ └── depth: 0
286+
│ │ │ │ └── @ LocalVariableTargetNode (location: (25,8)-(25,9))
287+
│ │ │ │ ├── flags: ∅
288+
│ │ │ │ ├── name: :b
289+
│ │ │ │ └── depth: 0
290+
│ │ │ ├── rest: ∅
291+
│ │ │ ├── rights: (length: 0)
292+
│ │ │ ├── lparen_loc: (25,4)-(25,5) = "("
293+
│ │ │ └── rparen_loc: (25,9)-(25,10) = ")"
294+
│ │ ├── rest:
295+
│ │ │ @ SplatNode (location: (25,12)-(25,14))
296+
│ │ │ ├── flags: ∅
297+
│ │ │ ├── operator_loc: (25,12)-(25,13) = "*"
298+
│ │ │ └── expression:
299+
│ │ │ @ LocalVariableTargetNode (location: (25,13)-(25,14))
300+
│ │ │ ├── flags: ∅
301+
│ │ │ ├── name: :c
302+
│ │ │ └── depth: 0
303+
│ │ ├── rights: (length: 1)
304+
│ │ │ └── @ LocalVariableTargetNode (location: (25,16)-(25,17))
305+
│ │ │ ├── flags: ∅
306+
│ │ │ ├── name: :d
307+
│ │ │ └── depth: 0
308+
│ │ ├── lparen_loc: ∅
309+
│ │ └── rparen_loc: ∅
310+
│ ├── collection:
311+
│ │ @ RangeNode (location: (25,21)-(25,26))
312+
│ │ ├── flags: static_literal
313+
│ │ ├── left:
314+
│ │ │ @ IntegerNode (location: (25,21)-(25,22))
315+
│ │ │ ├── flags: static_literal, decimal
316+
│ │ │ └── value: 1
317+
│ │ ├── right:
318+
│ │ │ @ IntegerNode (location: (25,24)-(25,26))
319+
│ │ │ ├── flags: static_literal, decimal
320+
│ │ │ └── value: 10
321+
│ │ └── operator_loc: (25,22)-(25,24) = ".."
322+
│ ├── statements:
323+
│ │ @ StatementsNode (location: (26,0)-(26,1))
324+
│ │ ├── flags: ∅
325+
│ │ └── body: (length: 1)
326+
│ │ └── @ LocalVariableReadNode (location: (26,0)-(26,1))
327+
│ │ ├── flags: newline
328+
│ │ ├── name: :i
329+
│ │ └── depth: 0
330+
│ ├── for_keyword_loc: (25,0)-(25,3) = "for"
331+
│ ├── in_keyword_loc: (25,18)-(25,20) = "in"
332+
│ ├── do_keyword_loc: ∅
333+
│ └── end_keyword_loc: (27,0)-(27,3) = "end"
334+
└── @ ForNode (location: (29,0)-(29,25))
274335
├── flags: newline
275336
├── index:
276-
│ @ MultiTargetNode (location: (25,4)-(25,17))
337+
│ @ LocalVariableTargetNode (location: (29,4)-(29,5))
277338
│ ├── flags: ∅
278-
│ ├── lefts: (length: 1)
279-
│ │ └── @ MultiTargetNode (location: (25,4)-(25,10))
280-
│ │ ├── flags: ∅
281-
│ │ ├── lefts: (length: 2)
282-
│ │ │ ├── @ LocalVariableTargetNode (location: (25,5)-(25,6))
283-
│ │ │ │ ├── flags: ∅
284-
│ │ │ │ ├── name: :a
285-
│ │ │ │ └── depth: 0
286-
│ │ │ └── @ LocalVariableTargetNode (location: (25,8)-(25,9))
287-
│ │ │ ├── flags: ∅
288-
│ │ │ ├── name: :b
289-
│ │ │ └── depth: 0
290-
│ │ ├── rest: ∅
291-
│ │ ├── rights: (length: 0)
292-
│ │ ├── lparen_loc: (25,4)-(25,5) = "("
293-
│ │ └── rparen_loc: (25,9)-(25,10) = ")"
294-
│ ├── rest:
295-
│ │ @ SplatNode (location: (25,12)-(25,14))
296-
│ │ ├── flags: ∅
297-
│ │ ├── operator_loc: (25,12)-(25,13) = "*"
298-
│ │ └── expression:
299-
│ │ @ LocalVariableTargetNode (location: (25,13)-(25,14))
300-
│ │ ├── flags: ∅
301-
│ │ ├── name: :c
302-
│ │ └── depth: 0
303-
│ ├── rights: (length: 1)
304-
│ │ └── @ LocalVariableTargetNode (location: (25,16)-(25,17))
305-
│ │ ├── flags: ∅
306-
│ │ ├── name: :d
307-
│ │ └── depth: 0
308-
│ ├── lparen_loc: ∅
309-
│ └── rparen_loc: ∅
339+
│ ├── name: :x
340+
│ └── depth: 0
310341
├── collection:
311-
│ @ RangeNode (location: (25,21)-(25,26))
312-
│ ├── flags: static_literal
313-
│ ├── left:
314-
│ │ @ IntegerNode (location: (25,21)-(25,22))
315-
│ │ ├── flags: static_literal, decimal
316-
│ │ └── value: 1
317-
│ ├── right:
318-
│ │ @ IntegerNode (location: (25,24)-(25,26))
319-
│ │ ├── flags: static_literal, decimal
320-
│ │ └── value: 10
321-
│ └── operator_loc: (25,22)-(25,24) = ".."
342+
│ @ MatchPredicateNode (location: (29,9)-(29,16))
343+
│ ├── flags: ∅
344+
│ ├── value:
345+
│ │ @ LocalVariableReadNode (location: (29,9)-(29,10))
346+
│ │ ├── flags: ∅
347+
│ │ ├── name: :a
348+
│ │ └── depth: 0
349+
│ ├── pattern:
350+
│ │ @ ArrayPatternNode (location: (29,14)-(29,16))
351+
│ │ ├── flags: ∅
352+
│ │ ├── constant: ∅
353+
│ │ ├── requireds: (length: 1)
354+
│ │ │ └── @ LocalVariableTargetNode (location: (29,14)-(29,15))
355+
│ │ │ ├── flags: ∅
356+
│ │ │ ├── name: :b
357+
│ │ │ └── depth: 0
358+
│ │ ├── rest:
359+
│ │ │ @ ImplicitRestNode (location: (29,15)-(29,16))
360+
│ │ │ └── flags: ∅
361+
│ │ ├── posts: (length: 0)
362+
│ │ ├── opening_loc: ∅
363+
│ │ └── closing_loc: ∅
364+
│ └── operator_loc: (29,11)-(29,13) = "in"
322365
├── statements:
323-
│ @ StatementsNode (location: (26,0)-(26,1))
366+
│ @ StatementsNode (location: (29,20)-(29,21))
324367
│ ├── flags: ∅
325368
│ └── body: (length: 1)
326-
│ └── @ LocalVariableReadNode (location: (26,0)-(26,1))
327-
│ ├── flags: newline
328-
│ ├── name: :i
329-
│ └── depth: 0
330-
├── for_keyword_loc: (25,0)-(25,3) = "for"
331-
├── in_keyword_loc: (25,18)-(25,20) = "in"
332-
├── do_keyword_loc: ∅
333-
└── end_keyword_loc: (27,0)-(27,3) = "end"
369+
│ └── @ IntegerNode (location: (29,20)-(29,21))
370+
│ ├── flags: newline, static_literal, decimal
371+
│ └── value: 1
372+
├── for_keyword_loc: (29,0)-(29,3) = "for"
373+
├── in_keyword_loc: (29,6)-(29,8) = "in"
374+
├── do_keyword_loc: (29,17)-(29,19) = "do"
375+
└── end_keyword_loc: (29,22)-(29,25) = "end"

snapshots/until.txt

Lines changed: 71 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
@ ProgramNode (location: (1,0)-(13,20))
1+
@ ProgramNode (location: (1,0)-(15,22))
22
├── flags: ∅
3-
├── locals: [:baz]
3+
├── locals: [:baz, :b]
44
└── statements:
5-
@ StatementsNode (location: (1,0)-(13,20))
5+
@ StatementsNode (location: (1,0)-(15,22))
66
├── flags: ∅
7-
└── body: (length: 7)
7+
└── body: (length: 8)
88
├── @ UntilNode (location: (1,0)-(1,18))
99
│ ├── flags: newline
1010
│ ├── keyword_loc: (1,0)-(1,5) = "until"
@@ -172,44 +172,87 @@
172172
│ ├── closing_loc: ∅
173173
│ ├── equal_loc: ∅
174174
│ └── block: ∅
175-
└── @ WhileNode (location: (13,0)-(13,20))
175+
├── @ WhileNode (location: (13,0)-(13,20))
176+
│ ├── flags: newline
177+
│ ├── keyword_loc: (13,4)-(13,9) = "while"
178+
│ ├── do_keyword_loc: ∅
179+
│ ├── closing_loc: ∅
180+
│ ├── predicate:
181+
│ │ @ MatchPredicateNode (location: (13,10)-(13,20))
182+
│ │ ├── flags: ∅
183+
│ │ ├── value:
184+
│ │ │ @ CallNode (location: (13,10)-(13,13))
185+
│ │ │ ├── flags: variable_call, ignore_visibility
186+
│ │ │ ├── receiver: ∅
187+
│ │ │ ├── call_operator_loc: ∅
188+
│ │ │ ├── name: :bar
189+
│ │ │ ├── message_loc: (13,10)-(13,13) = "bar"
190+
│ │ │ ├── opening_loc: ∅
191+
│ │ │ ├── arguments: ∅
192+
│ │ │ ├── closing_loc: ∅
193+
│ │ │ ├── equal_loc: ∅
194+
│ │ │ └── block: ∅
195+
│ │ ├── pattern:
196+
│ │ │ @ LocalVariableTargetNode (location: (13,17)-(13,20))
197+
│ │ │ ├── flags: ∅
198+
│ │ │ ├── name: :baz
199+
│ │ │ └── depth: 0
200+
│ │ └── operator_loc: (13,14)-(13,16) = "in"
201+
│ └── statements:
202+
│ @ StatementsNode (location: (13,0)-(13,3))
203+
│ ├── flags: ∅
204+
│ └── body: (length: 1)
205+
│ └── @ CallNode (location: (13,0)-(13,3))
206+
│ ├── flags: newline, variable_call, ignore_visibility
207+
│ ├── receiver: ∅
208+
│ ├── call_operator_loc: ∅
209+
│ ├── name: :foo
210+
│ ├── message_loc: (13,0)-(13,3) = "foo"
211+
│ ├── opening_loc: ∅
212+
│ ├── arguments: ∅
213+
│ ├── closing_loc: ∅
214+
│ ├── equal_loc: ∅
215+
│ └── block: ∅
216+
└── @ UntilNode (location: (15,0)-(15,22))
176217
├── flags: newline
177-
├── keyword_loc: (13,4)-(13,9) = "while"
178-
├── do_keyword_loc:
179-
├── closing_loc:
218+
├── keyword_loc: (15,0)-(15,5) = "until"
219+
├── do_keyword_loc: (15,14)-(15,16) = "do"
220+
├── closing_loc: (15,19)-(15,22) = "end"
180221
├── predicate:
181-
│ @ MatchPredicateNode (location: (13,10)-(13,20))
222+
│ @ MatchPredicateNode (location: (15,6)-(15,13))
182223
│ ├── flags: ∅
183224
│ ├── value:
184-
│ │ @ CallNode (location: (13,10)-(13,13))
225+
│ │ @ CallNode (location: (15,6)-(15,7))
185226
│ │ ├── flags: variable_call, ignore_visibility
186227
│ │ ├── receiver: ∅
187228
│ │ ├── call_operator_loc: ∅
188-
│ │ ├── name: :bar
189-
│ │ ├── message_loc: (13,10)-(13,13) = "bar"
229+
│ │ ├── name: :a
230+
│ │ ├── message_loc: (15,6)-(15,7) = "a"
190231
│ │ ├── opening_loc: ∅
191232
│ │ ├── arguments: ∅
192233
│ │ ├── closing_loc: ∅
193234
│ │ ├── equal_loc: ∅
194235
│ │ └── block: ∅
195236
│ ├── pattern:
196-
│ │ @ LocalVariableTargetNode (location: (13,17)-(13,20))
237+
│ │ @ ArrayPatternNode (location: (15,11)-(15,13))
197238
│ │ ├── flags: ∅
198-
│ │ ├── name: :baz
199-
│ │ └── depth: 0
200-
│ └── operator_loc: (13,14)-(13,16) = "in"
239+
│ │ ├── constant: ∅
240+
│ │ ├── requireds: (length: 1)
241+
│ │ │ └── @ LocalVariableTargetNode (location: (15,11)-(15,12))
242+
│ │ │ ├── flags: ∅
243+
│ │ │ ├── name: :b
244+
│ │ │ └── depth: 0
245+
│ │ ├── rest:
246+
│ │ │ @ ImplicitRestNode (location: (15,12)-(15,13))
247+
│ │ │ └── flags: ∅
248+
│ │ ├── posts: (length: 0)
249+
│ │ ├── opening_loc: ∅
250+
│ │ └── closing_loc: ∅
251+
│ └── operator_loc: (15,8)-(15,10) = "in"
201252
└── statements:
202-
@ StatementsNode (location: (13,0)-(13,3))
253+
@ StatementsNode (location: (15,17)-(15,18))
203254
├── flags: ∅
204255
└── body: (length: 1)
205-
└── @ CallNode (location: (13,0)-(13,3))
206-
├── flags: newline, variable_call, ignore_visibility
207-
├── receiver: ∅
208-
├── call_operator_loc: ∅
209-
├── name: :foo
210-
├── message_loc: (13,0)-(13,3) = "foo"
211-
├── opening_loc: ∅
212-
├── arguments: ∅
213-
├── closing_loc: ∅
214-
├── equal_loc: ∅
215-
└── block: ∅
256+
└── @ IntegerNode (location: (15,17)-(15,18))
257+
├── flags: newline, static_literal, decimal
258+
└── value: 1

0 commit comments

Comments
 (0)