diff options
Diffstat (limited to 'lisp')
| -rw-r--r-- | lisp/treesit.el | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/lisp/treesit.el b/lisp/treesit.el index 96222ed81cb..fab2ddd88e6 100644 --- a/lisp/treesit.el +++ b/lisp/treesit.el | |||
| @@ -655,37 +655,47 @@ those inside are kept." | |||
| 655 | if (<= start (car range) (cdr range) end) | 655 | if (<= start (car range) (cdr range) end) |
| 656 | collect range)) | 656 | collect range)) |
| 657 | 657 | ||
| 658 | (defun treesit-local-parsers-at (&optional pos language) | 658 | (defun treesit-local-parsers-at (&optional pos language with-host) |
| 659 | "Return all the local parsers at POS. | 659 | "Return all the local parsers at POS. |
| 660 | 660 | ||
| 661 | POS defaults to point. | 661 | POS defaults to point. |
| 662 | Local parsers are those which only parse a limited region marked | 662 | Local parsers are those which only parse a limited region marked |
| 663 | by an overlay with non-nil `treesit-parser' property. | 663 | by an overlay with non-nil `treesit-parser' property. |
| 664 | If LANGUAGE is non-nil, only return parsers for LANGUAGE." | 664 | If LANGUAGE is non-nil, only return parsers for LANGUAGE. |
| 665 | |||
| 666 | If WITH-HOST is non-nil, return a list of (PARSER . HOST-PARSER) | ||
| 667 | instead. HOST-PARSER is the host parser which created the local | ||
| 668 | PARSER." | ||
| 665 | (let ((res nil)) | 669 | (let ((res nil)) |
| 666 | (dolist (ov (overlays-at (or pos (point)))) | 670 | (dolist (ov (overlays-at (or pos (point)))) |
| 667 | (when-let ((parser (overlay-get ov 'treesit-parser))) | 671 | (when-let ((parser (overlay-get ov 'treesit-parser)) |
| 672 | (host-parser (overlay-get ov 'treesit-host-parser))) | ||
| 668 | (when (or (null language) | 673 | (when (or (null language) |
| 669 | (eq (treesit-parser-language parser) | 674 | (eq (treesit-parser-language parser) |
| 670 | language)) | 675 | language)) |
| 671 | (push parser res)))) | 676 | (push (if with-host (cons parser host-parser) parser) res)))) |
| 672 | (nreverse res))) | 677 | (nreverse res))) |
| 673 | 678 | ||
| 674 | (defun treesit-local-parsers-on (&optional beg end language) | 679 | (defun treesit-local-parsers-on (&optional beg end language with-host) |
| 675 | "Return all the local parsers between BEG END. | 680 | "Return all the local parsers between BEG END. |
| 676 | 681 | ||
| 677 | BEG and END default to the beginning and end of the buffer's | 682 | BEG and END default to the beginning and end of the buffer's |
| 678 | accessible portion. | 683 | accessible portion. |
| 679 | Local parsers are those which have an `embedded' tag, and only parse | 684 | Local parsers are those which have an `embedded' tag, and only parse |
| 680 | a limited region marked by an overlay with a non-nil `treesit-parser' | 685 | a limited region marked by an overlay with a non-nil `treesit-parser' |
| 681 | property. If LANGUAGE is non-nil, only return parsers for LANGUAGE." | 686 | property. If LANGUAGE is non-nil, only return parsers for LANGUAGE. |
| 687 | |||
| 688 | If WITH-HOST is non-nil, return a list of (PARSER . HOST-PARSER) | ||
| 689 | instead. HOST-PARSER is the host parser which created the local | ||
| 690 | PARSER." | ||
| 682 | (let ((res nil)) | 691 | (let ((res nil)) |
| 683 | (dolist (ov (overlays-in (or beg (point-min)) (or end (point-max)))) | 692 | (dolist (ov (overlays-in (or beg (point-min)) (or end (point-max)))) |
| 684 | (when-let ((parser (overlay-get ov 'treesit-parser))) | 693 | (when-let ((parser (overlay-get ov 'treesit-parser)) |
| 694 | (host-parser (overlay-get ov 'treesit-host-parser))) | ||
| 685 | (when (or (null language) | 695 | (when (or (null language) |
| 686 | (eq (treesit-parser-language parser) | 696 | (eq (treesit-parser-language parser) |
| 687 | language)) | 697 | language)) |
| 688 | (push parser res)))) | 698 | (push (if with-host (cons parser host-parser) parser) res)))) |
| 689 | (nreverse res))) | 699 | (nreverse res))) |
| 690 | 700 | ||
| 691 | (defun treesit--update-ranges-local | 701 | (defun treesit--update-ranges-local |
| @@ -701,7 +711,8 @@ parser for EMBEDDED-LANG." | |||
| 701 | (treesit-parser-delete parser)))) | 711 | (treesit-parser-delete parser)))) |
| 702 | ;; Update range. | 712 | ;; Update range. |
| 703 | (let* ((host-lang (treesit-query-language query)) | 713 | (let* ((host-lang (treesit-query-language query)) |
| 704 | (ranges (treesit-query-range host-lang query beg end))) | 714 | (host-parser (treesit-parser-create host-lang)) |
| 715 | (ranges (treesit-query-range host-parser query beg end))) | ||
| 705 | (pcase-dolist (`(,beg . ,end) ranges) | 716 | (pcase-dolist (`(,beg . ,end) ranges) |
| 706 | (let ((has-parser nil)) | 717 | (let ((has-parser nil)) |
| 707 | (dolist (ov (overlays-in beg end)) | 718 | (dolist (ov (overlays-in beg end)) |
| @@ -719,6 +730,7 @@ parser for EMBEDDED-LANG." | |||
| 719 | embedded-lang nil t 'embedded)) | 730 | embedded-lang nil t 'embedded)) |
| 720 | (ov (make-overlay beg end nil nil t))) | 731 | (ov (make-overlay beg end nil nil t))) |
| 721 | (overlay-put ov 'treesit-parser embedded-parser) | 732 | (overlay-put ov 'treesit-parser embedded-parser) |
| 733 | (overlay-put ov 'treesit-host-parser host-parser) | ||
| 722 | (treesit-parser-set-included-ranges | 734 | (treesit-parser-set-included-ranges |
| 723 | embedded-parser `((,beg . ,end))))))))) | 735 | embedded-parser `((,beg . ,end))))))))) |
| 724 | 736 | ||
| @@ -1800,11 +1812,17 @@ Return (ANCHOR . OFFSET). This function is used by | |||
| 1800 | (forward-line 0) | 1812 | (forward-line 0) |
| 1801 | (skip-chars-forward " \t") | 1813 | (skip-chars-forward " \t") |
| 1802 | (point))) | 1814 | (point))) |
| 1803 | (local-parsers (treesit-local-parsers-at bol)) | 1815 | (local-parsers (treesit-local-parsers-at bol nil t)) |
| 1804 | (smallest-node | 1816 | (smallest-node |
| 1805 | (cond ((null (treesit-parser-list)) nil) | 1817 | (cond ((car local-parsers) |
| 1806 | (local-parsers (treesit-node-at | 1818 | (let ((local-parser (caar local-parsers)) |
| 1807 | bol (car local-parsers))) | 1819 | (host-parser (cdar local-parsers))) |
| 1820 | (if (eq (treesit-node-start | ||
| 1821 | (treesit-parser-root-node local-parser)) | ||
| 1822 | bol) | ||
| 1823 | (treesit-node-at bol host-parser) | ||
| 1824 | (treesit-node-at bol local-parser)))) | ||
| 1825 | ((null (treesit-parser-list)) nil) | ||
| 1808 | ((eq 1 (length (treesit-parser-list nil nil t))) | 1826 | ((eq 1 (length (treesit-parser-list nil nil t))) |
| 1809 | (treesit-node-at bol)) | 1827 | (treesit-node-at bol)) |
| 1810 | ((treesit-language-at bol) | 1828 | ((treesit-language-at bol) |