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

    matlab-ts-mode: untabify when electric indent is active
---
 matlab-ts-mode--ei.el                                | 18 +++++++++++++++---
 .../electric_indent_tabs.m                           |  9 +++++++++
 .../electric_indent_tabs_expected.m                  |  9 +++++++++
 .../electric_indent_tabs_expected_msgs.m             |  9 +++++++++
 .../electric_indent_tabs.m                           |  9 +++++++++
 .../electric_indent_tabs_expected.txt                | 16 ++++++++++++++++
 .../electric_indent_xr_matrix_pt.m                   | 13 +++++++++++++
 .../electric_indent_xr_matrix_pt_expected.txt        | 20 ++++++++++++++++++++
 .../electric_indent_xr_prop_pt.m                     | 12 ++++++++++++
 .../electric_indent_xr_prop_pt_expected.txt          | 15 +++++++++++++++
 10 files changed, 127 insertions(+), 3 deletions(-)

diff --git a/matlab-ts-mode--ei.el b/matlab-ts-mode--ei.el
index f75089885a..6e1ae396e4 100644
--- a/matlab-ts-mode--ei.el
+++ b/matlab-ts-mode--ei.el
@@ -75,7 +75,9 @@
              foobar (1,1)           |          foobar (1,1)
              p1 (1,1)               |          p1     (1,1)
          end                        |      end
-     end                            |  end"
+     end                            |  end
+
+- Untabify (convert TAB characters to spaces)"
   :type 'boolean)
 
 (defvar matlab-ts-mode--electric-indent-verbose nil)
@@ -404,6 +406,16 @@ Assumes that current point is at `back-to-indentation'."
       line-node-types
     (concat line-node-types (when line-node-types " ") node-type)))
 
+(defun matlab-ts-mode--ei-get-indent-level-spaces ()
+  "Get indent-level spaces for current line expanding tabs."
+  (let ((spaces (buffer-substring (line-beginning-position) (point))))
+    (when (string-match "\t" spaces)
+      (setq spaces (with-temp-buffer
+                     (insert spaces)
+                     (untabify (point-min) (point-max))
+                     (buffer-string))))
+    spaces))
+
 (cl-defun matlab-ts-mode--ei-get-new-line (&optional start-node start-offset)
   "Get new line content with element spacing adjusted.
 Optional START-NODE and START-OFFSET are used to compute new pt-offset,
@@ -420,7 +432,7 @@ or nil."
 
     ;; Compute ei-line, the electric indented line content
     (let* (pt-offset ;; used in restoring point
-           (ei-line (buffer-substring (line-beginning-position) (point)))
+           (ei-line (matlab-ts-mode--ei-get-indent-level-spaces))
            (pair (matlab-ts-mode--ei-move-to-and-get-node))
            (node (or (car pair)
                      (cl-return-from matlab-ts-mode--ei-get-new-line)))
@@ -1119,4 +1131,4 @@ line is updated.  Returns t if line was updated."
 ;;; matlab-ts-mode--ei.el ends here
 
 ;; LocalWords:  SPDX gmail treesit defcustom bos eos isstring defun eol eobp 
setq curr cdr xr progn
-;; LocalWords:  listp alist dolist setf tmp buf utils linenum nums bobp pcase
+;; LocalWords:  listp alist dolist setf tmp buf utils linenum nums bobp pcase 
Untabify untabify
diff --git 
a/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_tabs.m 
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_tabs.m
new file mode 100644
index 0000000000..ac48345bad
--- /dev/null
+++ b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_tabs.m
@@ -0,0 +1,9 @@
+% -*- matlab-ts -*-
+
+% The assignment to x below has a TAB character starting the line and tab's in 
the line
+
+if 1
+    if 2
+       x       =a * b- c;      
+    end
+end
diff --git 
a/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_tabs_expected.m
 
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_tabs_expected.m
new file mode 100644
index 0000000000..5fb8656ab9
--- /dev/null
+++ 
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_tabs_expected.m
@@ -0,0 +1,9 @@
+% -*- matlab-ts -*-
+
+% The assignment to x below has a TAB character starting the line and tab's in 
the line
+
+if 1
+    if 2
+        x = a * b - c;
+    end
+end
diff --git 
a/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_tabs_expected_msgs.m
 
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_tabs_expected_msgs.m
new file mode 100644
index 0000000000..65e95c3ada
--- /dev/null
+++ 
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_tabs_expected_msgs.m
@@ -0,0 +1,9 @@
+% -*- matlab-ts -*- %  <{Matched rule: (matlab-ts-mode--i-top-level 
matlab-ts-mode--column-0 0)}>
+
+% The assignment to x below has a TAB character starting the line and tab's in 
the line %  <{Matched rule: (matlab-ts-mode--i-top-level 
matlab-ts-mode--column-0 0)}>
+
+if 1 %  <{Matched rule: (matlab-ts-mode--i-top-level matlab-ts-mode--column-0 
0)}>
+    if 2 %  <{Matched rule: ((node-is 
"\\`\\(?:arguments_statement\\|block\\|e\\(?:num\\(?:eration\\)?\\|vents\\)\\|function_definition\\|methods\\|propert\\(?:ies\\|y\\)\\)\\'")
 parent 4)}>
+        x = a * b - c; %  <{Matched rule: ((node-is 
"\\`\\(?:arguments_statement\\|block\\|e\\(?:num\\(?:eration\\)?\\|vents\\)\\|function_definition\\|methods\\|propert\\(?:ies\\|y\\)\\)\\'")
 parent 4)}>
+    end %  <{Matched rule: ((node-is 
"\\`\\(?:catch_clause\\|e\\(?:lse\\(?:\\(?:if\\)?_clause\\)\\|nd\\)\\)\\'") 
parent 0)}>
+end %  <{Matched rule: ((node-is 
"\\`\\(?:catch_clause\\|e\\(?:lse\\(?:\\(?:if\\)?_clause\\)\\|nd\\)\\)\\'") 
parent 0)}>
diff --git 
a/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_tabs.m
 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_tabs.m
new file mode 100644
index 0000000000..ac48345bad
--- /dev/null
+++ 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_tabs.m
@@ -0,0 +1,9 @@
+% -*- matlab-ts -*-
+
+% The assignment to x below has a TAB character starting the line and tab's in 
the line
+
+if 1
+    if 2
+       x       =a * b- c;      
+    end
+end
diff --git 
a/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_tabs_expected.txt
 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_tabs_expected.txt
new file mode 100644
index 0000000000..5b82c93f41
--- /dev/null
+++ 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_tabs_expected.txt
@@ -0,0 +1,16 @@
+# -*- t-utils-ts-parse-tree -*-
+(source_file<1,152> (comment[1,20]@{% -*- matlab-ts -*-}@) (comment[22,109]@{% 
The assignment to x below has a TAB character st...}@) \n[109,111]
+ (if_statement<111,151> if[111,113] condition: (number[114,115]@{1}@) 
\n[115,116]
+  (block<120,148>
+   (if_statement<120,147> if[120,122] condition: (number[123,124]@{2}@)
+    (block<126,140>
+     (assignment<126,137> left: (identifier[126,127]@{x}@) =[128,129]
+      right: 
+       (binary_operator<129,137>
+        left: (binary_operator<129,134> left: (identifier[129,130]@{a}@) 
*[131,132] right: (identifier[133,134]@{b}@))
+        -[134,135] right: (identifier[136,137]@{c}@)))
+     ;[137,138] \n[139,140])
+    end[144,147])
+   \n[147,148])
+  end[148,151])
+ \n[151,152])
diff --git 
a/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-xr-files/electric_indent_xr_matrix_pt.m
 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-xr-files/electric_indent_xr_matrix_pt.m
new file mode 100644
index 0000000000..5ba402fe28
--- /dev/null
+++ 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-xr-files/electric_indent_xr_matrix_pt.m
@@ -0,0 +1,13 @@
+% -*- matlab-ts -*-
+
+% case1: (t-utils-xr (re-search-forward "223") (backward-char 3) "C-i")
+
+m3a = [    21    ,          2, 223;
+          4, 53333,   6; ...
+       1222,     4,   5];
+
+% case2: (t-utils-xr (re-search-forward "444") "C-a" "C-i")
+
+m3b = [    21    ,          2, 223;
+            444, 53333, 6; ...
+       1222,     4,   5];
diff --git 
a/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-xr-files/electric_indent_xr_matrix_pt_expected.txt
 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-xr-files/electric_indent_xr_matrix_pt_expected.txt
new file mode 100644
index 0000000000..3be73e6022
--- /dev/null
+++ 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-xr-files/electric_indent_xr_matrix_pt_expected.txt
@@ -0,0 +1,20 @@
+# -*- t-utils-ts-parse-tree -*-
+(source_file<1,341> (comment[1,20]@{% -*- matlab-ts -*-}@) (comment[22,93]@{% 
case1: (t-utils-xr (re-search-forward "223") (ba...}@)
+ (assignment<95,184> left: (identifier[95,98]@{m3a}@) =[99,100]
+  right: 
+   (matrix<101,184> [[101,102]
+    (row<106,129> (number[106,108]@{21}@) ,[112,113] (number[123,124]@{2}@) 
,[124,125] (number[126,129]@{223}@))
+    (row<141,154> (number[141,142]@{4}@) ,[142,143] (number[144,149]@{53333}@) 
,[149,150] (number[153,154]@{6}@))
+    (line_continuation[156,160]@{...\n}@)
+    (row<167,183> (number[167,171]@{1222}@) ,[171,172] (number[177,178]@{4}@) 
,[178,179] (number[182,183]@{5}@))
+    ][183,184]))
+ ;[184,185] (comment[187,246]@{% case2: (t-utils-xr (re-search-forward "444") 
"C-...}@)
+ (assignment<248,339> left: (identifier[248,251]@{m3b}@) =[252,253]
+  right: 
+   (matrix<254,339> [[254,255]
+    (row<259,282> (number[259,261]@{21}@) ,[265,266] (number[276,277]@{2}@) 
,[277,278] (number[279,282]@{223}@))
+    (row<296,309> (number[296,299]@{444}@) ,[299,300] 
(number[301,306]@{53333}@) ,[306,307] (number[308,309]@{6}@))
+    (line_continuation[311,315]@{...\n}@)
+    (row<322,338> (number[322,326]@{1222}@) ,[326,327] (number[332,333]@{4}@) 
,[333,334] (number[337,338]@{5}@))
+    ][338,339]))
+ ;[339,340] \n[340,341])
diff --git 
a/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-xr-files/electric_indent_xr_prop_pt.m
 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-xr-files/electric_indent_xr_prop_pt.m
new file mode 100644
index 0000000000..7f8546e757
--- /dev/null
+++ 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-xr-files/electric_indent_xr_prop_pt.m
@@ -0,0 +1,12 @@
+% -*- matlab-ts -*-
+
+classdef electric_indent_xr_prop_pt
+    % case1: (t-utils-xr (re-search-forward "p1") "C-i")
+    properties
+        p1(1,3)
+           param2                (2,1)
+        x{mustBeReal}
+    end
+    % case2: (t-utils-xr "C-a" (re-search-backward "param2") "C-a" "C-i")
+end
+
diff --git 
a/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-xr-files/electric_indent_xr_prop_pt_expected.txt
 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-xr-files/electric_indent_xr_prop_pt_expected.txt
new file mode 100644
index 0000000000..44a55863e5
--- /dev/null
+++ 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-xr-files/electric_indent_xr_prop_pt_expected.txt
@@ -0,0 +1,15 @@
+# -*- t-utils-ts-parse-tree -*-
+(source_file<1,294> (comment[1,20]@{% -*- matlab-ts -*-}@) \n[20,22]
+ (class_definition<22,292> classdef[22,30] name: 
(identifier[31,57]@{electric_indent_xr_prop_pt}@) (comment[62,114]@{% case1: 
(t-utils-xr (re-search-forward "p1") "C-i...}@) \n[114,115]
+  (properties<119,214> properties[119,129] \n[129,130]
+   (property<138,145> name: (identifier[138,140]@{p1}@)
+    (dimensions<140,145> ([140,141] (number[141,142]@{1}@) ,[142,143] 
(number[143,144]@{3}@) )[144,145]))
+   \n[145,146]
+   (property<157,184> name: (identifier[157,163]@{param2}@)
+    (dimensions<179,184> ([179,180] (number[180,181]@{2}@) ,[181,182] 
(number[182,183]@{1}@) )[183,184]))
+   \n[184,185]
+   (property<193,206> name: (identifier[193,194]@{x}@)
+    (validation_functions<194,206> {[194,195] 
(identifier[195,205]@{mustBeReal}@) }[205,206]))
+   \n[206,207] end[211,214])
+  (comment[219,288]@{% case2: (t-utils-xr "C-a" (re-search-backward "pa...}@) 
\n[288,289] end[289,292])
+ \n[292,294])

Reply via email to