Subject: Re: bug#60830: 30.0.50; The *Compilation* buffer does not recognize Lua errors

From: Rudolf Adamkovič <[email-masked]>
Date: Tue, 03 Oct 2023 10:12:05 +0200

Stefan Kangas <[email-masked]> writes:

> [...], all that is needed is to fix the formatting you describe in
> (1). That will give the desired behavior. [...] Regarding (2), I think
> compilation-mode already detects those as file locations, with no
> changes.  At least it does on current master.

As for (2), I recompiled Emacs from 'master' (498d31e9f05) to verify
your claim, but it does seem to hold.  I can reproduce the bug under
'emacs -Q' by following the reproduction steps.

However!  I did some thinking and realized two important facts:

(A) Even if the GNU standard supported tab-indented errors, as per (2),
it would not help, as Lua stack frames are not errors.

(B) People use older Lua versions, which will work forever, as they are
written in ANSI C, and so even if (1) is fixed upstream, we must support
the current error format as well.

After I realized that (A) and (B) are true, I used my morning to write a
patch that solves the problem properly.  I am attaching the patch to
this message.  Do you think the patch could be merged upstream?

Thank you for your time!

Rudy
>From 3bbf4019df45548d1286ba9b0dffe8fadad2bdf1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rudolf=20Adamkovi=C4=8D?= <[email-masked]>
Date: Tue, 3 Oct 2023 09:07:40 +0200
Subject: [PATCH] Make the Compilation mode recognize Lua errors

Emacs comes with built-in support for the Lua programming language in
the form of the Lua mode and now also the Lua Tree-sitter mode.  But,
Lua support in Emacs is incomplete in that the Compilation mode does
not recognize Lua errors, which is what this patch fixes.

Reported as bug#60830.

* lisp/progmodes/compile.el (compilation-error-regexp-alist-alist):
Add regexps to aid Lua development, namely the 'lua' regexp that
matches Lua errors and the 'lua-stack' regexp that matches Lua stack
frames.

* test/lisp/progmodes/compile-tests.el (compile-tests--test-regexps-data):
(compile-test-error-regexps): Test the new 'lua' and 'lua-stack'
regexps added to the 'compilation-error-regexp-alist-alist'.
---
 lisp/progmodes/compile.el            |  5 +++++
 test/lisp/progmodes/compile-tests.el | 13 +++++++++++--
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index f85cc0909dd..82f8280d76d 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -362,6 +362,11 @@ compilation-error-regexp-alist-alist
     (ruby-Test::Unit
      "^    [[ ]?\\([^ (].*\\):\\([1-9][0-9]*\\)\\(\\]\\)?:in " 1 2)
 
+    (lua
+     "^[^: \n\t]+: \\([^: \n\t]+\\):\\([0-9]+\\): " 1 2 nil 2 1)
+    (lua-stack
+     "^\t\\([^: \n\t]+\\):\\([0-9]+\\): " 1 2 nil 0 1)
+
     (gmake
      ;; Set GNU make error messages as INFO level.
      ;; It starts with the name of the make program which is variable,
diff --git a/test/lisp/progmodes/compile-tests.el b/test/lisp/progmodes/compile-tests.el
index 078eef36774..889b3443993 100644
--- a/test/lisp/progmodes/compile-tests.el
+++ b/test/lisp/progmodes/compile-tests.el
@@ -208,6 +208,15 @@ compile-tests--test-regexps-data
      1 0 31 "/usr/include/c++/3.3/backward/iostream.h")
     (gcc-include "                 from test_clt.cc:1:"
      1 nil 1 "test_clt.cc")
+    ;; Lua
+    (lua "lua: database.lua:10: assertion failed!"
+         6 nil 10 "database.lua")
+    (lua "/usr/local/bin/lua: core/database.lua:20: assertion failed!"
+         21 nil 20 "core/database.lua")
+    (lua-stack "	database.lua:10: in field 'statement'"
+                     2 nil 10 "database.lua" 0)
+    (lua-stack "	core/database.lua:20: in field 'statement'"
+                     2 nil 20 "core/database.lua" 0)
     ;; gmake
     (gmake "make: *** [Makefile:20: all] Error 2" 12 nil 20 "Makefile" 0)
     (gmake "make[4]: *** [sub/make.mk:19: all] Error 127" 15 nil 19
@@ -499,9 +508,9 @@ compile-test-error-regexps
           (compilation-num-warnings-found 0)
           (compilation-num-infos-found 0))
       (mapc #'compile--test-error-line compile-tests--test-regexps-data)
-      (should (eq compilation-num-errors-found 100))
+      (should (eq compilation-num-errors-found 102))
       (should (eq compilation-num-warnings-found 35))
-      (should (eq compilation-num-infos-found 28)))))
+      (should (eq compilation-num-infos-found 30)))))
 
 (ert-deftest compile-test-grep-regexps ()
   "Test the `grep-regexp-alist' regexps.
-- 
2.37.1 (Apple Git-137.1)

-- 
"Chop your own wood and it will warm you twice."
-- Henry Ford; Francis Kinloch, 1819; Henry David Thoreau, 1854

Rudolf Adamkovič <[email-masked]> [he/him]
Studenohorská 25
84103 Bratislava
Slovakia