Subject: Re: bug#70515: 30.0.50; which-function-mode error in lua-ts-mode

From: john muhl <[email-masked]>
Date: Mon, 22 Apr 2024 10:29:47 -0500

>From f4d09165ab78d09e97dbf0ac9402d43de7a7c7cd Mon Sep 17 00:00:00 2001
From: john muhl <[email-masked]>
Date: Sat, 20 Apr 2024 21:19:27 -0500
Subject: [PATCH] Fix which-function error in lua-ts-mode (bug#70515)

* lisp/progmodes/lua-ts-mode.el (lua-ts-mode): Remove
incorrect usage of 'which-func-functions'.
* test/lisp/progmodes/lua-ts-mode-tests.el:
(lua-ts-test-which-function): Add test.
* test/lisp/progmodes/lua-ts-mode-resources/which-function.lua:
New file.
---
 lisp/progmodes/lua-ts-mode.el                         |  5 +----
 .../lua-ts-mode-resources/which-function.lua          |  3 +++
 test/lisp/progmodes/lua-ts-mode-tests.el              | 11 +++++++++++
 3 files changed, 15 insertions(+), 4 deletions(-)
 create mode 100644 test/lisp/progmodes/lua-ts-mode-resources/which-function.lua

diff --git a/lisp/progmodes/lua-ts-mode.el b/lisp/progmodes/lua-ts-mode.el
index 45ea8ec9a81..06663e5bd0e 100644
--- a/lisp/progmodes/lua-ts-mode.el
+++ b/lisp/progmodes/lua-ts-mode.el
@@ -764,7 +764,7 @@ lua-ts-mode
                                       "vararg_expression"))))
                    (text "comment"))))
 
-    ;; Imenu/Outline.
+    ;; Imenu/Outline/Which-function.
     (setq-local treesit-simple-imenu-settings
                 `(("Requires"
                    "\\`function_call\\'"
@@ -776,9 +776,6 @@ lua-ts-mode
                    lua-ts--named-function-p
                    nil)))
 
-    ;; Which-function.
-    (setq-local which-func-functions (treesit-defun-at-point))
-
     ;; Align.
     (setq-local align-indent-before-aligning t)
 
diff --git a/test/lisp/progmodes/lua-ts-mode-resources/which-function.lua b/test/lisp/progmodes/lua-ts-mode-resources/which-function.lua
new file mode 100644
index 00000000000..621d818461c
--- /dev/null
+++ b/test/lisp/progmodes/lua-ts-mode-resources/which-function.lua
@@ -0,0 +1,3 @@
+local function f(x)
+    print(x)
+end
diff --git a/test/lisp/progmodes/lua-ts-mode-tests.el b/test/lisp/progmodes/lua-ts-mode-tests.el
index 565e6f91dbd..a7b637d18d1 100644
--- a/test/lisp/progmodes/lua-ts-mode-tests.el
+++ b/test/lisp/progmodes/lua-ts-mode-tests.el
@@ -23,6 +23,7 @@
 (require 'ert-font-lock)
 (require 'ert-x)
 (require 'treesit)
+(require 'which-func)
 
 (ert-deftest lua-ts-test-indentation ()
   (skip-unless (treesit-ready-p 'lua))
@@ -37,6 +38,16 @@ lua-ts-test-font-lock
   (let ((treesit-font-lock-level 4))
     (ert-font-lock-test-file (ert-resource-file "font-lock.lua") 'lua-ts-mode)))
 
+(ert-deftest lua-ts-test-which-function ()
+  (skip-unless (treesit-ready-p 'lua))
+  (with-temp-buffer
+    (insert-file-contents (ert-resource-file "which-function.lua"))
+    (lua-ts-mode)
+    (which-function-mode)
+    (goto-char (point-min))
+    (should (equal "f" (which-function)))
+    (which-function-mode -1)))
+
 (provide 'lua-ts-mode-tests)
 
 ;;; lua-ts-mode-tests.el ends here
-- 
2.41.0

john muhl <[email-masked]> writes:

>   -- test.lua
>   local function f(x)
>       print(x)
>   end
>
>   emacs -Q test.lua
>   M-x which-function-mode
>
>   Error running timer ‘which-func-update’:
>   (error "Error in which-func-update:
>   (invalid-function #<treesit-node function_declaration in 1-37>)")
>
> Patch to follow.
>
> In GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu) of 2024-04-21 built
>  on localhost
> Repository revision: 4773ecb93193495f141e5d60c0c5ded58eaa2c98
> Repository branch: master
> System Description: Fedora Linux 39 (Thirty Nine)
>
> Configured using:
>  'configure --without-x --without-native-compilation'
>
> Configured features:
> ACL DBUS GMP GNUTLS GPM LIBSELINUX LIBSYSTEMD LIBXML2 MODULES NOTIFY
> INOTIFY PDUMPER SECCOMP SOUND SQLITE3 THREADS TREE_SITTER XIM ZLIB
>
> Important settings:
>   value of $LANG: en_US.UTF-8
>   locale-coding-system: utf-8-unix
>
> Major mode: Lua
>
> Minor modes in effect:
>   which-function-mode: t
>   tooltip-mode: t
>   global-eldoc-mode: t
>   show-paren-mode: t
>   electric-indent-mode: t
>   menu-bar-mode: t
>   file-name-shadow-mode: t
>   global-font-lock-mode: t
>   font-lock-mode: t
>   minibuffer-regexp-mode: t
>   line-number-mode: t
>   transient-mark-mode: t
>   auto-composition-mode: t
>   auto-encryption-mode: t
>   auto-compression-mode: t
>
> Load-path shadows:
> None found.
>
> Features:
> (shadow sort mail-extr emacsbug message mailcap yank-media puny dired
> dnd dired-loaddefs rfc822 mml mml-sec password-cache epa derived epg
> rfc6068 epg-config gnus-util text-property-search time-date subr-x
> mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils
> mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr
> mail-utils cus-start cus-load which-func imenu cl-seq lua-ts-mode
> treesit cl-loaddefs cl-lib comint regexp-opt ansi-osc ansi-color ring
> term/xterm xterm byte-opt gv bytecomp byte-compile rmc iso-transl
> tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks
> lisp-float-type elisp-mode tabulated-list replace newcomment text-mode
> lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch
> easymenu timer select mouse jit-lock font-lock syntax font-core
> term/tty-colors frame minibuffer nadvice seq simple cl-generic
> indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
> tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek
> romanian slovak czech european ethiopic indian cyrillic chinese
> composite emoji-zwj charscript charprop case-table epa-hook
> jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs
> theme-loaddefs faces cus-face macroexp files window text-properties
> overlay sha1 md5 base64 format env code-pages mule custom widget keymap
> hashtable-print-readable backquote threads dbusbind inotify multi-tty
> make-network-process emacs)
>
> Memory information:
> ((conses 16 66424 9105) (symbols 48 7625 0) (strings 32 18124 1778)
>  (string-bytes 1 437334) (vectors 16 8799) (vector-slots 8 77160 4863)
>  (floats 8 28 1) (intervals 56 253 2) (buffers 992 11))