diff --git a/admin/notes/tree-sitter/build-module/build.sh b/admin/notes/tree-sitter/build-module/build.sh index 4f3c6da3c5f..0cece86e5f7 100755 --- a/admin/notes/tree-sitter/build-module/build.sh +++ b/admin/notes/tree-sitter/build-module/build.sh @@ -59,8 +59,11 @@ case "${lang}" in sourcedir="tree-sitter-typescript/tsx/src" grammardir="tree-sitter-typescript/tsx" ;; + "toml") + org="tree-sitter-grammars" + ;; "yaml") - org="ikatyang" + org="tree-sitter-grammars" ;; esac diff --git a/admin/tree-sitter/treesit-admin.el b/admin/tree-sitter/treesit-admin.el index 86174ed2625..ef6d256a538 100644 --- a/admin/tree-sitter/treesit-admin.el +++ b/admin/tree-sitter/treesit-admin.el @@ -72,31 +72,33 @@ ;;; Query validation (defvar treesit-admin--builtin-language-sources - '((c "https://github.com/tree-sitter/tree-sitter-c") - (cpp "https://github.com/tree-sitter/tree-sitter-cpp") - (cmake "https://github.com/uyha/tree-sitter-cmake") - (dockerfile "https://github.com/camdencheek/tree-sitter-dockerfile") - (go "https://github.com/tree-sitter/tree-sitter-go") - (ruby "https://github.com/tree-sitter/tree-sitter-ruby") - (javascript "https://github.com/tree-sitter/tree-sitter-javascript") + '((c "https://github.com/tree-sitter/tree-sitter-c" "v0.23.4") + (cpp "https://github.com/tree-sitter/tree-sitter-cpp" "v0.23.4") + (cmake "https://github.com/uyha/tree-sitter-cmake" "v0.5.0") + (dockerfile "https://github.com/camdencheek/tree-sitter-dockerfile" "v0.2.0") + (go "https://github.com/tree-sitter/tree-sitter-go" "v0.23.4") + (ruby "https://github.com/tree-sitter/tree-sitter-ruby" "v0.23.1") + (javascript "https://github.com/tree-sitter/tree-sitter-javascript" "v0.23.1") (typescript "https://github.com/tree-sitter/tree-sitter-typescript" - nil "typescript/src") + "v0.23.2" "typescript/src") (tsx "https://github.com/tree-sitter/tree-sitter-typescript" - nil "tsx/src") - (json "https://github.com/tree-sitter/tree-sitter-json") - (rust "https://github.com/tree-sitter/tree-sitter-rust") + "v0.23.2" "tsx/src") + (json "https://github.com/tree-sitter/tree-sitter-json" "v0.24.8") + (rust "https://github.com/tree-sitter/tree-sitter-rust" "v0.23.2") (php "https://github.com/tree-sitter/tree-sitter-php" - nil "php/src") - (css "https://github.com/tree-sitter/tree-sitter-css") + "v0.23.11" "php/src") + (css "https://github.com/tree-sitter/tree-sitter-css" "v0.23.1") (phpdoc "https://github.com/claytonrcarter/tree-sitter-phpdoc") - (doxygen "https://github.com/tree-sitter-grammars/tree-sitter-doxygen") - (lua "https://github.com/tree-sitter-grammars/tree-sitter-lua") - (python "https://github.com/tree-sitter/tree-sitter-python") - (html "https://github.com/tree-sitter/tree-sitter-html") - (elixir "https://github.com/elixir-lang/tree-sitter-elixir") - (heex "https://github.com/phoenixframework/tree-sitter-heex") - (java "https://github.com/tree-sitter/tree-sitter-java") - (jsdoc "https://github.com/tree-sitter/tree-sitter-jsdoc")) + (doxygen "https://github.com/tree-sitter-grammars/tree-sitter-doxygen" "v1.1.0") + (lua "https://github.com/tree-sitter-grammars/tree-sitter-lua" "v0.3.0") + (python "https://github.com/tree-sitter/tree-sitter-python" "v0.23.6") + (html "https://github.com/tree-sitter/tree-sitter-html" "v0.23.2") + (elixir "https://github.com/elixir-lang/tree-sitter-elixir" "v0.3.3") + (heex "https://github.com/phoenixframework/tree-sitter-heex" "v0.7.0") + (java "https://github.com/tree-sitter/tree-sitter-java" "v0.23.5") + (jsdoc "https://github.com/tree-sitter/tree-sitter-jsdoc" "v0.23.2") + (toml "https://github.com/tree-sitter-grammars/tree-sitter-toml" "v0.7.0") + (yaml "https://github.com/tree-sitter-grammars/tree-sitter-yaml" "v0.7.0")) "A list of sources for the builtin modes. The source information are in the format of `treesit-language-source-alist'. This is for development only.") diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el index a9af2eb679a..fd255d68a57 100644 --- a/lisp/progmodes/c-ts-mode.el +++ b/lisp/progmodes/c-ts-mode.el @@ -86,6 +86,19 @@ (eval-when-compile (require 'rx)) (treesit-declare-unavailable-functions) +(add-to-list + 'treesit-language-source-alist + '(c "https://github.com/tree-sitter/tree-sitter-c" "v0.23.4") + t) +(add-to-list + 'treesit-language-source-alist + '(cpp "https://github.com/tree-sitter/tree-sitter-cpp" "v0.23.4") + t) +(add-to-list + 'treesit-language-source-alist + '(doxygen "https://github.com/tree-sitter-grammars/tree-sitter-doxygen" "v1.1.0") + t) + ;;; Custom variables (defcustom c-ts-mode-indent-offset 2 @@ -1460,7 +1473,7 @@ in your init files." :group 'c :after-hook (c-ts-mode-set-modeline) - (when (treesit-ready-p 'c) + (when (treesit-ensure-installed 'c) ;; Create an "for-each" parser, see `c-ts-mode--emacs-set-ranges' ;; for more. (when c-ts-mode-emacs-sources-support @@ -1495,7 +1508,8 @@ in your init files." (treesit-font-lock-recompute-features '(emacs-devel))) ;; Inject doxygen parser for comment. - (when (and c-ts-mode-enable-doxygen (treesit-ready-p 'doxygen t)) + (when (and c-ts-mode-enable-doxygen + (treesit-ensure-installed 'doxygen)) (setq-local treesit-primary-parser primary-parser) (setq-local treesit-font-lock-settings (append @@ -1535,7 +1549,7 @@ recommended to enable `electric-pair-mode' with this mode." :group 'c++ :after-hook (c-ts-mode-set-modeline) - (when (treesit-ready-p 'cpp) + (when (treesit-ensure-installed 'cpp) (let ((primary-parser (treesit-parser-create 'cpp))) ;; Syntax. @@ -1557,7 +1571,8 @@ recommended to enable `electric-pair-mode' with this mode." #'c-ts-mode--emacs-current-defun-name)) ;; Inject doxygen parser for comment. - (when (and c-ts-mode-enable-doxygen (treesit-ready-p 'doxygen t)) + (when (and c-ts-mode-enable-doxygen + (treesit-ensure-installed 'doxygen)) (setq-local treesit-primary-parser primary-parser) (setq-local treesit-font-lock-settings (append @@ -1670,9 +1685,6 @@ the code is C or C++, and based on that chooses whether to enable (assq-delete-all 'c-or-c++-mode major-mode-remap-defaults)) (add-to-list 'major-mode-remap-defaults '(c-or-c++-mode . c-or-c++-ts-mode))) -(when (and c-ts-mode-enable-doxygen (not (treesit-ready-p 'doxygen t))) - (message "Doxygen syntax highlighting can't be enabled, please install the language grammar.")) - (provide 'c-ts-mode) (provide 'c++-ts-mode) diff --git a/lisp/progmodes/cmake-ts-mode.el b/lisp/progmodes/cmake-ts-mode.el index 0f449f1d626..d5008fcc102 100644 --- a/lisp/progmodes/cmake-ts-mode.el +++ b/lisp/progmodes/cmake-ts-mode.el @@ -40,6 +40,11 @@ (eval-when-compile (require 'rx)) (treesit-declare-unavailable-functions) +(add-to-list + 'treesit-language-source-alist + '(cmake "https://github.com/uyha/tree-sitter-cmake" "v0.5.0") + t) + (defcustom cmake-ts-mode-indent-offset 2 "Number of spaces for each indentation step in `cmake-ts-mode'." :version "29.1" @@ -212,7 +217,7 @@ Return nil if there is no name or if NODE is not a defun node." :group 'cmake :syntax-table cmake-ts-mode--syntax-table - (when (treesit-ready-p 'cmake) + (when (treesit-ensure-installed 'cmake) (setq treesit-primary-parser (treesit-parser-create 'cmake)) ;; Comments. diff --git a/lisp/progmodes/csharp-mode.el b/lisp/progmodes/csharp-mode.el index 5e9b8d680eb..fe2fbb0d1e5 100644 --- a/lisp/progmodes/csharp-mode.el +++ b/lisp/progmodes/csharp-mode.el @@ -649,6 +649,11 @@ compilation and evaluation time conflicts." ;;; Tree-sitter support +(add-to-list + 'treesit-language-source-alist + '(c-sharp "https://github.com/tree-sitter/tree-sitter-c-sharp" "v0.23.1") + t) + (defcustom csharp-ts-mode-indent-offset 4 "Number of spaces for each indentation step in `csharp-ts-mode'." :type 'integer @@ -1056,7 +1061,7 @@ Key bindings: "Major mode for editing C# code." :syntax-table (csharp--make-mode-syntax-table) - (unless (treesit-ready-p 'c-sharp) + (unless (treesit-ensure-installed 'c-sharp) (error "Tree-sitter for C# isn't available")) ;; Tree-sitter. diff --git a/lisp/progmodes/dockerfile-ts-mode.el b/lisp/progmodes/dockerfile-ts-mode.el index 016bb2f7272..5dcc5704c34 100644 --- a/lisp/progmodes/dockerfile-ts-mode.el +++ b/lisp/progmodes/dockerfile-ts-mode.el @@ -40,6 +40,11 @@ (eval-when-compile (require 'rx)) (treesit-declare-unavailable-functions) +(add-to-list + 'treesit-language-source-alist + '(dockerfile "https://github.com/camdencheek/tree-sitter-dockerfile" "v0.2.0") + t) + (defvar dockerfile-ts-mode--syntax-table (let ((table (make-syntax-table))) (modify-syntax-entry ?# "<" table) @@ -161,7 +166,7 @@ Return nil if there is no name or if NODE is not a stage node." :group 'dockerfile :syntax-table dockerfile-ts-mode--syntax-table - (when (treesit-ready-p 'dockerfile) + (when (treesit-ensure-installed 'dockerfile) (setq treesit-primary-parser (treesit-parser-create 'dockerfile)) ;; Comments. diff --git a/lisp/progmodes/elixir-ts-mode.el b/lisp/progmodes/elixir-ts-mode.el index 8358ffdc63a..2a0a388a4e4 100644 --- a/lisp/progmodes/elixir-ts-mode.el +++ b/lisp/progmodes/elixir-ts-mode.el @@ -57,6 +57,15 @@ (eval-when-compile (require 'rx)) (treesit-declare-unavailable-functions) +(add-to-list + 'treesit-language-source-alist + '(elixir "https://github.com/elixir-lang/tree-sitter-elixir" "v0.3.3") + t) +(add-to-list + 'treesit-language-source-alist + '(heex "https://github.com/phoenixframework/tree-sitter-heex" "v0.7.0") + t) + (defgroup elixir-ts nil "Major mode for editing Elixir code." :prefix "elixir-ts-" @@ -667,11 +676,11 @@ Return nil if NODE is not a defun node or doesn't have a name." (add-hook 'post-self-insert-hook #'elixir-ts--electric-pair-string-delimiter 'append t) - (when (treesit-ready-p 'elixir) + (when (treesit-ensure-installed 'elixir) ;; The HEEx parser has to be created first for elixir to ensure elixir ;; is the first language when looking for treesit ranges. ;; (In Emacs 31 this requirement is removed.) - (when (treesit-ready-p 'heex) + (when (treesit-ensure-installed 'heex) ;; Require heex-ts-mode only when we load elixir-ts-mode ;; so that we don't get a tree-sitter compilation warning for ;; elixir-ts-mode. @@ -737,7 +746,7 @@ Return nil if NODE is not a defun node or doesn't have a name." (setq-local treesit-defun-name-function #'elixir-ts--defun-name) ;; Embedded Heex. - (when (treesit-ready-p 'heex) + (when (treesit-ensure-installed 'heex) (setq-local treesit-range-settings elixir-ts--treesit-range-rules) (setq-local treesit-font-lock-settings diff --git a/lisp/progmodes/go-ts-mode.el b/lisp/progmodes/go-ts-mode.el index 16150e7531b..e1736fe9208 100644 --- a/lisp/progmodes/go-ts-mode.el +++ b/lisp/progmodes/go-ts-mode.el @@ -46,6 +46,19 @@ (eval-when-compile (require 'rx)) (treesit-declare-unavailable-functions) +(add-to-list + 'treesit-language-source-alist + '(go "https://github.com/tree-sitter/tree-sitter-go" "v0.23.4") + t) +(add-to-list + 'treesit-language-source-alist + '(gomod "https://github.com/camdencheek/tree-sitter-go-mod" "v1.1.0") + t) +(add-to-list + 'treesit-language-source-alist + '(gowork "https://github.com/omertuc/tree-sitter-go-work") + t) + (defcustom go-ts-mode-indent-offset 8 "Number of spaces for each indentation step in `go-ts-mode'." :version "29.1" @@ -277,7 +290,7 @@ :group 'go :syntax-table go-ts-mode--syntax-table - (when (treesit-ready-p 'go) + (when (treesit-ensure-installed 'go) (setq treesit-primary-parser (treesit-parser-create 'go)) ;; Comments. @@ -584,7 +597,7 @@ what the parent of the node would be if it were a node." :group 'go :syntax-table go-mod-ts-mode--syntax-table - (when (treesit-ready-p 'gomod) + (when (treesit-ensure-installed 'gomod) (setq treesit-primary-parser (treesit-parser-create 'gomod)) ;; Comments. @@ -672,7 +685,7 @@ what the parent of the node would be if it were a node." "Major mode for editing go.work files, powered by tree-sitter." :group 'go - (when (treesit-ready-p 'gowork) + (when (treesit-ensure-installed 'gowork) (setq treesit-primary-parser (treesit-parser-create 'gowork)) ;; Comments. diff --git a/lisp/progmodes/heex-ts-mode.el b/lisp/progmodes/heex-ts-mode.el index 93b87d3a29d..38d75e69243 100644 --- a/lisp/progmodes/heex-ts-mode.el +++ b/lisp/progmodes/heex-ts-mode.el @@ -44,6 +44,15 @@ (eval-when-compile (require 'rx)) (treesit-declare-unavailable-functions) +(add-to-list + 'treesit-language-source-alist + '(heex "https://github.com/phoenixframework/tree-sitter-heex" "v0.7.0") + t) +(add-to-list + 'treesit-language-source-alist + '(elixir "https://github.com/elixir-lang/tree-sitter-elixir" "v0.3.3") + t) + (defgroup heex-ts nil "Major mode for editing HEEx code." :prefix "heex-ts-" @@ -162,7 +171,7 @@ Return nil if NODE is not a defun node or doesn't have a name." "Major mode for editing HEEx, powered by tree-sitter." :group 'heex-ts - (when (treesit-ready-p 'heex) + (when (treesit-ensure-installed 'heex) (setq treesit-primary-parser (treesit-parser-create 'heex)) ;; Comments diff --git a/lisp/progmodes/java-ts-mode.el b/lisp/progmodes/java-ts-mode.el index c1bd09dcb52..d48d6b45927 100644 --- a/lisp/progmodes/java-ts-mode.el +++ b/lisp/progmodes/java-ts-mode.el @@ -43,6 +43,15 @@ (require 'c-ts-common) ; For comment indent and filling. (treesit-declare-unavailable-functions) +(add-to-list + 'treesit-language-source-alist + '(java "https://github.com/tree-sitter/tree-sitter-java" "v0.23.5") + t) +(add-to-list + 'treesit-language-source-alist + '(doxygen "https://github.com/tree-sitter-grammars/tree-sitter-doxygen" "v1.1.0") + t) + (defcustom java-ts-mode-indent-offset 4 "Number of spaces for each indentation step in `java-ts-mode'." :version "29.1" @@ -385,7 +394,7 @@ Return nil if there is no name or if NODE is not a defun node." :group 'java :syntax-table java-ts-mode--syntax-table - (unless (treesit-ready-p 'java) + (unless (treesit-ensure-installed 'java) (error "Tree-sitter for Java isn't available")) (let ((primary-parser (treesit-parser-create 'java))) @@ -480,7 +489,8 @@ Return nil if there is no name or if NODE is not a defun node." java-ts-mode--font-lock-settings) ;; Inject doxygen parser for comment. - (when (and java-ts-mode-enable-doxygen (treesit-ready-p 'doxygen t)) + (when (and java-ts-mode-enable-doxygen + (treesit-ensure-installed 'doxygen)) (setq-local treesit-primary-parser primary-parser) (setq-local treesit-font-lock-settings (append treesit-font-lock-settings @@ -515,9 +525,6 @@ Return nil if there is no name or if NODE is not a defun node." (if (treesit-ready-p 'java) (add-to-list 'auto-mode-alist '("\\.java\\'" . java-ts-mode))) -(when (and java-ts-mode-enable-doxygen (not (treesit-ready-p 'doxygen t))) - (message "Doxygen syntax highlighting can't be enabled, please install the language grammar.")) - (provide 'java-ts-mode) ;;; java-ts-mode.el ends here diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el index beda6737d41..243329de7ae 100644 --- a/lisp/progmodes/js.el +++ b/lisp/progmodes/js.el @@ -3408,6 +3408,15 @@ This function is intended for use in `after-change-functions'." ;;; Tree sitter integration +(add-to-list + 'treesit-language-source-alist + '(javascript "https://github.com/tree-sitter/tree-sitter-javascript" "v0.23.1") + t) +(add-to-list + 'treesit-language-source-alist + '(jsdoc "https://github.com/tree-sitter/tree-sitter-jsdoc" "v0.23.2") + t) + (defun js--treesit-font-lock-compatibility-definition-feature () "Font lock helper, to handle different releases of tree-sitter-javascript. Check if a node type is available, then return the right font lock rules @@ -3973,7 +3982,7 @@ See `treesit-thing-settings' for more information.") \\" :group 'js :syntax-table js-mode-syntax-table - (when (treesit-ready-p 'javascript) + (when (treesit-ensure-installed 'javascript) ;; Borrowed from `js-mode'. (setq-local prettify-symbols-alist js--prettify-symbols-alist) (setq-local parse-sexp-ignore-comments t) @@ -4004,7 +4013,7 @@ See `treesit-thing-settings' for more information.") (setq-local treesit-font-lock-settings js--treesit-font-lock-settings) (setq-local treesit-font-lock-feature-list js--treesit-font-lock-feature-list) - (when (treesit-ready-p 'jsdoc t) + (when (treesit-ensure-installed 'jsdoc) (setq-local treesit-range-settings (treesit-range-rules :embed 'jsdoc diff --git a/lisp/progmodes/json-ts-mode.el b/lisp/progmodes/json-ts-mode.el index c13e2e7f956..9d374119810 100644 --- a/lisp/progmodes/json-ts-mode.el +++ b/lisp/progmodes/json-ts-mode.el @@ -40,6 +40,11 @@ (require 'rx) (treesit-declare-unavailable-functions) +(add-to-list + 'treesit-language-source-alist + '(json "https://github.com/tree-sitter/tree-sitter-json" "v0.24.8") + t) + (defcustom json-ts-mode-indent-offset 2 "Number of spaces for each indentation step in `json-ts-mode'." :version "29.1" @@ -128,7 +133,7 @@ Return nil if there is no name or if NODE is not a defun node." :group 'json :syntax-table json-ts-mode--syntax-table - (unless (treesit-ready-p 'json) + (unless (treesit-ensure-installed 'json) (error "Tree-sitter for JSON isn't available")) (setq treesit-primary-parser (treesit-parser-create 'json)) diff --git a/lisp/progmodes/lua-ts-mode.el b/lisp/progmodes/lua-ts-mode.el index 87b035e27b0..dc129277778 100644 --- a/lisp/progmodes/lua-ts-mode.el +++ b/lisp/progmodes/lua-ts-mode.el @@ -48,6 +48,11 @@ (eval-when-compile (require 'rx)) +(add-to-list + 'treesit-language-source-alist + '(lua "https://github.com/tree-sitter-grammars/tree-sitter-lua" "v0.3.0") + t) + (defgroup lua-ts nil "Major mode for editing Lua files." :prefix "lua-ts-" @@ -661,7 +666,7 @@ Calls REPORT-FN directly." :syntax-table lua-ts--syntax-table (use-local-map lua-ts-mode-map) - (when (treesit-ready-p 'lua) + (when (treesit-ensure-installed 'lua) (setq treesit-primary-parser (treesit-parser-create 'lua)) ;; Comments. diff --git a/lisp/progmodes/php-ts-mode.el b/lisp/progmodes/php-ts-mode.el index 50e51e40b0b..b3e9ad51eaa 100644 --- a/lisp/progmodes/php-ts-mode.el +++ b/lisp/progmodes/php-ts-mode.el @@ -81,23 +81,26 @@ ;;; Install treesitter language parsers (defvar php-ts-mode--language-source-alist - '((php . ("https://github.com/tree-sitter/tree-sitter-php" "v0.23.11" "php/src")) - (phpdoc . ("https://github.com/claytonrcarter/tree-sitter-phpdoc")) - (html . ("https://github.com/tree-sitter/tree-sitter-html" "v0.23.0")) - (javascript . ("https://github.com/tree-sitter/tree-sitter-javascript" "v0.23.0")) - (jsdoc . ("https://github.com/tree-sitter/tree-sitter-jsdoc" "v0.23.0")) - (css . ("https://github.com/tree-sitter/tree-sitter-css" "v0.23.0"))) + '((php "https://github.com/tree-sitter/tree-sitter-php" "v0.23.11" "php/src") + (phpdoc "https://github.com/claytonrcarter/tree-sitter-phpdoc") + (html "https://github.com/tree-sitter/tree-sitter-html" "v0.23.2") + (javascript "https://github.com/tree-sitter/tree-sitter-javascript" "v0.23.1") + (jsdoc "https://github.com/tree-sitter/tree-sitter-jsdoc" "v0.23.2") + (css "https://github.com/tree-sitter/tree-sitter-css" "v0.23.1")) "Treesitter language parsers required by `php-ts-mode'. -You can customize this variable if you want to stick to a specific -commit and/or use different parsers.") +You can customize `treesit-language-source-alist' if you want +to stick to a specific commit and/or use different parsers.") + +(setq treesit-language-source-alist + (append treesit-language-source-alist + php-ts-mode--language-source-alist)) (defun php-ts-mode-install-parsers () "Install all the required treesitter parsers. `php-ts-mode--language-source-alist' defines which parsers to install." (interactive) - (let ((treesit-language-source-alist php-ts-mode--language-source-alist)) - (dolist (item php-ts-mode--language-source-alist) - (treesit-install-language-grammar (car item))))) + (dolist (item php-ts-mode--language-source-alist) + (treesit-install-language-grammar (car item)))) ;;; Custom variables @@ -1384,12 +1387,12 @@ Depends on `c-ts-common-comment-setup'." :syntax-table php-ts-mode--syntax-table (if (not (and - (treesit-ready-p 'php) - (treesit-ready-p 'phpdoc) - (treesit-ready-p 'html) - (treesit-ready-p 'javascript) - (treesit-ready-p 'jsdoc) - (treesit-ready-p 'css))) + (treesit-ensure-installed 'php) + (treesit-ensure-installed 'phpdoc) + (treesit-ensure-installed 'html) + (treesit-ensure-installed 'javascript) + (treesit-ensure-installed 'jsdoc) + (treesit-ensure-installed 'css))) (error "Tree-sitter for PHP isn't available. You can install the parsers with M-x `php-ts-mode-install-parsers'") diff --git a/lisp/progmodes/ruby-ts-mode.el b/lisp/progmodes/ruby-ts-mode.el index c70acfd755c..53fefe068b2 100644 --- a/lisp/progmodes/ruby-ts-mode.el +++ b/lisp/progmodes/ruby-ts-mode.el @@ -123,6 +123,11 @@ (require 'ruby-mode) (treesit-declare-unavailable-functions) +(add-to-list + 'treesit-language-source-alist + '(ruby "https://github.com/tree-sitter/tree-sitter-ruby" "v0.23.1") + t) + (defgroup ruby-ts nil "Major mode for editing Ruby code." :prefix "ruby-ts-" @@ -1155,7 +1160,7 @@ leading double colon is not added." :group 'ruby :syntax-table ruby-mode-syntax-table - (unless (treesit-ready-p 'ruby) + (unless (treesit-ensure-installed 'ruby) (error "Tree-sitter for Ruby isn't available")) (setq treesit-primary-parser (treesit-parser-create 'ruby)) diff --git a/lisp/progmodes/rust-ts-mode.el b/lisp/progmodes/rust-ts-mode.el index e3fff304ab3..cfad454b396 100644 --- a/lisp/progmodes/rust-ts-mode.el +++ b/lisp/progmodes/rust-ts-mode.el @@ -41,6 +41,11 @@ (require 'c-ts-common) ; For comment indent and filling. (treesit-declare-unavailable-functions) +(add-to-list + 'treesit-language-source-alist + '(rust "https://github.com/tree-sitter/tree-sitter-rust" "v0.23.2") + t) + (defcustom rust-ts-mode-indent-offset 4 "Number of spaces for each indentation step in `rust-ts-mode'." :version "29.1" @@ -545,7 +550,7 @@ See `prettify-symbols-compose-predicate'." :group 'rust :syntax-table rust-ts-mode--syntax-table - (when (treesit-ready-p 'rust) + (when (treesit-ensure-installed 'rust) (setq treesit-primary-parser (treesit-parser-create 'rust)) ;; Syntax. diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el index bd2178167ee..287f0501350 100644 --- a/lisp/progmodes/sh-script.el +++ b/lisp/progmodes/sh-script.el @@ -1630,7 +1630,7 @@ with your script for an edit-interpret-debug cycle." This mode automatically falls back to `sh-mode' if the buffer is not written in Bash or sh." :syntax-table sh-mode-syntax-table - (when (treesit-ready-p 'bash) + (when (treesit-ensure-installed 'bash) (sh-set-shell "bash" nil nil) (add-hook 'flymake-diagnostic-functions #'sh-shellcheck-flymake nil t) (add-hook 'hack-local-variables-hook @@ -3312,6 +3312,11 @@ member of `flymake-diagnostic-functions'." ;;; Tree-sitter font-lock +(add-to-list + 'treesit-language-source-alist + '(bash "https://github.com/tree-sitter/tree-sitter-bash" "v0.23.3") + t) + (defvar sh-mode--treesit-operators '("|" "|&" "||" "&&" ">" ">>" "<" "<<" "<<-" "<<<" "==" "!=" ";&" ";;&") "A list of `sh-mode' operators to fontify.") diff --git a/lisp/progmodes/typescript-ts-mode.el b/lisp/progmodes/typescript-ts-mode.el index 69191a694ed..a2049ba2d64 100644 --- a/lisp/progmodes/typescript-ts-mode.el +++ b/lisp/progmodes/typescript-ts-mode.el @@ -42,6 +42,19 @@ (require 'c-ts-common) ; For comment indent and filling. (treesit-declare-unavailable-functions) +(add-to-list + 'treesit-language-source-alist + '(typescript + "https://github.com/tree-sitter/tree-sitter-typescript" "v0.23.2" + "typescript/src") + t) +(add-to-list + 'treesit-language-source-alist + '(tsx + "https://github.com/tree-sitter/tree-sitter-typescript" "v0.23.2" + "tsx/src") + t) + (defcustom typescript-ts-mode-indent-offset 2 "Number of spaces for each indentation step in `typescript-ts-mode'." :version "29.1" @@ -608,7 +621,7 @@ This mode is intended to be inherited by concrete major modes." :group 'typescript :syntax-table typescript-ts-mode--syntax-table - (when (treesit-ready-p 'typescript) + (when (treesit-ensure-installed 'typescript) (setq treesit-primary-parser (treesit-parser-create 'typescript)) ;; Indent. @@ -646,7 +659,7 @@ at least 3 (which is the default value)." :group 'typescript :syntax-table typescript-ts-mode--syntax-table - (when (treesit-ready-p 'tsx) + (when (treesit-ensure-installed 'tsx) (setq treesit-primary-parser (treesit-parser-create 'tsx)) ;; Comments. diff --git a/lisp/textmodes/css-mode.el b/lisp/textmodes/css-mode.el index cfb8ff51760..e3f295c3412 100644 --- a/lisp/textmodes/css-mode.el +++ b/lisp/textmodes/css-mode.el @@ -1341,6 +1341,11 @@ for determining whether point is within a selector." ;;; Tree-sitter +(add-to-list + 'treesit-language-source-alist + '(css "https://github.com/tree-sitter/tree-sitter-css" "v0.23.1") + t) + (defvar css-ts-mode-map (copy-keymap css-mode-map) "Keymap used in `css-ts-mode'.") @@ -1884,7 +1889,7 @@ can also be used to fill comments. \\{css-mode-map}" :syntax-table css-mode-syntax-table - (when (treesit-ready-p 'css) + (when (treesit-ensure-installed 'css) ;; Borrowed from `css-mode'. (setq-local syntax-propertize-function css-syntax-propertize-function) diff --git a/lisp/textmodes/html-ts-mode.el b/lisp/textmodes/html-ts-mode.el index ff79945b291..15d419b1a37 100644 --- a/lisp/textmodes/html-ts-mode.el +++ b/lisp/textmodes/html-ts-mode.el @@ -43,6 +43,11 @@ (declare-function treesit-node-type "treesit.c") (declare-function treesit-search-subtree "treesit.c") +(add-to-list + 'treesit-language-source-alist + '(html "https://github.com/tree-sitter/tree-sitter-html" "v0.23.2") + t) + (defcustom html-ts-mode-indent-offset 2 "Number of spaces for each indentation step in `html-ts-mode'." :version "29.1" @@ -144,7 +149,7 @@ Return nil if there is no name or if NODE is not a defun node." "Major mode for editing Html, powered by tree-sitter." :group 'html - (unless (treesit-ready-p 'html t) + (unless (treesit-ensure-installed 'html) (error "Tree-sitter for HTML isn't available")) (setq treesit-primary-parser (treesit-parser-create 'html)) diff --git a/lisp/textmodes/markdown-ts-mode.el b/lisp/textmodes/markdown-ts-mode.el index dddeede1e29..9177573203e 100644 --- a/lisp/textmodes/markdown-ts-mode.el +++ b/lisp/textmodes/markdown-ts-mode.el @@ -34,6 +34,19 @@ (declare-function treesit-node-type "treesit.c") (declare-function treesit-parser-create "treesit.c") +(add-to-list + 'treesit-language-source-alist + '(markdown + "https://github.com/tree-sitter-grammars/tree-sitter-markdown" "v0.4.1" + "tree-sitter-markdown/src") + t) +(add-to-list + 'treesit-language-source-alist + '(markdown-inline + "https://github.com/tree-sitter-grammars/tree-sitter-markdown" "v0.4.1" + "tree-sitter-markdown-inline/src") + t) + ;;; Helper functions (defvar markdown-ts--code-block-language-map @@ -304,7 +317,8 @@ the same features enabled in MODE." `(("Headings" markdown-ts-imenu-node-p nil markdown-ts-imenu-name-function))) (setq-local treesit-outline-predicate "section") - (when (treesit-ready-p 'markdown) + (when (and (treesit-ensure-installed 'markdown) + (treesit-ensure-installed 'markdown-inline)) (treesit-parser-create 'markdown-inline) (treesit-parser-create 'markdown) (markdown-ts-setup))) diff --git a/lisp/textmodes/mhtml-ts-mode.el b/lisp/textmodes/mhtml-ts-mode.el index 0c98ec472b2..e38db0779c1 100644 --- a/lisp/textmodes/mhtml-ts-mode.el +++ b/lisp/textmodes/mhtml-ts-mode.el @@ -65,21 +65,24 @@ ;; In a multi-language major mode can be useful to have an "installer" to ;; simplify the installation of the grammars supported by the major-mode. (defvar mhtml-ts-mode--language-source-alist - '((html . ("https://github.com/tree-sitter/tree-sitter-html" "v0.23.2")) - (javascript . ("https://github.com/tree-sitter/tree-sitter-javascript" "v0.23.1")) - (jsdoc . ("https://github.com/tree-sitter/tree-sitter-jsdoc" "v0.23.2")) - (css . ("https://github.com/tree-sitter/tree-sitter-css" "v0.23.1"))) + '((html "https://github.com/tree-sitter/tree-sitter-html" "v0.23.2") + (javascript "https://github.com/tree-sitter/tree-sitter-javascript" "v0.23.1") + (jsdoc "https://github.com/tree-sitter/tree-sitter-jsdoc" "v0.23.2") + (css "https://github.com/tree-sitter/tree-sitter-css" "v0.23.1")) "Treesitter language parsers required by `mhtml-ts-mode'. -You can customize this variable if you want to stick to a specific -commit and/or use different parsers.") +You can customize `treesit-language-source-alist' if you want +to stick to a specific commit and/or use different parsers.") + +(setq treesit-language-source-alist + (append treesit-language-source-alist + mhtml-ts-mode--language-source-alist)) (defun mhtml-ts-mode-install-parsers () "Install all the required treesitter parsers. `mhtml-ts-mode--language-source-alist' defines which parsers to install." (interactive) - (let ((treesit-language-source-alist mhtml-ts-mode--language-source-alist)) - (dolist (item mhtml-ts-mode--language-source-alist) - (treesit-install-language-grammar (car item))))) + (dolist (item mhtml-ts-mode--language-source-alist) + (treesit-install-language-grammar (car item)))) ;;; Custom variables @@ -432,9 +435,9 @@ Calls REPORT-FN directly. Requires tidy." "Major mode for editing HTML with embedded JavaScript and CSS. Powered by tree-sitter." (if (not (and - (treesit-ready-p 'html t) - (treesit-ready-p 'javascript t) - (treesit-ready-p 'css t))) + (treesit-ensure-installed 'html) + (treesit-ensure-installed 'javascript) + (treesit-ensure-installed 'css))) (error "Tree-sitter parsers for HTML isn't available. You can install the parsers with M-x `mhtml-ts-mode-install-parsers'") @@ -487,7 +490,7 @@ Powered by tree-sitter." ;; jsdoc is not mandatory for js-ts-mode, so we respect this by ;; adding jsdoc range rules only when jsdoc is available. - (when (treesit-ready-p 'jsdoc t) + (when (treesit-ensure-installed 'jsdoc) (setq-local treesit-range-settings (append treesit-range-settings (treesit-range-rules diff --git a/lisp/textmodes/toml-ts-mode.el b/lisp/textmodes/toml-ts-mode.el index 3b55fe7706a..b1414852dbb 100644 --- a/lisp/textmodes/toml-ts-mode.el +++ b/lisp/textmodes/toml-ts-mode.el @@ -36,6 +36,11 @@ (declare-function treesit-node-child "treesit.c") (declare-function treesit-node-child-by-field-name "treesit.c") +(add-to-list + 'treesit-language-source-alist + '(toml "https://github.com/tree-sitter-grammars/tree-sitter-toml" "v0.7.0") + t) + (defcustom toml-ts-mode-indent-offset 2 "Number of spaces for each indentation step in `toml-ts-mode'." :version "29.1" @@ -123,7 +128,7 @@ Return nil if there is no name or if NODE is not a defun node." :group 'toml-mode :syntax-table toml-ts-mode--syntax-table - (when (treesit-ready-p 'toml) + (when (treesit-ensure-installed 'toml) (setq treesit-primary-parser (treesit-parser-create 'toml)) ;; Comments diff --git a/lisp/textmodes/yaml-ts-mode.el b/lisp/textmodes/yaml-ts-mode.el index 7d11223aefa..26b7655acba 100644 --- a/lisp/textmodes/yaml-ts-mode.el +++ b/lisp/textmodes/yaml-ts-mode.el @@ -35,6 +35,11 @@ (declare-function treesit-node-type "treesit.c") (declare-function treesit-node-child-by-field-name "treesit.c") +(add-to-list + 'treesit-language-source-alist + '(yaml "https://github.com/tree-sitter-grammars/tree-sitter-yaml" "v0.7.0") + t) + (defvar yaml-ts-mode--syntax-table (let ((table (make-syntax-table))) (modify-syntax-entry ?# "<" table) @@ -162,7 +167,7 @@ Return nil if there is no name or if NODE is not a defun node." :group 'yaml :syntax-table yaml-ts-mode--syntax-table - (when (treesit-ready-p 'yaml) + (when (treesit-ensure-installed 'yaml) (setq treesit-primary-parser (treesit-parser-create 'yaml)) ;; Comments. diff --git a/test/infra/Dockerfile.emba b/test/infra/Dockerfile.emba index 7b70a98ebd9..c4bae4ed731 100644 --- a/test/infra/Dockerfile.emba +++ b/test/infra/Dockerfile.emba @@ -123,6 +123,8 @@ RUN make -j `nproc` bootstrap RUN mkdir -p /root/.emacs.d/tree-sitter RUN git config --global http.sslverify "false" # See https://github.com/emacs-tree-sitter/tree-sitter-langs/tree/master/repos +# The verified versions are generated by 'treesit-admin-verify-major-mode-queries` +# at the comments section in ts-mode files. RUN src/emacs -Q --batch \ --eval \ '(message "ABI min version %d max version %d" \ @@ -130,27 +132,27 @@ RUN src/emacs -Q --batch \ --eval '(setq \ treesit-extra-load-path (list "/root/.emacs.d/tree-sitter") \ treesit-language-source-alist \ - (quote ((bash "https://github.com/tree-sitter/tree-sitter-bash") \ - (c "https://github.com/tree-sitter/tree-sitter-c") \ - (c-sharp "https://github.com/tree-sitter/tree-sitter-c-sharp") \ - (cpp "https://github.com/tree-sitter/tree-sitter-cpp") \ - (css "https://github.com/tree-sitter/tree-sitter-css") \ - (elixir "https://github.com/elixir-lang/tree-sitter-elixir") \ - (go "https://github.com/tree-sitter/tree-sitter-go") \ - (gomod "https://github.com/camdencheek/tree-sitter-go-mod") \ + (quote ((bash "https://github.com/tree-sitter/tree-sitter-bash" "v0.23.3") \ + (c "https://github.com/tree-sitter/tree-sitter-c" "v0.23.4") \ + (c-sharp "https://github.com/tree-sitter/tree-sitter-c-sharp" "v0.23.1") \ + (cpp "https://github.com/tree-sitter/tree-sitter-cpp" "v0.23.4") \ + (css "https://github.com/tree-sitter/tree-sitter-css" "v0.23.1") \ + (elixir "https://github.com/elixir-lang/tree-sitter-elixir" "v0.3.3") \ + (go "https://github.com/tree-sitter/tree-sitter-go" "v0.23.4") \ + (gomod "https://github.com/camdencheek/tree-sitter-go-mod" "v1.1.0") \ (gowork "https://github.com/omertuc/tree-sitter-go-work") \ - (heex "https://github.com/phoenixframework/tree-sitter-heex") \ - (html "https://github.com/tree-sitter/tree-sitter-html") \ - (java "https://github.com/tree-sitter/tree-sitter-java") \ - (javascript "https://github.com/tree-sitter/tree-sitter-javascript") \ - (jsdoc "https://github.com/tree-sitter/tree-sitter-jsdoc") \ - (json "https://github.com/tree-sitter/tree-sitter-json") \ - (lua "https://github.com/tree-sitter-grammars/tree-sitter-lua") \ - (python "https://github.com/tree-sitter/tree-sitter-python") \ - (ruby "https://github.com/tree-sitter/tree-sitter-ruby") \ - (rust "https://github.com/tree-sitter/tree-sitter-rust" "v0.23.3") \ - (tsx "https://github.com/tree-sitter/tree-sitter-typescript" "master" "tsx/src") \ - (typescript "https://github.com/tree-sitter/tree-sitter-typescript" "master" "typescript/src"))))' \ + (heex "https://github.com/phoenixframework/tree-sitter-heex" "v0.7.0") \ + (html "https://github.com/tree-sitter/tree-sitter-html" "v0.23.2") \ + (java "https://github.com/tree-sitter/tree-sitter-java" "v0.23.5") \ + (javascript "https://github.com/tree-sitter/tree-sitter-javascript" "v0.23.1") \ + (jsdoc "https://github.com/tree-sitter/tree-sitter-jsdoc" "v0.23.2") \ + (json "https://github.com/tree-sitter/tree-sitter-json" "v0.24.8") \ + (lua "https://github.com/tree-sitter-grammars/tree-sitter-lua" "v0.3.0") \ + (python "https://github.com/tree-sitter/tree-sitter-python" "v0.23.6") \ + (ruby "https://github.com/tree-sitter/tree-sitter-ruby" "v0.23.1") \ + (rust "https://github.com/tree-sitter/tree-sitter-rust" "v0.23.2") \ + (tsx "https://github.com/tree-sitter/tree-sitter-typescript" "v0.23.2" "tsx/src") \ + (typescript "https://github.com/tree-sitter/tree-sitter-typescript" "v0.23.2" "typescript/src"))))' \ --eval '(dolist (lang (mapcar (quote car) treesit-language-source-alist)) \ (treesit-install-language-grammar lang "/root/.emacs.d/tree-sitter"))'