]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve reporting of language-grammar library ABI version mismatch
authorEli Zaretskii <eliz@gnu.org>
Sun, 18 May 2025 06:05:07 +0000 (09:05 +0300)
committerEshel Yaron <me@eshelyaron.com>
Wed, 21 May 2025 06:09:25 +0000 (08:09 +0200)
* lisp/treesit.el (treesit-ready-p): More accurate wording of
message when grammar library fails to load.

* src/treesit.c (treesit_load_language): Improve message when
reporting library ABI version mismatch.  Suggested by Soham
Gumaste <sohamg2@gmail.com>.

(cherry picked from commit 38789e9a2878846cadb72fef58cc24872fe46ae4)

lisp/treesit.el
src/treesit.c

index dafbf6d14b2e208416ed4e5957b50000e0d61152..c3e17a8dc9cca3525bb973325ca6adf1da9ad936 100644 (file)
@@ -4290,7 +4290,7 @@ instead of emitting a warning."
         (pcase-let ((`(,available . ,err)
                      (treesit-language-available-p lang t)))
           (when (not available)
-            (setq msg (format "language grammar for %s is unavailable (%s): %s"
+            (setq msg (format "language grammar for %s failed to load (%s): %s"
                               lang (nth 0 err)
                               (string-join
                                (mapcar (lambda (x) (format "%s" x))
index 3a19e0cb282a2b1c254bdb90db949c279db25d5c..de74e41c89a6d94f927633f899cb2fbf6a8b7f98 100644 (file)
@@ -757,6 +757,7 @@ treesit_load_language (Lisp_Object language_symbol,
   error = NULL;
   handle = NULL;
 
+  Lisp_Object loaded_lib = Qnil;
   FOR_EACH_TAIL (tail)
     {
       char *library_name = SSDATA (XCAR (tail));
@@ -764,7 +765,10 @@ treesit_load_language (Lisp_Object language_symbol,
       handle = dynlib_open (library_name);
       error = dynlib_error ();
       if (error == NULL)
-       break;
+       {
+         loaded_lib = XCAR (tail);
+         break;
+       }
       else
        error_list = Fcons (build_string (error), error_list);
     }
@@ -808,9 +812,15 @@ treesit_load_language (Lisp_Object language_symbol,
   ts_parser_delete (parser);
   if (!success)
     {
+      Lisp_Object fmt =
+       build_string ("%s's ABI version is %d, but supported versions are %d-%d");
+      Lisp_Object formatted_msg =
+       CALLN (Fformat_message, fmt, loaded_lib,
+              make_fixnum (ts_language_version (lang)),
+              make_fixnum (TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION),
+              make_fixnum (TREE_SITTER_LANGUAGE_VERSION));
       *signal_symbol = Qtreesit_load_language_error;
-      *signal_data = list2 (Qversion_mismatch,
-                           make_fixnum (ts_language_version (lang)));
+      *signal_data = list2 (Qlang_version_mismatch, formatted_msg);
       return loaded_lang;
     }
 
@@ -5091,7 +5101,7 @@ syms_of_treesit (void)
 
   DEFSYM (Qnot_found, "not-found");
   DEFSYM (Qsymbol_error, "symbol-error");
-  DEFSYM (Qversion_mismatch, "version-mismatch");
+  DEFSYM (Qlang_version_mismatch, "language-grammar-version-mismatch");
 
   DEFSYM (Qtreesit_error, "treesit-error");
   DEFSYM (Qtreesit_query_error, "treesit-query-error");