From 07d2ac15987cf104b75db84eae7cb872131fd130 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sun, 18 May 2025 09:05:07 +0300 Subject: [PATCH] Improve reporting of language-grammar library ABI version mismatch * 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 . (cherry picked from commit 38789e9a2878846cadb72fef58cc24872fe46ae4) --- lisp/treesit.el | 2 +- src/treesit.c | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lisp/treesit.el b/lisp/treesit.el index dafbf6d14b2..c3e17a8dc9c 100644 --- a/lisp/treesit.el +++ b/lisp/treesit.el @@ -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)) diff --git a/src/treesit.c b/src/treesit.c index 3a19e0cb282..de74e41c89a 100644 --- a/src/treesit.c +++ b/src/treesit.c @@ -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"); -- 2.39.5