From a329d63f7db541c5a056f572dbbc8b8b57b5f5c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 May 2025 08:49:20 +0200 Subject: [PATCH] fix(tree-sitter): discard COMMIT recipe argument on <=30.x Otherwise `treesit--install-language-grammar-1` will throw an arity error on Emacs <=30.x when installing grammars. Fix: #8393 --- .../tools/tree-sitter/autoload/tree-sitter.el | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/modules/tools/tree-sitter/autoload/tree-sitter.el b/modules/tools/tree-sitter/autoload/tree-sitter.el index 1797c56e4..93680a06c 100644 --- a/modules/tools/tree-sitter/autoload/tree-sitter.el +++ b/modules/tools/tree-sitter/autoload/tree-sitter.el @@ -5,16 +5,21 @@ (message "Old tree-sitter.el support is deprecated!")) ;;;###autodef (fset 'set-tree-sitter! #'ignore) -(defun set-tree-sitter! (mode ts-mode &optional langs) +(defun set-tree-sitter! (mode ts-mode &optional recipes) "Remap major MODE to TS-MODE. -MODE and TS-MODE are major mode symbols. If LANGS is provided, fall back to MODE -if LANGS don't pass `treesit-ready-p' when activating TS-MODE. Use this for ts -modes that error out instead of failing gracefully." +MODE and TS-MODE are major mode symbols. If RECIPES is provided, fall back to +MODE if RECIPES don't pass `treesit-ready-p' when activating TS-MODE. Use this +for ts modes that error out instead of failing gracefully. + +RECIPES are an alist of plists with the format (LANG &key URL REV SOURCE-DIR CC +CPP COMMIT), which will be transformed into entries for +`treesit-language-source-alist' (which descrie what each of these keys mean). +Note that COMMIT is only available in Emacs >=31." (declare (indent 2)) (cl-check-type mode symbol) (cl-check-type ts-mode symbol) - (setq langs (ensure-list langs)) + (setq recipes (ensure-list recipes)) (dolist (m (ensure-list mode)) (add-to-list 'major-mode-remap-defaults @@ -24,7 +29,7 @@ modes that error out instead of failing gracefully." (funcall ;; Because standard major-mode remapping doesn't offer graceful ;; failure in some cases, I implement it myself: - (cond ((null langs) m) + (cond ((null recipes) m) ((not (fboundp ts-mode)) (message "Couldn't find %S, using %S instead" ts-mode m) m) @@ -35,19 +40,25 @@ modes that error out instead of failing gracefully." (cl-every (if ensured? (doom-rpartial #'treesit-ready-p 'message) #'treesit-ensure-installed) - (cl-loop for lang in langs - if (listp lang) - collect (car lang) - else collect (list lang)))) + (cl-loop for r in recipes + if (listp r) + collect (car r) + else collect (list r)))) ts-mode) ((setq ensured? t) m)))))))) (with-eval-after-load 'treesit - (dolist (lang langs) - (when (and lang (listp lang)) - (cl-destructuring-bind (name &key url rev source-dir cc cpp commit) lang - (setf (alist-get name treesit-language-source-alist) - (list url rev source-dir cc cpp commit))))))) + (dolist (recipe recipes) + (cl-destructuring-bind (name &key url rev source-dir cc cpp commit) + (ensure-list recipe) + (setf (alist-get name treesit-language-source-alist) + (append (list url rev source-dir cc cpp) + ;; COMPAT: 31.1 introduced a COMMIT recipe argument. On + ;; <=30.x, extra arguments will trigger an arity error + ;; when installing grammars. + (if (eq (cdr (func-arity 'treesit--install-language-grammar-1)) + 'many) + (list commit)))))))) ;; ;; HACK: Remove and refactor when `use-package' eager macro expansion is solved or `use-package!' is removed ;; ;;;###autoload