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