branch: externals/matlab-mode
commit f70315c300a897e1f6799e1cd879667349bdaf1f
Author: John Ciolfi <[email protected]>
Commit: John Ciolfi <[email protected]>
matlab-ts-mode-ei: handle 5 .^ 5, update struct alignment
---
matlab-ts-mode--ei.el | 17 +++++++++----
.../electric_indent_element_wise_power.m | 12 +++++++++
.../electric_indent_element_wise_power_expected.m | 12 +++++++++
...ctric_indent_element_wise_power_expected_msgs.m | 12 +++++++++
.../electric_indent_struct_no_cont.m | 10 ++++++++
.../electric_indent_struct_no_cont_expected.m | 10 ++++++++
.../electric_indent_struct_no_cont_expected_msgs.m | 10 ++++++++
.../electric_indent_struct_on_next_line.m | 9 +++++++
.../electric_indent_struct_on_next_line_expected.m | 9 +++++++
...tric_indent_struct_on_next_line_expected_msgs.m | 9 +++++++
.../electric_indent_element_wise_power.m | 12 +++++++++
...electric_indent_element_wise_power_expected.txt | 15 +++++++++++
.../electric_indent_struct_no_cont.m | 10 ++++++++
.../electric_indent_struct_no_cont_expected.txt | 29 ++++++++++++++++++++++
.../electric_indent_struct_on_next_line.m | 9 +++++++
...lectric_indent_struct_on_next_line_expected.txt | 24 ++++++++++++++++++
16 files changed, 204 insertions(+), 5 deletions(-)
diff --git a/matlab-ts-mode--ei.el b/matlab-ts-mode--ei.el
index 4fe000d4f4..5b6225bcf1 100644
--- a/matlab-ts-mode--ei.el
+++ b/matlab-ts-mode--ei.el
@@ -119,6 +119,9 @@
("." ,(rx bos (or ".?" "'" ".'") eos)
0)
(,(rx bos ".?" eos) "."
0)
+ ;; Case 10 .^ a (must have a space between a number an dot to avoid
changing node type)
+ (,(rx bos "number" eos) ,(rx bos ".^" eos)
1)
+
;; Case: power and transpose: a^b a.^b
(,matlab-ts-mode--ei-val-re (,(rx bos (or "^" ".^") eos) .
,matlab-ts-mode--ei-val-re) 0)
@@ -1012,6 +1015,7 @@ If so return `(max-field-width . arguments-node), else
nil."
"Align multi-line struct.
TUPLE = (list struct-assign-node max-field-width arguments-node) where
See `matlab-ts-mode--ei-get-new-line' for EI-INFO."
+
(let* ((ei-line (nth 0 ei-info))
(struct-assign-node (nth 0 tuple))
(max-field-width (nth 1 tuple))
@@ -1023,9 +1027,9 @@ See `matlab-ts-mode--ei-get-new-line' for EI-INFO."
;; On "var = struct(........" line?
(let* ((eq-offset (string-match-p "=" ei-line))
(open-paren-offset (string-match-p "(" ei-line eq-offset))
- (arg (progn (string-match "\\([^ \t]+\\)" ei-line (1+
open-paren-offset))
- (match-string 0 ei-line))))
- (when (string-match-p (rx bos "...") arg) ;; skip continuations
+ (arg (when (string-match "\\([^ \t]+\\)" ei-line (1+
open-paren-offset))
+ (match-string 0 ei-line))))
+ (when (or (not arg) (string-match-p (rx bos "...") arg)) ;; skip
continuations
(cl-return-from matlab-ts-mode--ei-align-line-in-m-struct ei-info))
(setq comma-offset (string-match-p "," ei-line open-paren-offset)
new-comma-offset (+ 1 open-paren-offset max-field-width)))
@@ -1040,7 +1044,7 @@ See `matlab-ts-mode--ei-get-new-line' for EI-INFO."
(let ((first-node-in-line (nth 3 ei-info))
(arguments-node (nth 2 tuple)))
(when (not (equal (treesit-node-parent first-node-in-line)
arguments-node))
- ;; TopTester: xxx
+ ;; TopTester: electric_indent_struct_with_multiline_field_values.m
(cl-return-from matlab-ts-mode--ei-align-line-in-m-struct ei-info))))
(let ((n-spaces-to-add (- new-comma-offset comma-offset)))
@@ -1108,7 +1112,10 @@ Note, \\='m-struct returns (list assignment-node
max-field-width arguments-node)
(when (and (string= (treesit-node-type next-node)
"function_call")
(string= (treesit-node-text
(treesit-node-child-by-field-name
next-node "name"))
- "struct"))
+ "struct")
+ ;; TopTester:
electric_indent_struct_on_next_line.m
+ (= (line-number-at-pos (treesit-node-start
assign-node))
+ (line-number-at-pos (treesit-node-start
next-node))))
(let ((pair (matlab-ts-mode--ei-is-m-struct next-node)))
;; cdr => arguments
(when (and pair (> (car pair) 0)) ;; max-field-width >
0?
(list assign-node (car pair) (cdr pair))))))))))
diff --git
a/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_element_wise_power.m
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_element_wise_power.m
new file mode 100644
index 0000000000..b4ec787572
--- /dev/null
+++
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_element_wise_power.m
@@ -0,0 +1,12 @@
+% -*- matlab-ts -*-
+
+% .^ operator is element-wise power
+
+% MATLAB tree-sitter identifies 10. as a number, thus 10.^5 and 10 .^ 5 have
differnt node types.
+
+a = 5;
+b = 10;
+
+x = 10 .^ 5
+y = 10 .^ a;
+z = a.^b;
diff --git
a/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_element_wise_power_expected.m
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_element_wise_power_expected.m
new file mode 100644
index 0000000000..b4ec787572
--- /dev/null
+++
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_element_wise_power_expected.m
@@ -0,0 +1,12 @@
+% -*- matlab-ts -*-
+
+% .^ operator is element-wise power
+
+% MATLAB tree-sitter identifies 10. as a number, thus 10.^5 and 10 .^ 5 have
differnt node types.
+
+a = 5;
+b = 10;
+
+x = 10 .^ 5
+y = 10 .^ a;
+z = a.^b;
diff --git
a/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_element_wise_power_expected_msgs.m
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_element_wise_power_expected_msgs.m
new file mode 100644
index 0000000000..b276712d63
--- /dev/null
+++
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_element_wise_power_expected_msgs.m
@@ -0,0 +1,12 @@
+% -*- matlab-ts -*- % <{Matched rule: (matlab-ts-mode--i-top-level
matlab-ts-mode--column-0 0)}>
+
+% .^ operator is element-wise power % <{Matched rule:
(matlab-ts-mode--i-top-level matlab-ts-mode--column-0 0)}>
+
+% MATLAB tree-sitter identifies 10. as a number, thus 10.^5 and 10 .^ 5 have
differnt node types. % <{Matched rule: (matlab-ts-mode--i-top-level
matlab-ts-mode--column-0 0)}>
+
+a = 5; % <{Matched rule: (matlab-ts-mode--i-top-level
matlab-ts-mode--column-0 0)}>
+b = 10; % <{Matched rule: (matlab-ts-mode--i-top-level
matlab-ts-mode--column-0 0)}>
+
+x = 10 .^ 5 % <{Matched rule: (matlab-ts-mode--i-top-level
matlab-ts-mode--column-0 0)}>
+y = 10 .^ a; % <{Matched rule: (matlab-ts-mode--i-top-level
matlab-ts-mode--column-0 0)}>
+z = a.^b; % <{Matched rule: (matlab-ts-mode--i-top-level
matlab-ts-mode--column-0 0)}>
diff --git
a/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_no_cont.m
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_no_cont.m
new file mode 100644
index 0000000000..8522ffda13
--- /dev/null
+++
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_no_cont.m
@@ -0,0 +1,10 @@
+% -*- matlab-ts -*-
+
+% The MATLAB tree-sitter doesn't require "...", thus validate we handle
missing "..."
+
+% t-utils-test-indent: no-line-by-line-indent - line-by-line typing results in
error nodes
+
+myStruct.stateInfo(end +1) = struct(
+
+ 'fieldOne' , someThing || otherThing,
+ 'otherFieldTwo' ,'something');
diff --git
a/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_no_cont_expected.m
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_no_cont_expected.m
new file mode 100644
index 0000000000..f9a3f5ea2e
--- /dev/null
+++
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_no_cont_expected.m
@@ -0,0 +1,10 @@
+% -*- matlab-ts -*-
+
+% The MATLAB tree-sitter doesn't require "...", thus validate we handle
missing "..."
+
+% t-utils-test-indent: no-line-by-line-indent - line-by-line typing results in
error nodes
+
+myStruct.stateInfo(end + 1) = struct(
+
+ 'fieldOne' , someThing || otherThing,
+ 'otherFieldTwo', 'something');
diff --git
a/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_no_cont_expected_msgs.m
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_no_cont_expected_msgs.m
new file mode 100644
index 0000000000..96d8ab485d
--- /dev/null
+++
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_no_cont_expected_msgs.m
@@ -0,0 +1,10 @@
+% -*- matlab-ts -*- % <{Matched rule: (matlab-ts-mode--i-top-level
matlab-ts-mode--column-0 0)}>
+
+% The MATLAB tree-sitter doesn't require "...", thus validate we handle
missing "..." % <{Matched rule: (matlab-ts-mode--i-top-level
matlab-ts-mode--column-0 0)}>
+
+% t-utils-test-indent: no-line-by-line-indent - line-by-line typing results in
error nodes % <{Matched rule: (matlab-ts-mode--i-top-level
matlab-ts-mode--column-0 0)}>
+
+myStruct.stateInfo(end + 1) = struct( % <{Matched rule:
(matlab-ts-mode--i-top-level matlab-ts-mode--column-0 0)}>
+
+ 'fieldOne' , someThing || otherThing, % <{Matched rule: ((n-p-gp nil
nil "\\`assignment\\'") grand-parent 4)}>
+ 'otherFieldTwo', 'something'); % <{Matched rule: ((parent-is
"\\`arguments\\'") parent 0)}>
diff --git
a/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_on_next_line.m
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_on_next_line.m
new file mode 100644
index 0000000000..231afb400a
--- /dev/null
+++
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_on_next_line.m
@@ -0,0 +1,9 @@
+% -*- matlab-ts -*-
+
+% For now we require struct be on the assignment line for alignment of the
fields
+
+% t-utils-test-indent: no-line-by-line-indent - line-by-line typing results in
error nodes
+
+myStruct.stateInfo(end + 1) = ...
+ struct('foo', 1, ...
+ 'otherFieldTwo' ,'something');
diff --git
a/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_on_next_line_expected.m
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_on_next_line_expected.m
new file mode 100644
index 0000000000..ebc9b2fa6c
--- /dev/null
+++
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_on_next_line_expected.m
@@ -0,0 +1,9 @@
+% -*- matlab-ts -*-
+
+% For now we require struct be on the assignment line for alignment of the
fields
+
+% t-utils-test-indent: no-line-by-line-indent - line-by-line typing results in
error nodes
+
+myStruct.stateInfo(end + 1) = ...
+ struct('foo', 1, ...
+ 'otherFieldTwo', 'something');
diff --git
a/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_on_next_line_expected_msgs.m
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_on_next_line_expected_msgs.m
new file mode 100644
index 0000000000..2fd52f64ef
--- /dev/null
+++
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_on_next_line_expected_msgs.m
@@ -0,0 +1,9 @@
+% -*- matlab-ts -*- % <{Matched rule: (matlab-ts-mode--i-top-level
matlab-ts-mode--column-0 0)}>
+
+% For now we require struct be on the assignment line for alignment of the
fields % <{Matched rule: (matlab-ts-mode--i-top-level matlab-ts-mode--column-0
0)}>
+
+% t-utils-test-indent: no-line-by-line-indent - line-by-line typing results in
error nodes % <{Matched rule: (matlab-ts-mode--i-top-level
matlab-ts-mode--column-0 0)}>
+
+myStruct.stateInfo(end + 1) = ... % <{Matched rule:
(matlab-ts-mode--i-top-level matlab-ts-mode--column-0 0)}>
+ struct('foo', 1, ... % <{Matched rule: ((parent-is "\\`assignment\\'")
parent 4)}>
+ 'otherFieldTwo', 'something'); % <{Matched rule: ((parent-is
"\\`arguments\\'") parent 0)}>
diff --git
a/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_element_wise_power.m
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_element_wise_power.m
new file mode 100644
index 0000000000..b4ec787572
--- /dev/null
+++
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_element_wise_power.m
@@ -0,0 +1,12 @@
+% -*- matlab-ts -*-
+
+% .^ operator is element-wise power
+
+% MATLAB tree-sitter identifies 10. as a number, thus 10.^5 and 10 .^ 5 have
differnt node types.
+
+a = 5;
+b = 10;
+
+x = 10 .^ 5
+y = 10 .^ a;
+z = a.^b;
diff --git
a/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_element_wise_power_expected.txt
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_element_wise_power_expected.txt
new file mode 100644
index 0000000000..0c684e7b9a
--- /dev/null
+++
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_element_wise_power_expected.txt
@@ -0,0 +1,15 @@
+# -*- t-utils-ts-parse-tree -*-
+(source_file<1,209> (comment[1,20]@{% -*- matlab-ts -*-}@) (comment[22,57]@{%
.^ operator is element-wise power}@) (comment[59,156]@{% MATLAB tree-sitter
identifies 10. as a number, t...}@)
+ (assignment<158,163> left: (identifier[158,159]@{a}@) =[160,161] right:
(number[162,163]@{5}@))
+ ;[163,164]
+ (assignment<165,171> left: (identifier[165,166]@{b}@) =[167,168] right:
(number[169,171]@{10}@))
+ ;[171,172]
+ (assignment<174,185> left: (identifier[174,175]@{x}@) =[176,177]
+ right: (binary_operator<178,185> left: (number[178,180]@{10}@) .^[181,183]
right: (number[184,185]@{5}@)))
+ \n[185,186]
+ (assignment<186,197> left: (identifier[186,187]@{y}@) =[188,189]
+ right: (binary_operator<190,197> left: (number[190,192]@{10}@) .^[193,195]
right: (identifier[196,197]@{a}@)))
+ ;[197,198]
+ (assignment<199,207> left: (identifier[199,200]@{z}@) =[201,202]
+ right: (binary_operator<203,207> left: (identifier[203,204]@{a}@)
.^[204,206] right: (identifier[206,207]@{b}@)))
+ ;[207,208] \n[208,209])
diff --git
a/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_no_cont.m
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_no_cont.m
new file mode 100644
index 0000000000..8522ffda13
--- /dev/null
+++
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_no_cont.m
@@ -0,0 +1,10 @@
+% -*- matlab-ts -*-
+
+% The MATLAB tree-sitter doesn't require "...", thus validate we handle
missing "..."
+
+% t-utils-test-indent: no-line-by-line-indent - line-by-line typing results in
error nodes
+
+myStruct.stateInfo(end +1) = struct(
+
+ 'fieldOne' , someThing || otherThing,
+ 'otherFieldTwo' ,'something');
diff --git
a/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_no_cont_expected.txt
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_no_cont_expected.txt
new file mode 100644
index 0000000000..ba1b098372
--- /dev/null
+++
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_no_cont_expected.txt
@@ -0,0 +1,29 @@
+# -*- t-utils-ts-parse-tree -*-
+(source_file<1,325> (comment[1,20]@{% -*- matlab-ts -*-}@) (comment[22,107]@{%
The MATLAB tree-sitter doesn't require "...", th...}@) (comment[109,199]@{%
t-utils-test-indent: no-line-by-line-indent - li...}@)
+ (assignment<201,323>
+ left:
+ (field_expression<201,227> object: (identifier[201,209]@{myStruct}@)
.[209,210]
+ field:
+ (function_call<210,227> name: (identifier[210,219]@{stateInfo}@)
([219,220]
+ (arguments<220,226>
+ argument:
+ (binary_operator<220,226>
+ left: (end_keyword<220,223> end[220,223])
+ +[224,225] right: (number[225,226]@{1}@)))
+ )[226,227]))
+ =[228,229]
+ right:
+ (function_call<230,323> name: (identifier[230,236]@{struct}@) ([236,237]
+ (arguments<246,322>
+ argument: (string<246,256> '[246,247]
(string_content[247,255]@{fieldOne}@) '[255,256])
+ ,[257,258]
+ (boolean_operator<259,285>
+ left: (_expression<259,268> (identifier[259,268]@{someThing}@))
+ ||[269,271]
+ right: (_expression<275,285> (identifier[275,285]@{otherThing}@)))
+ ,[285,286]
+ (string<291,306> '[291,292] (string_content[292,305]@{otherFieldTwo}@)
'[305,306])
+ ,[310,311]
+ (string<311,322> '[311,312] (string_content[312,321]@{something}@)
'[321,322]))
+ )[322,323]))
+ ;[323,324] \n[324,325])
diff --git
a/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_on_next_line.m
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_on_next_line.m
new file mode 100644
index 0000000000..231afb400a
--- /dev/null
+++
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_on_next_line.m
@@ -0,0 +1,9 @@
+% -*- matlab-ts -*-
+
+% For now we require struct be on the assignment line for alignment of the
fields
+
+% t-utils-test-indent: no-line-by-line-indent - line-by-line typing results in
error nodes
+
+myStruct.stateInfo(end + 1) = ...
+ struct('foo', 1, ...
+ 'otherFieldTwo' ,'something');
diff --git
a/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_on_next_line_expected.txt
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_on_next_line_expected.txt
new file mode 100644
index 0000000000..f4bffcfc34
--- /dev/null
+++
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_on_next_line_expected.txt
@@ -0,0 +1,24 @@
+# -*- t-utils-ts-parse-tree -*-
+(source_file<1,305> (comment[1,20]@{% -*- matlab-ts -*-}@) (comment[22,103]@{%
For now we require struct be on the assignment l...}@) (comment[105,195]@{%
t-utils-test-indent: no-line-by-line-indent - li...}@)
+ (assignment<197,303>
+ left:
+ (field_expression<197,224> object: (identifier[197,205]@{myStruct}@)
.[205,206]
+ field:
+ (function_call<206,224> name: (identifier[206,215]@{stateInfo}@)
([215,216]
+ (arguments<216,223>
+ argument:
+ (binary_operator<216,223>
+ left: (end_keyword<216,219> end[216,219])
+ +[220,221] right: (number[222,223]@{1}@)))
+ )[223,224]))
+ =[225,226] (line_continuation[227,231]@{...\n}@)
+ right:
+ (function_call<235,303> name: (identifier[235,241]@{struct}@) ([241,242]
+ (arguments<242,302>
+ argument: (string<242,247> '[242,243] (string_content[243,246]@{foo}@)
'[246,247])
+ ,[247,248] (number[249,250]@{1}@) ,[250,251]
(line_continuation[252,256]@{...\n}@)
+ (string<271,286> '[271,272] (string_content[272,285]@{otherFieldTwo}@)
'[285,286])
+ ,[290,291]
+ (string<291,302> '[291,292] (string_content[292,301]@{something}@)
'[301,302]))
+ )[302,303]))
+ ;[303,304] \n[304,305])