Subject: bug#66183: closed (Re: bug#66183: elixir-ts-mode test failure)

From: [email-masked] (GNU bug Tracking System)
Date: Wed, 27 Sep 2023 06:47:02 +0000

Your bug report

#66183: elixir-ts-mode test failure

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
66183: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=66183
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#66183: elixir-ts-mode test failure
From: Yuan Fu <[email-masked]>
To: Wilhelm Kirschbaum <[email-masked]>
Cc: Bug Report Emacs <[email-masked]>, john muhl <[email-masked]>, [email-masked]
Date: Tue, 26 Sep 2023 23:46:13 -0700
List-Id: <debbugs-submit.debbugs.gnu.org>

> On Sep 26, 2023, at 1:26 PM, Wilhelm Kirschbaum <[email-masked]> wrote:
> 
>>>> need to adjust it but the idea is there.
>>>> With the new language-at-point definition, treesit-language-at can
>>>> return the correct language, and the test passes again.
>>>> Yuan
>>>> [2. text/x-patch; example.diff]...
>>> This seems to work if you set named on: treesit-node-prev-sibling,
>>> otherwise it just tries to match the \"\"\" against H or F.
>>> (let* ((node (treesit-node-at point 'elixir)))
>>>   (if (and (equal (treesit-node-type node) "quoted_content")
>>>            (string-match-p
>>>             (rx bos (or "H" "F") eos)
>>> -              (treesit-node-text (treesit-node-prev-sibling node))))
>>> +              (treesit-node-text (treesit-node-prev-sibling node t))))
>>>       'heex
>>>     'elixir)))
>>> I will spend some time in the next couple of hours to catch up to all
>>> the changes.
>> 
>> Ah, right. I’ll leave the specifics to you. As long as the language is derived from the node at point rather than parser range, it will be fine. Also, there’s no rush.
>> 
> 
> Hi Yuan,
> 
> With the new changes I had to update some indentation rules as well.
> The following patch was tested against a couple of elixir files.
> 
> There is another indentation issue with HEEx embeds, but think its
> unrelated to this issue and will have a look this weekend.
> 
From 046950eb63b5499ab7f60434c5ebd0bbe5ada274 Mon Sep 17 00:00:00 2001
From: Wilhelm H Kirschbaum <[email-masked]>
Date: Tue, 26 Sep 2023 21:32:40 +0200
Subject: [PATCH] Fix treesit-langauge-at-point for elixir-ts-mode.

The treesit-language-at-point function is only suppose to query the
host language.

* lisp/progmodes/elixir-ts-mode.el
(elixir-ts--indent-rules): Add missing rules.
(elixir-ts--treesit-language-at-point): Update function to only query
the host language.
* test/lisp/progmodes/elixir-ts-mode-resources/indent.erts: Add test
for inline docs.
---
 lisp/progmodes/elixir-ts-mode.el              | 35 ++++++++++---------
 .../elixir-ts-mode-resources/indent.erts      | 16 +++++++++
 2 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/lisp/progmodes/elixir-ts-mode.el b/lisp/progmodes/elixir-ts-mode.el
index 7175fe4bff8..fd4400c6c53 100644
--- a/lisp/progmodes/elixir-ts-mode.el
+++ b/lisp/progmodes/elixir-ts-mode.el
@@ -312,7 +312,16 @@ elixir-ts--indent-rules
        ((parent-is "^catch_block$") parent ,offset)
        ((parent-is "^keywords$") parent-bol 0)
        ((node-is "^call$") parent-bol ,offset)
-       ((node-is "^comment$") parent-bol ,offset)))))
+       ((node-is "^comment$") parent-bol ,offset)
+       ((node-is "\"\"\"") parent-bol 0)
+       ;; Handle quoted_content indentation on the last
+       ;; line before the closing \"\"\", where it might
+       ;; see it as no-node outside a HEEx tag.
+       (no-node (lambda (_n _p _bol)
+                  (treesit-node-start
+                   (treesit-node-parent
+                    (treesit-node-at (point) 'elixir))))
+                  0)))))
 
 (defvar elixir-ts--font-lock-settings
   (treesit-font-lock-rules
@@ -510,21 +519,15 @@ elixir-ts--treesit-anchor-grand-parent-bol
 
 (defun elixir-ts--treesit-language-at-point (point)
   "Return the language at POINT."
-  (let* ((range nil)
-         (language-in-range
-          (cl-loop
-           for parser in (treesit-parser-list)
-           do (setq range
-                    (cl-loop
-                     for range in (treesit-parser-included-ranges parser)
-                     if (and (>= point (car range)) (<= point (cdr range)))
-                     return parser))
-           if range
-           return (treesit-parser-language parser))))
-    (if (null language-in-range)
-        (when-let ((parser (car (treesit-parser-list))))
-          (treesit-parser-language parser))
-      language-in-range)))
+  (let ((node (treesit-node-at point 'elixir)))
+    (if (and (equal (treesit-node-type node) "quoted_content")
+             (let ((prev-sibling (treesit-node-prev-sibling node t)))
+               (when (treesit-node-p prev-sibling)
+                 (string-match-p
+                  (rx bos (or "H" "F") eos)
+                  (treesit-node-text (treesit-node-prev-sibling node t))))))
+        'heex
+      'elixir)))
 
 (defun elixir-ts--defun-p (node)
   "Return non-nil when NODE is a defun."
diff --git a/test/lisp/progmodes/elixir-ts-mode-resources/indent.erts b/test/lisp/progmodes/elixir-ts-mode-resources/indent.erts
index 1f855d3c977..fe09a37a32b 100644
--- a/test/lisp/progmodes/elixir-ts-mode-resources/indent.erts
+++ b/test/lisp/progmodes/elixir-ts-mode-resources/indent.erts
@@ -330,6 +330,22 @@ Name: Long tuple
  "October", "November", "December"}
 =-=-=
 
+Name: Doc
+
+=-=
+defmodule Foo do
+"""
+    bar
+    """
+end
+=-=
+defmodule Foo do
+  """
+    bar
+  """
+end
+=-=-=
+
 Name: Embedded HEEx
 
 =-=
-- 
2.42.0

> Wilhelm

Thanks. I made some minor change and pushed to master.

Yuan

Subject: elixir-ts-mode test failure
From: john muhl <[email-masked]>
To: [email-masked]
Cc: Yuan Fu <[email-masked]>
Date: Sun, 24 Sep 2023 11:53:19 -0500
List-Id: <debbugs-submit.debbugs.gnu.org>

The change in 5cba5ee8905 caused an elixir test to start failing. The
white space at the start of the test is now in a heex range so pressing
tab there matches a heex rule instead of the elixir one. Moving the
dummy range to the end fixes the test.

--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -722,7 +722,7 @@ treesit-update-ranges
                           ;; language, set it's range to a dummy (1
                           ;; . 1), otherwise it would be set to the
                           ;; whole buffer, which is not what we want.
-                          `((,(point-min) . ,(point-min))))))))))))
+                          `((,(point-max) . ,(point-max))))))))))))

Running 1 tests (2023-09-24 11:52:17-0500, selector ‘t’)
Test elixir-ts-mode-test-indentation backtrace:
  signal(ert-test-failed (("Mismatch in test \"Basic modules\", file /
  ert-fail(("Mismatch in test \"Basic modules\", file /home/jm/src/ema
  ert-test--erts-test(((dummy . t) (code)) "/home/jm/src/emacs/test/li
  ert-test-erts-file("/home/jm/src/emacs/test/lisp/progmodes/elixir-ts
  (closure (t) nil (let ((value-4 (gensym "ert-form-evaluation-aborted
  ert--run-test-internal(#s(ert--test-execution-info :test #s(ert-test
  ert-run-test(#s(ert-test :name elixir-ts-mode-test-indentation :docu
  ert-run-or-rerun-test(#s(ert--stats :selector t :tests [#s(ert-test 
  ert-run-tests(t #f(compiled-function (event-type &rest event-args) #
  ert-run-tests-batch(nil)
  ert-run-tests-batch-and-exit()
  command-line-1(("-l" "ert" "-l" "/home/jm/src/emacs/lisp/progmodes/e
  command-line()
  normal-top-level()
Test elixir-ts-mode-test-indentation condition:
    (ert-test-failed
     ("Mismatch in test \"Basic modules\", file /home/jm/src/emacs/test/lisp/progmodes/elixir-ts-mode-resources/indent.erts"
      #(
	"  defmodule Foobar do\n    def bar() do\n      \"one\"\n    end\n  end\n"
	0 65 (fontified nil))
      "defmodule Foobar do\n  def bar() do\n    \"one\"\n  end\nend\n"))
   FAILED  1/1  elixir-ts-mode-test-indentation (0.053512 sec) at ../../src/emacs/test/lisp/progmodes/elixir-ts-mode-tests.el:26

Ran 1 tests, 0 results as expected, 1 unexpected (2023-09-24 11:52:17-0500, 0.118489 sec)

1 unexpected results:
   FAILED  elixir-ts-mode-test-indentation