Skip to content

Commit 91205a3

Browse files
authored
Merge pull request #84 from watermarkhu/feat/fix-switch-statements
fix switch statements
2 parents 87eea5f + d535361 commit 91205a3

File tree

4 files changed

+231
-79
lines changed

4 files changed

+231
-79
lines changed

Matlab.tmbundle/Syntaxes/MATLAB.tmLanguage

Lines changed: 52 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,7 @@
527527
<key>name</key>
528528
<string>meta.switch.matlab</string>
529529
<key>begin</key>
530-
<string>\s*(?&lt;=^|[\s,;])(switch)\s+([a-zA-Z0-9][a-zA-Z0-9_]*)</string>
530+
<string>\s*(?&lt;=^|[\s,;])(switch)\b</string>
531531
<key>end</key>
532532
<string>\s*(?&lt;=^|[\s,;])(end)\b</string>
533533
<key>beginCaptures</key>
@@ -537,11 +537,6 @@
537537
<key>name</key>
538538
<string>keyword.control.switch.matlab</string>
539539
</dict>
540-
<key>2</key>
541-
<dict>
542-
<key>name</key>
543-
<string>variable.other.constant.matlab</string>
544-
</dict>
545540
</dict>
546541
<key>endCaptures</key>
547542
<dict>
@@ -550,22 +545,51 @@
550545
<key>name</key>
551546
<string>keyword.control.end.switch.matlab</string>
552547
</dict>
548+
<key>2</key>
549+
<dict>
550+
<key>patterns</key>
551+
<array>
552+
<dict>
553+
<key>include</key>
554+
<string>$self</string>
555+
</dict>
556+
</array>
557+
</dict>
553558
</dict>
554559
<key>patterns</key>
555560
<array>
561+
<dict>
562+
<key>name</key>
563+
<string>meta.switch.declaration.matlab</string>
564+
<key>begin</key>
565+
<string>\G(?!$)</string>
566+
<key>end</key>
567+
<string>(?&lt;!\.{3}.*)(?:(?=[,;](?![^(]*\)))|$)</string>
568+
<key>patterns</key>
569+
<array>
570+
<dict>
571+
<key>include</key>
572+
<string>$self</string>
573+
</dict>
574+
</array>
575+
</dict>
556576
<dict>
557577
<key>name</key>
558578
<string>meta.case.matlab</string>
559-
<key>match</key>
560-
<string>(\s*)(?&lt;=^|[\s,;])(case)\b(.*?)(?&lt;!\.{3}.*)(?:(?=([,;])(?![^(]*\)))|$)</string>
561-
<key>captures</key>
579+
<key>begin</key>
580+
<string>\s*(?&lt;=^|[\s,;])(case)\b</string>
581+
<key>beginCaptures</key>
562582
<dict>
563-
<key>2</key>
583+
<key>1</key>
564584
<dict>
565585
<key>name</key>
566586
<string>keyword.control.switch.case.matlab</string>
567587
</dict>
568-
<key>3</key>
588+
</dict>
589+
<key>end</key>
590+
<string>\s*(?&lt;=^|[\s,;])(?=case|otherwise|end)\b</string>
591+
<key>patterns</key>
592+
<array>
569593
<dict>
570594
<key>name</key>
571595
<string>meta.case.declaration.matlab</string>
@@ -581,31 +605,34 @@
581605
</dict>
582606
</array>
583607
</dict>
584-
</dict>
608+
<dict>
609+
<key>include</key>
610+
<string>$self</string>
611+
</dict>
612+
</array>
585613
</dict>
586614
<dict>
587615
<key>name</key>
588616
<string>meta.otherwise.matlab</string>
589-
<key>match</key>
590-
<string>(\s*)(?&lt;=^|[\s,;])(otherwise)\b</string>
591-
<key>captures</key>
617+
<key>begin</key>
618+
<string>\s*(?&lt;=^|[\s,;])(otherwise)\b</string>
619+
<key>beginCaptures</key>
592620
<dict>
593-
<key>2</key>
621+
<key>1</key>
594622
<dict>
595623
<key>name</key>
596624
<string>keyword.control.switch.otherwise.matlab</string>
597625
</dict>
598-
<key>3</key>
626+
</dict>
627+
<key>end</key>
628+
<string>\s*(?&lt;=^|[\s,;])(?=end)\b</string>
629+
<key>patterns</key>
630+
<array>
599631
<dict>
600-
<key>patterns</key>
601-
<array>
602-
<dict>
603-
<key>include</key>
604-
<string>$self</string>
605-
</dict>
606-
</array>
632+
<key>include</key>
633+
<string>$self</string>
607634
</dict>
608-
</dict>
635+
</array>
609636
</dict>
610637
<dict>
611638
<key>include</key>

test/snap/controlFlow.m.snap

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -15,79 +15,79 @@
1515
# ^^^^^^^^^^^^^^^^^^^^^ source.matlab meta.function.matlab comment.line.double-percentage.matlab entity.name.section.matlab
1616
>switch nargin
1717
#^^^^^^ source.matlab meta.function.matlab meta.switch.matlab keyword.control.switch.matlab
18-
# ^ source.matlab meta.function.matlab meta.switch.matlab
19-
# ^^^^^^ source.matlab meta.function.matlab meta.switch.matlab variable.other.constant.matlab
18+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.switch.declaration.matlab
19+
# ^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.switch.declaration.matlab variable.language.function.matlab
2020
> case 0
2121
#^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
2222
# ^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab keyword.control.switch.case.matlab
2323
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.case.declaration.matlab
2424
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.case.declaration.matlab constant.numeric.decimal.matlab
2525
> return
26-
#^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.control.matlab
27-
# ^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.control.matlab keyword.control.flow.matlab
26+
#^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.control.matlab
27+
# ^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.control.matlab keyword.control.flow.matlab
2828
> case 1
2929
#^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
3030
# ^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab keyword.control.switch.case.matlab
3131
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.case.declaration.matlab
3232
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.case.declaration.matlab constant.numeric.decimal.matlab
3333
> y = varargin{1};
34-
#^^^^ source.matlab meta.function.matlab meta.switch.matlab
35-
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.assignment.variable.single.matlab variable.other.readwrite.matlab
36-
# ^ source.matlab meta.function.matlab meta.switch.matlab
37-
# ^ source.matlab meta.function.matlab meta.switch.matlab keyword.operator.assignment.matlab
38-
# ^ source.matlab meta.function.matlab meta.switch.matlab
39-
# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab variable.language.function.matlab
40-
# ^ source.matlab meta.function.matlab meta.switch.matlab
41-
# ^ source.matlab meta.function.matlab meta.switch.matlab constant.numeric.decimal.matlab
42-
# ^ source.matlab meta.function.matlab meta.switch.matlab
43-
# ^ source.matlab meta.function.matlab meta.switch.matlab punctuation.terminator.semicolon.matlab
34+
#^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
35+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.assignment.variable.single.matlab variable.other.readwrite.matlab
36+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
37+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab keyword.operator.assignment.matlab
38+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
39+
# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab variable.language.function.matlab
40+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
41+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab constant.numeric.decimal.matlab
42+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
43+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab punctuation.terminator.semicolon.matlab
4444
> % Check single-line if inside switch for https://github.com/mathworks/MATLAB-Language-grammar/issues/19
45-
#^^^^ source.matlab meta.function.matlab meta.switch.matlab punctuation.whitespace.comment.leading.matlab
46-
# ^ source.matlab meta.function.matlab meta.switch.matlab comment.line.percentage.matlab punctuation.definition.comment.matlab
47-
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab comment.line.percentage.matlab
45+
#^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab punctuation.whitespace.comment.leading.matlab
46+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab comment.line.percentage.matlab punctuation.definition.comment.matlab
47+
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab comment.line.percentage.matlab
4848
> if varargin{1} < 0, return; end
49-
#^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab
50-
# ^^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab keyword.control.if.matlab
51-
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab
52-
# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab variable.language.function.matlab
53-
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab
54-
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab constant.numeric.decimal.matlab
55-
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab
56-
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab
57-
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab keyword.operator.relational.matlab
58-
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab
59-
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab constant.numeric.decimal.matlab
60-
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab punctuation.separator.comma.matlab
61-
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.control.matlab
62-
# ^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.control.matlab keyword.control.flow.matlab
63-
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab punctuation.terminator.semicolon.matlab
64-
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab
65-
# ^^^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab keyword.control.end.if.matlab
49+
#^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab
50+
# ^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab keyword.control.if.matlab
51+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab
52+
# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab variable.language.function.matlab
53+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab
54+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab constant.numeric.decimal.matlab
55+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab
56+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab
57+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab keyword.operator.relational.matlab
58+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab
59+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab constant.numeric.decimal.matlab
60+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab punctuation.separator.comma.matlab
61+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.control.matlab
62+
# ^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.control.matlab keyword.control.flow.matlab
63+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab punctuation.terminator.semicolon.matlab
64+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab
65+
# ^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab keyword.control.end.if.matlab
6666
> case 2
6767
#^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
6868
# ^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab keyword.control.switch.case.matlab
6969
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.case.declaration.matlab
7070
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.case.declaration.matlab constant.numeric.decimal.matlab
7171
> y = varargin{1} + varargin{2};
72-
#^^^^ source.matlab meta.function.matlab meta.switch.matlab
73-
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.assignment.variable.single.matlab variable.other.readwrite.matlab
74-
# ^ source.matlab meta.function.matlab meta.switch.matlab
75-
# ^ source.matlab meta.function.matlab meta.switch.matlab keyword.operator.assignment.matlab
76-
# ^ source.matlab meta.function.matlab meta.switch.matlab
77-
# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab variable.language.function.matlab
78-
# ^ source.matlab meta.function.matlab meta.switch.matlab
79-
# ^ source.matlab meta.function.matlab meta.switch.matlab constant.numeric.decimal.matlab
80-
# ^ source.matlab meta.function.matlab meta.switch.matlab
81-
# ^ source.matlab meta.function.matlab meta.switch.matlab
82-
# ^ source.matlab meta.function.matlab meta.switch.matlab keyword.operator.arithmetic.matlab
83-
# ^ source.matlab meta.function.matlab meta.switch.matlab
84-
# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab variable.language.function.matlab
85-
# ^ source.matlab meta.function.matlab meta.switch.matlab
86-
# ^ source.matlab meta.function.matlab meta.switch.matlab constant.numeric.decimal.matlab
87-
# ^ source.matlab meta.function.matlab meta.switch.matlab
88-
# ^ source.matlab meta.function.matlab meta.switch.matlab punctuation.terminator.semicolon.matlab
72+
#^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
73+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.assignment.variable.single.matlab variable.other.readwrite.matlab
74+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
75+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab keyword.operator.assignment.matlab
76+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
77+
# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab variable.language.function.matlab
78+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
79+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab constant.numeric.decimal.matlab
80+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
81+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
82+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab keyword.operator.arithmetic.matlab
83+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
84+
# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab variable.language.function.matlab
85+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
86+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab constant.numeric.decimal.matlab
87+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
88+
# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab punctuation.terminator.semicolon.matlab
8989
> otherwise
90-
#^^ source.matlab meta.function.matlab meta.switch.matlab meta.otherwise.matlab
90+
#^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab
9191
# ^^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.otherwise.matlab keyword.control.switch.otherwise.matlab
9292
>end
9393
#^^^ source.matlab meta.function.matlab meta.switch.matlab keyword.control.end.switch.matlab

test/t19SingleLineBlocks.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
% SYNTAX TEST "source.matlab" "Blocks like if, for, etc. on a single line: https://github.com/mathworks/MATLAB-Language-grammar/issues/19"
22
function y = t19SingleLineBlocks(x)
33
switch x
4-
% ^ variable.other.constant.matlab
4+
% ^ meta.switch.declaration.matlab
55
case 1
66
% ^^^^ keyword.control.switch.case.matlab
77
% ^ constant.numeric.decimal.matlab
@@ -23,7 +23,7 @@
2323
end
2424
switch x, case 1, disp(1), case 2, disp(2), otherwise, disp(0); end
2525
% ^^^^^^ keyword.control.switch.matlab
26-
% ^ variable.other.constant.matlab
26+
% ^ meta.switch.declaration.matlab
2727
% ^ punctuation.separator.comma.matlab
2828
% ^^^^ keyword.control.switch.case.matlab
2929
% ^ constant.numeric.decimal.matlab

0 commit comments

Comments
 (0)