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

Reply via email to