From 5af20e5d07a2e53448b3caca2795f6d502049645 Mon Sep 17 00:00:00 2001 From: Mark Hu Date: Sun, 16 Jun 2024 09:18:18 +0000 Subject: [PATCH] fix switch statements --- Matlab.tmbundle/Syntaxes/MATLAB.tmLanguage | 77 ++++++++----- test/snap/controlFlow.m.snap | 104 ++++++++--------- test/t19SingleLineBlocks.m | 4 +- test/t64SwitchStatements.m | 125 +++++++++++++++++++++ 4 files changed, 231 insertions(+), 79 deletions(-) create mode 100644 test/t64SwitchStatements.m diff --git a/Matlab.tmbundle/Syntaxes/MATLAB.tmLanguage b/Matlab.tmbundle/Syntaxes/MATLAB.tmLanguage index 230f210..880d419 100644 --- a/Matlab.tmbundle/Syntaxes/MATLAB.tmLanguage +++ b/Matlab.tmbundle/Syntaxes/MATLAB.tmLanguage @@ -514,7 +514,7 @@ name meta.switch.matlab begin - \s*(?<=^|[\s,;])(switch)\s+([a-zA-Z0-9][a-zA-Z0-9_]*) + \s*(?<=^|[\s,;])(switch)\b end \s*(?<=^|[\s,;])(end)\b beginCaptures @@ -524,11 +524,6 @@ name keyword.control.switch.matlab - 2 - - name - variable.other.constant.matlab - endCaptures @@ -537,22 +532,51 @@ name keyword.control.end.switch.matlab + 2 + + patterns + + + include + $self + + + patterns + + name + meta.switch.declaration.matlab + begin + \G(?!$) + end + (?<!\.{3}.*)(?:(?=[,;](?![^(]*\)))|$) + patterns + + + include + $self + + + name meta.case.matlab - match - (\s*)(?<=^|[\s,;])(case)\b(.*?)(?<!\.{3})(?:(?=([,;])(?![^(]*\)))|$) - captures + begin + \s*(?<=^|[\s,;])(case)\b + beginCaptures - 2 + 1 name keyword.control.switch.case.matlab - 3 + + end + \s*(?<=^|[\s,;])(?=case|otherwise|end)\b + patterns + name meta.case.declaration.matlab @@ -568,31 +592,34 @@ - + + include + $self + + name meta.otherwise.matlab - match - (\s*)(?<=^|[\s,;])(otherwise)\b - captures + begin + \s*(?<=^|[\s,;])(otherwise)\b + beginCaptures - 2 + 1 name keyword.control.switch.otherwise.matlab - 3 + + end + \s*(?<=^|[\s,;])(?=end)\b + patterns + - patterns - - - include - $self - - + include + $self - + include diff --git a/test/snap/controlFlow.m.snap b/test/snap/controlFlow.m.snap index 508ea50..a75735e 100644 --- a/test/snap/controlFlow.m.snap +++ b/test/snap/controlFlow.m.snap @@ -15,79 +15,79 @@ # ^^^^^^^^^^^^^^^^^^^^^ source.matlab meta.function.matlab comment.line.double-percentage.matlab entity.name.section.matlab >switch nargin #^^^^^^ source.matlab meta.function.matlab meta.switch.matlab keyword.control.switch.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab -# ^^^^^^ source.matlab meta.function.matlab meta.switch.matlab variable.other.constant.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.switch.declaration.matlab +# ^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.switch.declaration.matlab variable.language.function.matlab > case 0 #^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab # ^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab keyword.control.switch.case.matlab # ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.case.declaration.matlab # ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.case.declaration.matlab constant.numeric.decimal.matlab > return -#^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.control.matlab -# ^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.control.matlab keyword.control.flow.matlab +#^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.control.matlab +# ^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.control.matlab keyword.control.flow.matlab > case 1 #^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab # ^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab keyword.control.switch.case.matlab # ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.case.declaration.matlab # ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.case.declaration.matlab constant.numeric.decimal.matlab > y = varargin{1}; -#^^^^ source.matlab meta.function.matlab meta.switch.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab meta.assignment.variable.single.matlab variable.other.readwrite.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab keyword.operator.assignment.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab -# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab variable.language.function.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab constant.numeric.decimal.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab punctuation.terminator.semicolon.matlab +#^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.assignment.variable.single.matlab variable.other.readwrite.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab keyword.operator.assignment.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab +# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab variable.language.function.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab constant.numeric.decimal.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab punctuation.terminator.semicolon.matlab > % Check single-line if inside switch for https://github.com/mathworks/MATLAB-Language-grammar/issues/19 -#^^^^ source.matlab meta.function.matlab meta.switch.matlab punctuation.whitespace.comment.leading.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab comment.line.percentage.matlab punctuation.definition.comment.matlab -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab comment.line.percentage.matlab +#^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab punctuation.whitespace.comment.leading.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab comment.line.percentage.matlab punctuation.definition.comment.matlab +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab comment.line.percentage.matlab > if varargin{1} < 0, return; end -#^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab -# ^^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab keyword.control.if.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab -# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab variable.language.function.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab constant.numeric.decimal.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab keyword.operator.relational.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.if.declaration.matlab constant.numeric.decimal.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab punctuation.separator.comma.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.control.matlab -# ^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab meta.control.matlab keyword.control.flow.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab punctuation.terminator.semicolon.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab -# ^^^ source.matlab meta.function.matlab meta.switch.matlab meta.if.matlab keyword.control.end.if.matlab +#^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab +# ^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab keyword.control.if.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab +# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab variable.language.function.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab constant.numeric.decimal.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab keyword.operator.relational.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.if.declaration.matlab constant.numeric.decimal.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab punctuation.separator.comma.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.control.matlab +# ^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab meta.control.matlab keyword.control.flow.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab punctuation.terminator.semicolon.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab +# ^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.if.matlab keyword.control.end.if.matlab > case 2 #^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab # ^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab keyword.control.switch.case.matlab # ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.case.declaration.matlab # ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.case.declaration.matlab constant.numeric.decimal.matlab > y = varargin{1} + varargin{2}; -#^^^^ source.matlab meta.function.matlab meta.switch.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab meta.assignment.variable.single.matlab variable.other.readwrite.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab keyword.operator.assignment.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab -# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab variable.language.function.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab constant.numeric.decimal.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab keyword.operator.arithmetic.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab -# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab variable.language.function.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab constant.numeric.decimal.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab -# ^ source.matlab meta.function.matlab meta.switch.matlab punctuation.terminator.semicolon.matlab +#^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab meta.assignment.variable.single.matlab variable.other.readwrite.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab keyword.operator.assignment.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab +# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab variable.language.function.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab constant.numeric.decimal.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab keyword.operator.arithmetic.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab +# ^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab variable.language.function.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab constant.numeric.decimal.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab +# ^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab punctuation.terminator.semicolon.matlab > otherwise -#^^ source.matlab meta.function.matlab meta.switch.matlab meta.otherwise.matlab +#^^ source.matlab meta.function.matlab meta.switch.matlab meta.case.matlab # ^^^^^^^^^ source.matlab meta.function.matlab meta.switch.matlab meta.otherwise.matlab keyword.control.switch.otherwise.matlab >end #^^^ source.matlab meta.function.matlab meta.switch.matlab keyword.control.end.switch.matlab diff --git a/test/t19SingleLineBlocks.m b/test/t19SingleLineBlocks.m index 2a18a27..a46db11 100644 --- a/test/t19SingleLineBlocks.m +++ b/test/t19SingleLineBlocks.m @@ -1,7 +1,7 @@ % SYNTAX TEST "source.matlab" "Blocks like if, for, etc. on a single line: https://github.com/mathworks/MATLAB-Language-grammar/issues/19" function y = t19SingleLineBlocks(x) switch x -% ^ variable.other.constant.matlab +% ^ meta.switch.declaration.matlab case 1 % ^^^^ keyword.control.switch.case.matlab % ^ constant.numeric.decimal.matlab @@ -23,7 +23,7 @@ end switch x, case 1, disp(1), case 2, disp(2), otherwise, disp(0); end % ^^^^^^ keyword.control.switch.matlab -% ^ variable.other.constant.matlab +% ^ meta.switch.declaration.matlab % ^ punctuation.separator.comma.matlab % ^^^^ keyword.control.switch.case.matlab % ^ constant.numeric.decimal.matlab diff --git a/test/t64SwitchStatements.m b/test/t64SwitchStatements.m new file mode 100644 index 0000000..21517a2 --- /dev/null +++ b/test/t64SwitchStatements.m @@ -0,0 +1,125 @@ +% SYNTAX TEST "source.matlab" "SwitchStatements: https://github.com/mathworks/MATLAB-Language-grammar/pull/64" + + + +% https://github.com/mathworks/MATLAB-Language-grammar/issues/45 +switch(letter) +% <----- keyword.control.switch.matlab +% ^^^^^^^^ meta.switch.declaration.matlab + case {'A', 'B', 'C'} +% ^^^^ keyword.control.switch.case.matlab +% ^^^^^^^^^^^^^^^^ meta.case.declaration.matlab + return; + case {'D', 'E', 'F'} +% ^^^^ keyword.control.switch.case.matlab +% ^^^^^^^^^^^^^^^^ meta.case.declaration.matlab + return; + case 'X' +% ^^^^ keyword.control.switch.case.matlab +% ^^^ meta.case.declaration.matlab +% ^^^^ keyword.control.switch.case.matlab +% ^^^ meta.case.declaration.matlab + return; + case 'Y' +% ^^^^ keyword.control.switch.case.matlab +% ^^^ meta.case.declaration.matlab + return; + case 'Z' +% ^^^^ keyword.control.switch.case.matlab +% ^^^ meta.case.declaration.matlab + return; + otherwise +% ^^^^^^^^^ keyword.control.switch.otherwise.matlab + return; +end +% <-- keyword.control.end.switch.matlab + + +% https://github.com/mathworks/MATLAB-Language-grammar/issues/47 +switch obj.memberVariable +% <----- keyword.control.switch.matlab +% ^^^^^^^^^^^^^^^^^^ meta.switch.declaration.matlab + case { 0, 1, 2 } +% ^^^^ keyword.control.switch.case.matlab +% ^^^^^^^^^^^ meta.case.declaration.matlab + disp( 'dummy output - 0' ); + case 3 +% ^^^^ keyword.control.switch.case.matlab +% ^ meta.case.declaration.matlab + disp( 'dummy output - 1' ); + otherwise +% ^^^^^^^^^ keyword.control.switch.otherwise.matlab + disp( 'dummy output - otherwise'); + +end +% <-- keyword.control.end.switch.matlab + +switch memberVariable +% <----- keyword.control.switch.matlab +% ^^^^^^^^^^^^^^ meta.switch.declaration.matlab + case { 0, 1, 2 } + disp( 'dummy output - 0' ); + case 3 + disp( 'dummy output - 1' ); + otherwise +% ^^^^^^^^^ keyword.control.switch.otherwise.matlab + disp( 'dummy output - otherwise' ); +end +% <-- keyword.control.end.switch.matlab + + +% https://github.com/mathworks/MATLAB-Language-grammar/issues/52 +switch input +% <----- keyword.control.switch.matlab +% ^^^^^ meta.switch.declaration.matlab + case 0 +% ^^^^ keyword.control.switch.case.matlab +% ^ meta.case.declaration.matlab + disp foo + case { 1,2} +% ^^^^ keyword.control.switch.case.matlab +% ^^^^^^ meta.case.declaration.matlab + disp bar + case {3,4 } +% ^^^^ keyword.control.switch.case.matlab +% ^^^^^^ meta.case.declaration.matlab + disp foobar + case {5,6} +% ^^^^ keyword.control.switch.case.matlab +% ^^^^^ meta.case.declaration.matlab + disp baz +end +% <-- keyword.control.end.switch.matlab + + +% https://github.com/mathworks/MATLAB-Language-grammar/issues/64 +switch experiment +% <----- keyword.control.switch.matlab +% ^^^^^^^^^^ meta.switch.declaration.matlab + case 0 % Script testing w/ artery only output, text here +% ^^^^ keyword.control.switch.case.matlab +% ^ meta.case.declaration.matlab +% ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ comment.line.percentage.matlab +end +% <-- keyword.control.end.switch.matlab + + +a = @() 2; +b = @() 2; + +switch a() +% <----- keyword.control.switch.matlab +% ^^^ meta.switch.declaration.matlab + case 1 +% ^^^^ keyword.control.switch.case.matlab +% ^ meta.case.declaration.matlab + disp("yes") + case b() +% ^^^^ keyword.control.switch.case.matlab +% ^^^ meta.case.declaration.matlab + disp("wierd") + otherwise +% ^^^^^^^^^ keyword.control.switch.otherwise.matlab + disp("no") +end +% <-- keyword.control.end.switch.matlab \ No newline at end of file