branch: externals/matlab-mode
commit 5088cc4bd3eb9830571ce0e6ebfe0a60a1d7d644
Author: John Ciolfi <[email protected]>
Commit: John Ciolfi <[email protected]>

    matlab-ts-mode.el: optimize assignment alignment for indent-region
---
 matlab-ts-mode.el | 93 ++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 57 insertions(+), 36 deletions(-)

diff --git a/matlab-ts-mode.el b/matlab-ts-mode.el
index 0ec96027d5..2e39c39b9a 100644
--- a/matlab-ts-mode.el
+++ b/matlab-ts-mode.el
@@ -3271,7 +3271,7 @@ or nil."
       (list ei-line line-offset line-node-types first-node))))
 
 (defun matlab-ts-mode--ei-is-assign (node)
-  "Is NODE the first node of a single-line assignmnet?"
+  "Is NODE the first node of a single-line assignment?"
   (let ((parent (treesit-node-parent node)))
     (while (and parent
                 (not (string= (treesit-node-type parent) "assignment")))
@@ -3295,34 +3295,48 @@ or nil."
                     first-char-offset)))
     offset))
 
+(defvar-local matlab-ts-mode--ei-align-assign-alist nil)
+
 (defun matlab-ts-mode--ei-align-assignments (ei-info)
-  "Update EI-INfO to align assignments.
-See `matlab-ts-mode--ei-get-new-line' for EI-INFO."
+  "Update EI-INFO to align assignments.
+See `matlab-ts-mode--ei-get-new-line' for EI-INFO contents."
   (let ((first-node-in-line (nth 3 ei-info)))
     (when (matlab-ts-mode--ei-is-assign first-node-in-line)
       (let* ((ei-line (nth 0 ei-info))
              (line-assign-offset (matlab-ts-mode--ei-assign-offset ei-line))
-             (assign-offset line-assign-offset)
+             assign-offset
+             line-nums
              line-start-pt)
-        (save-excursion
-          (beginning-of-line)
-          (setq line-start-pt (point))
-
-          ;; Look backwards and then forwards for single-line assignments
-          (cl-loop
-           for direction in '(-1 1) do
-           (goto-char line-start-pt)
-           (cl-loop
-            while (not (if (= direction -1) (bobp) (eobp))) do
-            (forward-line direction)
-            (let* ((l-info (matlab-ts-mode--ei-get-new-line))
-                   (l-first-node (nth 3 l-info)))
-              (if (and l-first-node
-                       (matlab-ts-mode--ei-is-assign l-first-node))
-                  (let ((l-offset (matlab-ts-mode--ei-assign-offset (nth 0 
l-info))))
-                    (when (> l-offset assign-offset)
-                      (setq assign-offset l-offset)))
+
+        (when (or (not matlab-ts-mode--ei-align-assign-alist)
+                  (not (setq assign-offset (alist-get (line-number-at-pos)
+                                                      
matlab-ts-mode--ei-align-assign-alist))))
+          (setq assign-offset line-assign-offset)
+          (setq line-nums `(,(line-number-at-pos)))
+          (save-excursion
+            (beginning-of-line)
+            (setq line-start-pt (point))
+
+            ;; Look backwards and then forwards for single-line assignments
+            (cl-loop
+             for direction in '(-1 1) do
+             (goto-char line-start-pt)
+             (cl-loop
+              while (not (if (= direction -1) (bobp) (eobp))) do
+              (forward-line direction)
+              (let* ((l-info (matlab-ts-mode--ei-get-new-line))
+                     (l-first-node (nth 3 l-info)))
+                (if (and l-first-node
+                         (matlab-ts-mode--ei-is-assign l-first-node))
+                    (let ((l-offset (matlab-ts-mode--ei-assign-offset (nth 0 
l-info))))
+                      (push (line-number-at-pos) line-nums)
+                      (when (> l-offset assign-offset)
+                        (setq assign-offset l-offset)))
                   (cl-return))))))
+          (when matlab-ts-mode--ei-align-assign-alist
+            (dolist (line-num line-nums)
+              (push `(,line-num . ,assign-offset) 
matlab-ts-mode--ei-align-assign-alist))))
+
         (let ((diff (- assign-offset line-assign-offset)))
           (when (> diff 0)
             (let* ((loc (1- (string-match "=" ei-line)))
@@ -3405,21 +3419,27 @@ line is updated.  Returns t if line was updated."
          (curr-line start-line)
          (end-line (line-number-at-pos end)))
 
-    ;; TODO optimize assignment alignment to compute once
     (when matlab-ts-mode-electric-indent
-      (save-excursion
-        (goto-char beg)
-        (while (<= curr-line end-line)
-          (beginning-of-line)
-          (matlab-ts-mode--indent-elements-in-line)
-          (forward-line)
-          (setq curr-line (1+ curr-line)))
-        (goto-char (point-min))
-        (forward-line (1- start-line))
-        (setq beg (point))
-        (goto-char (point-min))
-        (forward-line end-line)
-        (setq end (point))))
+      (unwind-protect
+          (progn
+            ;; Add invalid entry to matlab-ts-mode--ei-align-assign-alist as a 
marker to activate
+            ;; caching of computed offsets for assignment alignment.
+            (setq-local matlab-ts-mode--ei-align-assign-alist '((-1 . 0)))
+            (save-excursion
+              (goto-char beg)
+              (while (<= curr-line end-line)
+                (beginning-of-line)
+                (matlab-ts-mode--indent-elements-in-line)
+                (forward-line)
+                (setq curr-line (1+ curr-line)))
+              (goto-char (point-min))
+              (forward-line (1- start-line))
+              (setq beg (point))
+              (goto-char (point-min))
+              (forward-line end-line)
+              (setq end (point))))
+
+        (setq-local matlab-ts-mode--ei-align-assign-alist nil)))
 
     (treesit-indent-region beg end)))
 
@@ -5175,3 +5195,4 @@ matlab-language-server-lsp-mode.org\n"
 ;; LocalWords:  Keymap keymap netshell gud ebstop mlgud ebclear ebstatus mlg 
mlgud's subjob reindent
 ;; LocalWords:  DWIM dwim parens caar cdar utils fooenum mcode CRLF cmddual 
lang nconc listify kbd
 ;; LocalWords:  matlabls vscode buf dolist sp ppss bobp sexps pragmas curr ei 
isstring eol listp
+;; LocalWords:  nums

Reply via email to