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

    matlab-ts-mode--ei: handle (a)(b) indexing, e.g. c1 = {s.('field1')(3)}
---
 matlab-ts-mode--ei.el                              | 23 +++++++----
 .../electric_indent_struct_index_in_cell.m         | 10 +++++
 ...electric_indent_struct_index_in_cell_expected.m | 10 +++++
 ...ric_indent_struct_index_in_cell_expected_msgs.m | 10 +++++
 .../electric_indent_struct_index_in_cell.m         | 10 +++++
 ...ectric_indent_struct_index_in_cell_expected.txt | 44 ++++++++++++++++++++++
 6 files changed, 100 insertions(+), 7 deletions(-)

diff --git a/matlab-ts-mode--ei.el b/matlab-ts-mode--ei.el
index 2dcd1859d3..53b5c67257 100644
--- a/matlab-ts-mode--ei.el
+++ b/matlab-ts-mode--ei.el
@@ -144,12 +144,15 @@
 
     (,(rx bos "]" eos)                ,(rx bos (or "," ";") eos)               
                  0)
     (,(rx bos "]" eos)                ,(rx bos "[" eos)                        
                  1)
-    ("."                              ,(rx bos (or "]" ")" "}") eos)           
                  0)
+    ("."                              ,(rx bos (or "]" ")" "}" "lambda-)") 
eos)                  0)
 
     ;; Case: ") identifier" as in: propName (1, 1) double
     ;;       arguments:  g (1,1) {mustBeNumeric, mustBeReal}
-    ;;       @(x) ((ischar(x) || isstring(x)));
-    (,(rx bos ")" eos)                ,(rx bos (or "identifier" "{" "(") eos)  
                  1)
+    (,(rx bos ")" eos)                ,(rx bos (or "identifier" "{") eos)      
                  1)
+
+    ;; Case: @(x) ((ischar(x) || isstring(x)));
+    ;;          ^
+    (,(rx bos "lambda-)" eos)         "."                                      
                  1)
 
     ;; Case: property identifier (the prop or class): propName (1,1) double
     (,(rx bos (or "prop-id" "prop-class-id") eos)   "."                        
                  1)
@@ -192,7 +195,8 @@
 
     ;; Case: c4{1} = [1 2; 3 4];
     ;;       v4 = [c4{1}(1,1), c4{1}(1,1)];
-    (,(rx bos "}" eos)                ,(rx bos (or "(" "{") eos)               
                  0)
+    ;;       {s.('field1')(3)}
+    (,(rx bos (or "}" ")") eos)       ,(rx bos (or "(" "{") eos)               
                  0)
 
     ;; Case: ")": m3 = uint8([ones(20,1); 2*ones(8,1)]);
     ;;                                 ^  ^
@@ -279,14 +283,19 @@ be unary-op even though the node type is \"+\"."
                (and (string= parent-type "spread_operator")
                     (string= (treesit-node-type (treesit-node-parent parent)) 
"dimensions"))))
       (setq node-type "prop-dim"))
-     
+
      ;; Case: events, enumeration, methods
      ((and (string-match-p (rx bos (or "events" "enumeration" "methods") eos) 
node-type)
            (string= parent-type "identifier"))
       ;; TopTester: electric_indent_inspect_keyword_commands.m
       ;; TopTester: electric_indent_inspect_keyword_commands2.m
-      (setq node-type (concat node-type "-fcn"))))
-    
+      (setq node-type (concat node-type "-fcn")))
+
+     ;; Case: lambda: @(x) ((ischar(x) || isstring(x)))
+     ;;                  ^
+     ((and (string= node-type ")") (string= parent-type "lambda"))
+      (setq node-type "lambda-)")))
+
     (cons node node-type)))
 
 (cl-defun matlab-ts-mode--ei-move-to-and-get-node ()
diff --git 
a/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_index_in_cell.m
 
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_index_in_cell.m
new file mode 100644
index 0000000000..f70d17c3df
--- /dev/null
+++ 
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_index_in_cell.m
@@ -0,0 +1,10 @@
+% -*- matlab-ts -*-
+
+s.field1 = 1 : 10;
+
+% Adding a space between the close and open parens, )(, would change the 
meaning.
+c1 = {s.('field1')(3)};
+
+c2 = {1 : 10};
+
+c3 = {c2{1}(2)};
diff --git 
a/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_index_in_cell_expected.m
 
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_index_in_cell_expected.m
new file mode 100644
index 0000000000..f70d17c3df
--- /dev/null
+++ 
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_index_in_cell_expected.m
@@ -0,0 +1,10 @@
+% -*- matlab-ts -*-
+
+s.field1 = 1 : 10;
+
+% Adding a space between the close and open parens, )(, would change the 
meaning.
+c1 = {s.('field1')(3)};
+
+c2 = {1 : 10};
+
+c3 = {c2{1}(2)};
diff --git 
a/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_index_in_cell_expected_msgs.m
 
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_index_in_cell_expected_msgs.m
new file mode 100644
index 0000000000..c3880698cf
--- /dev/null
+++ 
b/tests/test-matlab-ts-mode-electric-indent-files/electric_indent_struct_index_in_cell_expected_msgs.m
@@ -0,0 +1,10 @@
+% -*- matlab-ts -*- %  <{Matched rule: (matlab-ts-mode--i-top-level 
matlab-ts-mode--column-0 0)}>
+
+s.field1 = 1 : 10; %  <{Matched rule: (matlab-ts-mode--i-top-level 
matlab-ts-mode--column-0 0)}>
+
+% Adding a space between the close and open parens, )(, would change the 
meaning. %  <{Matched rule: (matlab-ts-mode--i-top-level 
matlab-ts-mode--column-0 0)}>
+c1 = {s.('field1')(3)}; %  <{Matched rule: (matlab-ts-mode--i-top-level 
matlab-ts-mode--column-0 0)}>
+
+c2 = {1 : 10}; %  <{Matched rule: (matlab-ts-mode--i-top-level 
matlab-ts-mode--column-0 0)}>
+
+c3 = {c2{1}(2)}; %  <{Matched rule: (matlab-ts-mode--i-top-level 
matlab-ts-mode--column-0 0)}>
diff --git 
a/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_index_in_cell.m
 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_index_in_cell.m
new file mode 100644
index 0000000000..f70d17c3df
--- /dev/null
+++ 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_index_in_cell.m
@@ -0,0 +1,10 @@
+% -*- matlab-ts -*-
+
+s.field1 = 1 : 10;
+
+% Adding a space between the close and open parens, )(, would change the 
meaning.
+c1 = {s.('field1')(3)};
+
+c2 = {1 : 10};
+
+c3 = {c2{1}(2)};
diff --git 
a/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_index_in_cell_expected.txt
 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_index_in_cell_expected.txt
new file mode 100644
index 0000000000..43a644f84b
--- /dev/null
+++ 
b/tests/test-matlab-ts-mode-parser-files/copy-of-test-matlab-ts-mode-electric-indent-files/electric_indent_struct_index_in_cell_expected.txt
@@ -0,0 +1,44 @@
+# -*- t-utils-ts-parse-tree -*-
+(source_file<1,182> (comment[1,20]@{% -*- matlab-ts -*-}@)
+ (assignment<22,39>
+  left: (field_expression<22,30> object: (identifier[22,23]@{s}@) .[23,24] 
field: (identifier[24,30]@{field1}@))
+  =[31,32]
+  right: (range<33,39> (number[33,34]@{1}@) :[35,36] (number[37,39]@{10}@)))
+ ;[39,40] (comment[42,123]@{% Adding a space between the close and open 
parens...}@)
+ (assignment<124,146> left: (identifier[124,126]@{c1}@) =[127,128]
+  right: 
+   (cell<129,146> {[129,130]
+    (row<130,145>
+     (field_expression<130,145> object: (identifier[130,131]@{s}@) .[131,132]
+      field: 
+       (function_call<132,145>
+        name: 
+         (indirect_access<132,142> ([132,133]
+          (string<133,141> '[133,134] (string_content[134,140]@{field1}@) 
'[140,141])
+          )[141,142])
+        ([142,143]
+        (arguments<143,144> argument: (number[143,144]@{3}@))
+        )[144,145])))
+    }[145,146]))
+ ;[146,147]
+ (assignment<149,162> left: (identifier[149,151]@{c2}@) =[152,153]
+  right: 
+   (cell<154,162> {[154,155]
+    (row<155,161>
+     (range<155,161> (number[155,156]@{1}@) :[157,158] 
(number[159,161]@{10}@)))
+    }[161,162]))
+ ;[162,163]
+ (assignment<165,180> left: (identifier[165,167]@{c3}@) =[168,169]
+  right: 
+   (cell<170,180> {[170,171]
+    (row<171,179>
+     (function_call<171,179>
+      name: 
+       (function_call<171,176> name: (identifier[171,173]@{c2}@) {[173,174]
+        (arguments<174,175> argument: (number[174,175]@{1}@))
+        }[175,176])
+      ([176,177]
+      (arguments<177,178> argument: (number[177,178]@{2}@))
+      )[178,179]))
+    }[179,180]))
+ ;[180,181] \n[181,182])

Reply via email to