Subject: bug#59617: closed (Re: bug#59617: 29.0.50; Add indent styles to all tree-sitter modes)

From: [email-masked] (GNU bug Tracking System)
Date: Fri, 02 Dec 2022 05:27:01 +0000

Your bug report

#59617: 29.0.50; Add indent styles to all tree-sitter modes

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].

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

Subject: Re: bug#59617: 29.0.50; Add indent styles to all tree-sitter modes
From: Yuan Fu <[email-masked]>
To: Theodor Thornhill <[email-masked]>
Cc: [email-masked], Eli Zaretskii <[email-masked]>
Date: Thu, 1 Dec 2022 21:26:40 -0800
List-Id: <debbugs-submit.debbugs.gnu.org>

Theodor Thornhill <[email-masked]> writes:

> On 30 November 2022 22:44:39 CET, Yuan Fu <[email-masked]> wrote:
>>
>>Eli Zaretskii <[email-masked]> writes:
>>
>>>> From: Theodor Thornhill <[email-masked]>
>>>> Cc: [email-masked], [email-masked]
>>>> Date: Tue, 29 Nov 2022 16:19:26 +0100
>>>> 
>>>> Theodor Thornhill <[email-masked]> writes:
>>>> 
>>>> > Rebased on emacs-29.
>>>> >
>>>> 
>>>> Is this good to go or should I change something here?
>>>
>>> Good to go from my POV, but I wanted also to hear from Yuan.
>>>
>>> Thanks.
>>
>>Hey sorry, I was busy with some other things. I’ve looked at the patch,
>>it seems adding a hook that sets treesit-simple-indent-rules would have
>>the same effect, no? (Ie, user already can set a custom indent style)
>>Like instead of
>>
>>(defvar my-personal-csharp-mode-indent-rules (...))
>>
>>(setq csharp-ts-mode-indent-style
>>      (lambda () my-personal-csharp-mode-indent-rules))
>>
>>you can just do
>>
>>(defvar my-personal-csharp-mode-indent-rules (...))
>>
>>(add-hook 'csharp-mode-hook
>>          (lambda ()
>>           (setq treesit-simple-indent-rules
>>                 my-personal-csharp-mode-indent-rules)))
>>
>>This way there is no need to define a custom option and a function for
>>each mode. And users can use the same variable
>>treesit-simple-indent-rules, just in different major mode hooks.
>>
>>Yuan
>
> Hmm I think you're right, and I think I agree :)
>
> Theo

Cool :-) I’m closing this then.

Yuan

Subject: 29.0.50; Add indent styles to all tree-sitter modes
From: Theodor Thornhill <[email-masked]>
To: [email-masked]
Date: Sat, 26 Nov 2022 19:59:34 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

Hi Yuan and others!

I've added in the ability for users to set their own indentation style
should that be needed.

I just followed what I already did in c-ts-mode and c++-ts-mode, so I
believe this shouldn't be too controversial :-)

Theo
>From 5f5695916b71af4f9e778f4bd5c51edb2c85067e Mon Sep 17 00:00:00 2001
From: Theodor Thornhill <[email-masked]>
Date: Sat, 26 Nov 2022 19:54:47 +0100
Subject: [PATCH] Add indent styles to all tree-sitter modes

Enable users to provide their own function to control the indentation
style.  Even though we don't supply any extra styles for indentation,
this should give the users an escape hatch should the provided style
not suit their needs.

* lisp/progmodes/c-ts-mode.el (c-ts-mode-indent-style): Fix typo.
* lisp/progmodes/csharp-mode.el (csharp-ts-mode-indent-style)
(csharp-ts-mode--set-indent-style, csharp-ts-mode): New defcustom and
helper.
* lisp/progmodes/java-ts-mode.el (java-ts-mode-indent-style)
(java-ts-mode--set-indent-style, java-ts-mode): New defcustom and
helper.
* lisp/progmodes/js.el (js-ts-mode-indent-style)
(js--treesit-set-indent-style, js-ts-mode): New defcustom and helper.
* lisp/progmodes/json-ts-mode.el (json-ts-mode-indent-style)
(json-ts-mode--set-indent-style, json-ts-mode): Enable custom indent
style.
* lisp/progmodes/typescript-ts-mode.el (typescript-ts-mode-indent-style)
(typescript-ts-mode--set-indent-style, typescript-ts-mode): Enable
custom indent style.
* lisp/progmodes/css.el (css-ts-mode-indent-style)
(css--treesit-set-indent-style, css-ts-mode): New defcustom and
helper.
---
 lisp/progmodes/c-ts-mode.el          |  2 +-
 lisp/progmodes/csharp-mode.el        | 21 ++++++++++++++++++++-
 lisp/progmodes/java-ts-mode.el       | 21 ++++++++++++++++++++-
 lisp/progmodes/js.el                 | 21 ++++++++++++++++++++-
 lisp/progmodes/json-ts-mode.el       | 21 ++++++++++++++++++++-
 lisp/progmodes/typescript-ts-mode.el | 21 ++++++++++++++++++++-
 lisp/textmodes/css-mode.el           | 21 ++++++++++++++++++++-
 7 files changed, 121 insertions(+), 7 deletions(-)

diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
index fc35d9aedd..c384182772 100644
--- a/lisp/progmodes/c-ts-mode.el
+++ b/lisp/progmodes/c-ts-mode.el
@@ -52,7 +52,7 @@ c-ts-mode-indent-style
 
 The selected style could be one of GNU, K&R, LINUX or BSD.  If
 one of the supplied styles doesn't suffice a function could be
-set instead.  This function is expected return a list that
+set instead.  This function is expected to return a list that
 follows the form of `treesit-simple-indent-rules'."
   :version "29.1"
   :type '(choice (symbol :tag "Gnu" 'gnu)
diff --git a/lisp/progmodes/csharp-mode.el b/lisp/progmodes/csharp-mode.el
index a544a4b5cb..a6373b5826 100644
--- a/lisp/progmodes/csharp-mode.el
+++ b/lisp/progmodes/csharp-mode.el
@@ -696,6 +696,24 @@ csharp-ts-mode-indent-offset
   :safe 'integerp
   :group 'csharp)
 
+(defcustom csharp-ts-mode-indent-style 'csharp-ts-mode--default-style
+  "Style used for indentation.
+
+The selected style could either be the default style, or a
+function could be set instead.  This function is expected to
+return a list that follows the form of
+`treesit-simple-indent-rules'."
+  :version "29.1"
+  :type '(choice (symbol :tag "Default" 'csharp-ts-mode--default-style)
+                 (function :tag "A function for user customized style" ignore))
+  :group 'csharp)
+
+(defun csharp-ts-mode--set-indent-style ()
+  "Helper function to set indentation style."
+  (if (functionp csharp-ts-mode-indent-style)
+      (funcall csharp-ts-mode-indent-style)
+    csharp-ts-mode--indent-rules))
+
 (defvar csharp-ts-mode--indent-rules
   `((c-sharp
      ((parent-is "compilation_unit") parent-bol 0)
@@ -962,7 +980,8 @@ csharp-ts-mode
   (setq-local comment-end "")
 
   ;; Indent.
-  (setq-local treesit-simple-indent-rules csharp-ts-mode--indent-rules)
+  (setq-local treesit-simple-indent-rules
+              (csharp-ts-mode--set-indent-style))
 
   ;; Electric
   (setq-local electric-indent-chars
diff --git a/lisp/progmodes/java-ts-mode.el b/lisp/progmodes/java-ts-mode.el
index ee2934f53c..29de2ccb28 100644
--- a/lisp/progmodes/java-ts-mode.el
+++ b/lisp/progmodes/java-ts-mode.el
@@ -42,6 +42,24 @@ java-ts-mode-indent-offset
   :safe 'integerp
   :group 'java)
 
+(defcustom java-ts-mode-indent-style 'java-ts-mode--default-style
+  "Style used for indentation.
+
+The selected style could either be the default style, or a
+function could be set instead.  This function is expected to
+return a list that follows the form of
+`treesit-simple-indent-rules'."
+  :version "29.1"
+  :type '(choice (symbol :tag "Default" 'java-ts-mode--default-style)
+                 (function :tag "A function for user customized style" ignore))
+  :group 'java)
+
+(defun java-ts-mode--set-indent-style ()
+  "Helper function to set indentation style."
+  (if (functionp java-ts-mode-indent-style)
+      (funcall java-ts-mode-indent-style)
+    java-ts-mode--indent-rules))
+
 (defvar java-ts-mode--syntax-table
   (let ((table (make-syntax-table)))
     ;; Taken from the cc-langs version
@@ -305,7 +323,8 @@ java-ts-mode
   (setq-local treesit-comment-end (rx (+ (or "*")) "/"))
 
   ;; Indent.
-  (setq-local treesit-simple-indent-rules java-ts-mode--indent-rules)
+  (setq-local treesit-simple-indent-rules
+              (java-ts-mode--set-indent-style))
 
   ;; Electric
   (setq-local electric-indent-chars
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index da05b7b364..9535d4986f 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -3457,6 +3457,24 @@ js--treesit-indent-rules
        ((node-is "/") parent 0)
        ((parent-is "jsx_self_closing_element") parent js-indent-level)))))
 
+(defcustom js-ts-mode-indent-style 'js--treesit-default-style
+  "Style used for indentation.
+
+The selected style could either be the default style, or a
+function could be set instead.  This function is expected to
+return a list that follows the form of
+`treesit-simple-indent-rules'."
+  :version "29.1"
+  :type '(choice (symbol :tag "Default" 'js--treesit-default-style)
+                 (function :tag "A function for user customized style" ignore))
+  :group 'javascript)
+
+(defun js--treesit-set-indent-style ()
+  "Helper function to set indentation style."
+  (if (functionp js-ts-mode-indent-style)
+      (funcall js-ts-mode-indent-style)
+    js--treesit-indent-rules))
+
 (defvar js--treesit-keywords
   '("as" "async" "await" "break" "case" "catch" "class" "const" "continue"
     "debugger" "default" "delete" "do" "else" "export" "extends" "finally"
@@ -3862,7 +3880,8 @@ js-ts-mode
     ;; Tree-sitter setup.
     (treesit-parser-create 'javascript)
     ;; Indent.
-    (setq-local treesit-simple-indent-rules js--treesit-indent-rules)
+    (setq-local treesit-simple-indent-rules
+                (js--treesit-set-indent-style))
     ;; Navigation.
     (setq-local treesit-defun-type-regexp
                 (rx (or "class_declaration"
diff --git a/lisp/progmodes/json-ts-mode.el b/lisp/progmodes/json-ts-mode.el
index 101e873cf6..4ee2cad9da 100644
--- a/lisp/progmodes/json-ts-mode.el
+++ b/lisp/progmodes/json-ts-mode.el
@@ -44,6 +44,24 @@ json-ts-mode-indent-offset
   :safe 'integerp
   :group 'json)
 
+(defcustom json-ts-mode-indent-style 'json-ts-mode--default-style
+  "Style used for indentation.
+
+The selected style could either be the default style, or a
+function could be set instead.  This function is expected to
+return a list that follows the form of
+`treesit-simple-indent-rules'."
+  :version "29.1"
+  :type '(choice (symbol :tag "Default" 'json-ts-mode--default-style)
+                 (function :tag "A function for user customized style" ignore))
+  :group 'json)
+
+(defun json-ts-mode--set-indent-style ()
+  "Helper function to set indentation style."
+  (if (functionp json-ts-mode-indent-style)
+      (funcall json-ts-mode-indent-style)
+    json-ts-mode--indent-rules))
+
 (defvar json-ts-mode--syntax-table
   (let ((table (make-syntax-table)))
     ;; Taken from the cc-langs version
@@ -147,7 +165,8 @@ json-ts-mode
               (append "{}():;," electric-indent-chars))
 
   ;; Indent.
-  (setq-local treesit-simple-indent-rules json-ts--indent-rules)
+  (setq-local treesit-simple-indent-rules
+              (json-ts-mode--set-indent-style))
 
   ;; Navigation.
   (setq-local treesit-defun-type-regexp
diff --git a/lisp/progmodes/typescript-ts-mode.el b/lisp/progmodes/typescript-ts-mode.el
index 763686bf66..106b8363f0 100644
--- a/lisp/progmodes/typescript-ts-mode.el
+++ b/lisp/progmodes/typescript-ts-mode.el
@@ -37,6 +37,24 @@ typescript-ts-mode-indent-offset
   :safe 'integerp
   :group 'typescript)
 
+(defcustom typescript-ts-mode-indent-style 'typescript-ts-mode--default-style
+  "Style used for indentation.
+
+The selected style could either be the default style, or a
+function could be set instead.  This function is expected to
+return a list that follows the form of
+`treesit-simple-indent-rules'."
+  :version "29.1"
+  :type '(choice (symbol :tag "Default" 'typescript-ts-mode--default-style)
+                 (function :tag "A function for user customized style" ignore))
+  :group 'typescript)
+
+(defun typescript-ts-mode--set-indent-style ()
+  "Helper function to set indentation style."
+  (if (functionp typescript-ts-mode-indent-style)
+      (funcall typescript-ts-mode-indent-style)
+    typescript-ts-mode--indent-rules))
+
 (defvar typescript-ts-mode--syntax-table
   (let ((table (make-syntax-table)))
     ;; Taken from the cc-langs version
@@ -308,7 +326,8 @@ typescript-ts-mode
                 (append "{}():;," electric-indent-chars))
 
     ;; Indent.
-    (setq-local treesit-simple-indent-rules typescript-ts-mode--indent-rules)
+    (setq-local treesit-simple-indent-rules
+                (typescript-ts-mode--set-indent-style))
 
     ;; Navigation.
     (setq-local treesit-defun-type-regexp
diff --git a/lisp/textmodes/css-mode.el b/lisp/textmodes/css-mode.el
index 734252ee66..eaf3fec939 100644
--- a/lisp/textmodes/css-mode.el
+++ b/lisp/textmodes/css-mode.el
@@ -1343,6 +1343,24 @@ css--treesit-indent-rules
      ((match nil "declaration" nil 3) (nth-sibling 2) 0)))
   "Tree-sitter indentation rules for `css-ts-mode'.")
 
+(defcustom css-ts-mode-indent-style 'css--treesit-default-style
+  "Style used for indentation.
+
+The selected style could either be the default style, or a
+function could be set instead.  This function is expected to
+return a list that follows the form of
+`treesit-simple-indent-rules'."
+  :version "29.1"
+  :type '(choice (symbol :tag "Default" 'css--treesit-default-style)
+                 (function :tag "A function for user customized style" ignore))
+  :group 'css)
+
+(defun css--treesit-set-indent-style ()
+  "Helper function to set indentation style."
+  (if (functionp css-ts-mode-indent-style)
+      (funcall css-ts-mode-indent-style)
+    css--treesit-indent-rules))
+
 (defvar css--treesit-settings
   (treesit-font-lock-rules
    :feature 'comment
@@ -1804,7 +1822,8 @@ css-ts-mode
 
     ;; Tree-sitter specific setup.
     (treesit-parser-create 'css)
-    (setq-local treesit-simple-indent-rules css--treesit-indent-rules)
+    (setq-local treesit-simple-indent-rules
+                (css--treesit-set-indent-style))
     (setq-local treesit-defun-type-regexp "rule_set")
     (setq-local treesit-font-lock-settings css--treesit-settings)
     (setq-local treesit-font-lock-feature-list
-- 
2.34.1