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