Commit f0833c3
authored
Fix bracket/brace map corruption from Ruby 3.0+ pattern matching deconstruction (#1671)
# Description
In Ruby 3.0+ pattern matching, bracket-based and braced patterns fire
scanner events for their delimiters but do not fire the same parser
events as ordinary array indexing or hash literals. YARD had no handlers
for these pattern-match parser events, so entries were pushed to the
bracket/brace maps but never consumed. Since those maps are read
FIFO/LIFO by later expressions, the stale entries produced garbled
source ranges on the next array indexing or hash literal after a pattern
match.
Three event handlers are added:
- **`on_aryptn`**: Array patterns (`Bar['key', v]`, `Bar[a, b]`, bare
`[a, b]`) fire `on_aryptn` instead of `on_aref`. The handler pops from
`@map[:lbracket]` and shifts from `@map[:aref]`, mirroring what
`on_aref` would have done.
- **`on_fndptn`**: Find patterns (`Bar[*, v, *]`) fire `on_fndptn`
instead of `on_aref`. Same bracket map cleanup.
- **`on_hshptn`**: Braced hash patterns (`{ key: val }`) fire
`on_hshptn` instead of `on_hash`, leaving a stale entry in
`@map[:lbrace]`. To distinguish braced patterns from bare hash patterns
(`key: val`, which fire no brace scanner events), `on_rbrace` is
overridden to track closing brace positions in `@map[:rbrace]`.
`on_hshptn` cleans up both maps only when `@map[:rbrace]` confirms a
closing brace was scanned, using `||=` guards on both map accesses for
consistency with the rest of the map handling code. `visit_event` is
updated to drain `@map[:rbrace]` when consuming a `@map[:lbrace]` entry,
keeping the maps in sync for normal hash literals and brace blocks
(including the case where a braced pattern appears inside a brace
block).
Fixes #1547
# Completed Tasks
- [x] I have read the [Contributing Guide][contrib].
- [x] The pull request is complete (implemented / written).
- [x] Git commits have been cleaned up (squash WIP / revert commits).
- [x] I wrote tests and ran `bundle exec rake` locally (if code is
attached to PR).
[contrib]: https://github.com/lsegal/yard/blob/main/CONTRIBUTING.md
-----------------
# Description
Describe your pull request and problem statement here.
# Completed Tasks
- [ ] I have read the [Contributing Guide][contrib].
- [ ] The pull request is complete (implemented / written).
- [ ] Git commits have been cleaned up (squash WIP / revert commits).
- [ ] I wrote tests and ran `bundle exec rake` locally (if code is
attached to PR).
[contrib]: https://github.com/lsegal/yard/blob/main/CONTRIBUTING.md2 files changed
Lines changed: 199 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
244 | 244 | | |
245 | 245 | | |
246 | 246 | | |
| 247 | + | |
247 | 248 | | |
248 | 249 | | |
249 | 250 | | |
| |||
336 | 337 | | |
337 | 338 | | |
338 | 339 | | |
| 340 | + | |
339 | 341 | | |
340 | 342 | | |
341 | 343 | | |
| |||
371 | 373 | | |
372 | 374 | | |
373 | 375 | | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
374 | 390 | | |
375 | 391 | | |
376 | 392 | | |
| |||
422 | 438 | | |
423 | 439 | | |
424 | 440 | | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
425 | 462 | | |
426 | 463 | | |
427 | 464 | | |
| |||
432 | 469 | | |
433 | 470 | | |
434 | 471 | | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
435 | 479 | | |
436 | 480 | | |
437 | 481 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
679 | 679 | | |
680 | 680 | | |
681 | 681 | | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
| 685 | + | |
| 686 | + | |
| 687 | + | |
| 688 | + | |
| 689 | + | |
| 690 | + | |
| 691 | + | |
| 692 | + | |
| 693 | + | |
| 694 | + | |
| 695 | + | |
| 696 | + | |
| 697 | + | |
| 698 | + | |
| 699 | + | |
| 700 | + | |
| 701 | + | |
| 702 | + | |
| 703 | + | |
| 704 | + | |
| 705 | + | |
| 706 | + | |
| 707 | + | |
| 708 | + | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
| 727 | + | |
| 728 | + | |
| 729 | + | |
| 730 | + | |
| 731 | + | |
| 732 | + | |
| 733 | + | |
| 734 | + | |
| 735 | + | |
| 736 | + | |
| 737 | + | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + | |
| 742 | + | |
| 743 | + | |
| 744 | + | |
| 745 | + | |
| 746 | + | |
| 747 | + | |
| 748 | + | |
| 749 | + | |
| 750 | + | |
| 751 | + | |
| 752 | + | |
| 753 | + | |
| 754 | + | |
| 755 | + | |
| 756 | + | |
| 757 | + | |
| 758 | + | |
| 759 | + | |
| 760 | + | |
| 761 | + | |
| 762 | + | |
| 763 | + | |
| 764 | + | |
| 765 | + | |
| 766 | + | |
| 767 | + | |
| 768 | + | |
| 769 | + | |
| 770 | + | |
| 771 | + | |
| 772 | + | |
| 773 | + | |
| 774 | + | |
| 775 | + | |
| 776 | + | |
| 777 | + | |
| 778 | + | |
| 779 | + | |
| 780 | + | |
| 781 | + | |
| 782 | + | |
| 783 | + | |
| 784 | + | |
| 785 | + | |
| 786 | + | |
| 787 | + | |
| 788 | + | |
| 789 | + | |
| 790 | + | |
| 791 | + | |
| 792 | + | |
| 793 | + | |
| 794 | + | |
| 795 | + | |
| 796 | + | |
| 797 | + | |
| 798 | + | |
| 799 | + | |
| 800 | + | |
| 801 | + | |
| 802 | + | |
| 803 | + | |
| 804 | + | |
| 805 | + | |
| 806 | + | |
| 807 | + | |
| 808 | + | |
| 809 | + | |
| 810 | + | |
| 811 | + | |
| 812 | + | |
| 813 | + | |
| 814 | + | |
| 815 | + | |
| 816 | + | |
| 817 | + | |
| 818 | + | |
| 819 | + | |
| 820 | + | |
| 821 | + | |
| 822 | + | |
| 823 | + | |
| 824 | + | |
| 825 | + | |
| 826 | + | |
| 827 | + | |
| 828 | + | |
| 829 | + | |
| 830 | + | |
| 831 | + | |
| 832 | + | |
| 833 | + | |
| 834 | + | |
| 835 | + | |
| 836 | + | |
682 | 837 | | |
683 | 838 | | |
684 | 839 | | |
| |||
0 commit comments