]> git.eshelyaron.com Git - emacs.git/commitdiff
Refine handling of node at point in treesit-indent
authorYuan Fu <casouri@gmail.com>
Sat, 29 Oct 2022 16:43:50 +0000 (09:43 -0700)
committerYuan Fu <casouri@gmail.com>
Sat, 29 Oct 2022 16:43:50 +0000 (09:43 -0700)
* doc/lispref/modes.texi (Parser-based Indentation): Document the
semantic clearly.
* lisp/treesit.el (treesit-simple-indent-presets): Replace with
current-indentation.
(treesit--indent-1): Now NODE always starts at BOL, and parent is
always the smallest node above NODE that spans BOL.
(treesit-indent): Don't use save-excurtion, no one else does.

doc/lispref/modes.texi
lisp/treesit.el

index f58725242244ff732eab605f828a40549115f600..6212c7cd87f1920451b2441d9d106213047fad3b 100644 (file)
@@ -4806,7 +4806,12 @@ arguments: @var{node}, @var{parent}, and @var{bol}.  The argument
 position of the first non-whitespace character after the beginning of
 the line.  The argument @var{node} is the largest (highest-in-tree)
 node that starts at that position; and @var{parent} is the parent of
-@var{node}.  Emacs finds @var{bol}, @var{node} and @var{parent} and
+@var{node}.  However, when that position is on a whitespace or inside
+a multi-line string, no node that starts at that position, so
+@var{node} is @code{nil}.  In that case, @var{parent} would be the
+smallest node that spans that position.
+
+Emacs finds @var{bol}, @var{node} and @var{parent} and
 passes them to each @var{matcher} and @var{anchor}.  @var{matcher}
 should return non-@code{nil} if the rule is applicable, and
 @var{anchor} should return a buffer position.
index 22d1fe5f89bdd51da36fb24b00175013a5c677e8..dd0aca50494f172fe28369c6e3eb1608e6c5fc35 100644 (file)
@@ -783,8 +783,7 @@ See `treesit-simple-indent-presets'.")
                     (lambda (_n parent &rest _)
                       (save-excursion
                         (goto-char (treesit-node-start parent))
-                        (back-to-indentation)
-                        (point)))))
+                        (current-indentation)))))
     (prev-sibling . ,(byte-compile
                       (lambda (node &rest _)
                         (treesit-node-start
@@ -951,7 +950,7 @@ Return (ANCHOR . OFFSET).  This function is used by
          (smallest-node
           (cond ((null (treesit-parser-list)) nil)
                 ((eq 1 (length (treesit-parser-list)))
-                 (treesit-node-at bol))
+                 (treesit-node-at bol nil nil t))
                 ((treesit-language-at (point))
                  (treesit-node-at bol (treesit-language-at (point))))
                 (t (treesit-node-at bol))))
@@ -968,26 +967,19 @@ Return (ANCHOR . OFFSET).  This function is used by
          ;; encompass the whitespace.
          (parent (cond ((and node parser)
                         (treesit-node-parent node))
-                       (parser
-                        (treesit-node-at bol parser))
-                       (t nil))))
+                       (t (treesit-node-on bol bol)))))
       (funcall treesit-indent-function node parent bol))))
 
 (defun treesit-indent ()
   "Indent according to the result of `treesit-indent-function'."
   (treesit-update-ranges)
-  (pcase-let* ((orig-pos (point))
-               (bol (current-indentation))
-               (`(,anchor . ,offset) (treesit--indent-1)))
+  (pcase-let* ((`(,anchor . ,offset) (treesit--indent-1)))
     (when (and anchor offset)
       (let ((col (+ (save-excursion
                       (goto-char anchor)
                       (current-column))
                     offset)))
-        (if (< bol orig-pos)
-            (save-excursion
-              (indent-line-to col))
-          (indent-line-to col))))))
+        (indent-line-to col)))))
 
 (defvar treesit--indent-region-batch-size 400
   "How many lines of indent value do we precompute.