From 9ac89ce9f939c30a44cb03cba80c2740aa237687 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Mon, 20 Dec 2021 17:09:11 +1100 Subject: [PATCH 1/3] Add more keyword operators --- syntax/cs.vim | 31 ++++++++++---- test/operators.vader | 98 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 109 insertions(+), 20 deletions(-) diff --git a/syntax/cs.vim b/syntax/cs.vim index f1c5e3a..a6c4090 100644 --- a/syntax/cs.vim +++ b/syntax/cs.vim @@ -27,7 +27,8 @@ syn keyword csType nint nuint " contextual syn keyword csStorage enum interface namespace struct syn match csStorage "\" syn keyword csRepeat break continue do for foreach goto return while -syn keyword csConditional else if switch +syn keyword csConditional else if +syn match csCondtional "\" syn keyword csLabel case default syn match csNamespaceAlias "@\=\h\w*\ze\_s*::" display @@ -66,7 +67,7 @@ syn match csStatement "\" syn match csAccessor "\<\%(get\|set\|init\|add\|remove\)\ze\_s*\%([;{]\|=>\)" -syn keyword csUnspecifiedStatement as base in is nameof operator out params ref sizeof stackalloc this using +syn keyword csUnspecifiedStatement as base in is operator out params ref this using syn keyword csUnsupportedStatement value syn keyword csUnspecifiedKeyword explicit implicit @@ -74,10 +75,22 @@ syn keyword csUnspecifiedKeyword explicit implicit syn match csContextualStatement "\\ze[^:]\+:" " Operators -syn keyword csTypeOf typeof nextgroup=csTypeOfOperand,csTypeOfError skipwhite skipempty -syn region csTypeOfOperand matchgroup=csParens start="(" end=")" contained contains=csType -syn match csTypeOfError "[^([:space:]]" contained +syn keyword csKeywordOperator stackalloc syn match csKeywordOperator "\<\%(checked\|unchecked\)\ze\_s*(" +syn match csKeywordOperator "\>) Execute: - AssertEqual 'csTypeOf', SyntaxAt(1, 1) - AssertEqual 'csParens', SyntaxAt(1, 7) - AssertEqual 'csTypeOfOperand', SyntaxAt(1, 8) - AssertEqual 'csParens', SyntaxAt(1, 38) + AssertEqual 'csKeywordOperator', SyntaxOf('typeof') + AssertEqual 'csParens', SyntaxOf('(') + AssertEqual 'csTypeOfOperand', SyntaxOf('(\zs') + AssertEqual 'csParens', SyntaxOf(')') Given cs (typeof operator with space before open paren): typeof (Dictionary>) Execute: - AssertEqual 'csTypeOf', SyntaxAt(1, 1) - AssertEqual 'csParens', SyntaxAt(1, 8) - AssertEqual 'csTypeOfOperand', SyntaxAt(1, 9) - AssertEqual 'csParens', SyntaxAt(1, 39) + AssertEqual 'csKeywordOperator', SyntaxOf('typeof') + AssertEqual 'csParens', SyntaxOf('(') + AssertEqual 'csTypeOfOperand', SyntaxOf('(\zs') + AssertEqual 'csParens', SyntaxOf(')') Given cs (typeof operator with missing operand parens): typeof Dictionary> Execute: - AssertEqual 'csTypeOf', SyntaxAt(1, 1) - AssertEqual 'csTypeOfError', SyntaxAt(1, 8) + AssertEqual 'csKeywordOperator', SyntaxOf('typeof') + AssertEqual 'csMissingParenError', SyntaxAt(1, 8) + +Given cs (sizeof operator): + sizeof(byte) + +Execute: + AssertEqual 'csKeywordOperator', SyntaxOf('sizeof') + AssertEqual 'csParens', SyntaxOf('(') + AssertEqual 'csType', SyntaxOf('(\zs') + AssertEqual 'csParens', SyntaxOf(')') + +Given cs (sizeof operator with space before open paren): + sizeof (byte) + +Execute: + AssertEqual 'csKeywordOperator', SyntaxOf('sizeof') + AssertEqual 'csParens', SyntaxOf('(') + AssertEqual 'csType', SyntaxOf('(\zs') + AssertEqual 'csParens', SyntaxOf(')') + +Given cs (sizeof operator with missing operand parens): + sizeof byte + +Execute: + AssertEqual 'csKeywordOperator', SyntaxOf('sizeof') + AssertEqual 'csMissingParenError', SyntaxOf('b\zeyte') + +Given cs (nameof operator): + nameof(foobar) + +Execute: + AssertEqual 'csKeywordOperator', SyntaxOf('nameof') + AssertEqual 'csParens', SyntaxOf('(') + AssertEqual 'csNameOfOperand', SyntaxOf('(\zs') + AssertEqual 'csParens', SyntaxOf(')') + +Given cs (nameof operator with space before open paren): + nameof (foobar) + +Execute: + AssertEqual 'csKeywordOperator', SyntaxOf('nameof') + AssertEqual 'csParens', SyntaxOf('(') + AssertEqual 'csNameOfOperand', SyntaxOf('(\zs') + AssertEqual 'csParens', SyntaxOf(')') + +Given cs (nameof operator with missing operand parens): + nameof foobar + +Execute: + AssertEqual 'csKeywordOperator', SyntaxOf('nameof') + AssertEqual 'csMissingParenError', SyntaxOf('f\zeoobar') Given cs (await operator): await foobar(); Execute: - AssertEqual 'csAsyncOperator', SyntaxAt(1, 1) + AssertEqual 'csAsyncOperator', SyntaxOf('await') Given cs (checked operator): var foobar = checked(42 + 1); @@ -116,3 +166,29 @@ Given cs (unchecked operator): Execute: AssertEqual 'csKeywordOperator', SyntaxOf('unchecked') +Given cs (stackalloc operator): + Span foobar = stackalloc byte[42]; + +Execute: + AssertEqual 'csKeywordOperator', SyntaxOf('stackalloc') + +Given cs (switch operator): + var foo = bar switch { _ => 42 }; + +Execute: + AssertEqual 'csKeywordOperator', SyntaxOf('switch') + +Given cs (delegate operator): + Func foobar = delegate (int a) { return 42; }; + Action foobar = delegate { FortyTwo(); }; + +Execute: + AssertEqual 'csKeywordOperator', SyntaxOf('delegate', 1) + AssertEqual 'csKeywordOperator', SyntaxOf('delegate', 2) + +Given cs (with operator): + var foo = bar with { Baz = 42 }; + +Execute: + AssertEqual 'csKeywordOperator', SyntaxOf('with') + From 387125a3f0ab7592e46cb064288bf9bd115d7d28 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Sun, 2 Jan 2022 23:47:37 +1100 Subject: [PATCH 2/3] Match literal, operator and case label uses of default keyword Use as a type constraint is not addressed here. --- syntax/cs.vim | 18 ++++++++++++++---- test/literals.vader | 12 ++++++++++++ test/operators.vader | 26 ++++++++++++++++++++++++++ test/statements.vader | 6 ++++++ 4 files changed, 58 insertions(+), 4 deletions(-) diff --git a/syntax/cs.vim b/syntax/cs.vim index a6c4090..a973259 100644 --- a/syntax/cs.vim +++ b/syntax/cs.vim @@ -29,7 +29,9 @@ syn match csStorage "\" syn keyword csRepeat break continue do for foreach goto return while syn keyword csConditional else if syn match csCondtional "\" -syn keyword csLabel case default + +syn keyword csLabel case +syn match csLabel "\\%(\_s*[(:]\)\@!" +" ternary consequent +syn match csDefault "\%(?\_s*\)\@32<=default\>" " Strings and constants syn match csSpecialError "\\." contained @@ -211,7 +219,7 @@ syn region csInterpolatedString matchgroup=csQuote start=+\$"+ end=+"+ extend co syn region csInterpolation matchgroup=csInterpolationDelimiter start=+{+ end=+}+ keepend contained contains=@csAll,csBraced,csBracketed,csInterpolationAlign,csInterpolationFormat syn match csEscapedInterpolation "{{" transparent contains=NONE display syn match csEscapedInterpolation "}}" transparent contains=NONE display -syn region csInterpolationAlign matchgroup=csInterpolationAlignDel start=+,+ end=+}+ end=+:+me=e-1 contained contains=@csNumber,csBoolean,csConstant,csCharacter,csParens,csOpSymbols,csString,csBracketed display +syn region csInterpolationAlign matchgroup=csInterpolationAlignDel start=+,+ end=+}+ end=+:+me=e-1 contained contains=@csNumber,csBoolean,csLiteral,csCharacter,csParens,csOpSymbols,csString,csBracketed display syn match csInterpolationFormat +:[^}]\+}+ contained contains=csInterpolationFormatDel display syn match csInterpolationAlignDel +,+ contained display syn match csInterpolationFormatDel +:+ contained display @@ -246,8 +254,9 @@ hi def link csModifier StorageClass hi def link csAccessModifier csModifier hi def link csManagedModifier csModifier hi def link csUsingModifier csModifier -hi def link csConstant Constant -hi def link csNull Constant +hi def link csLiteral Constant +hi def link csNull csLiteral +hi def link csDefault csLiteral hi def link csException Exception hi def link csUnspecifiedStatement Statement hi def link csUnsupportedStatement Statement @@ -270,6 +279,7 @@ hi def link csKeywordOperator Keyword hi def link csAsyncOperator csKeywordOperator hi def link csTypeOfOperand Typedef hi def link csSizeOfOperand Typedef +hi def link csDefaultOperand Typedef hi def link csMissingParenError Error hi def link csOpSymbols Operator hi def link csLogicSymbols Operator diff --git a/test/literals.vader b/test/literals.vader index 8f1fe4a..32c6393 100644 --- a/test/literals.vader +++ b/test/literals.vader @@ -6,6 +6,18 @@ Execute: AssertEqual 'csBoolean', SyntaxAt(1, 1) AssertEqual 'csBoolean', SyntaxAt(2, 1) +Given cs (default literal): + default + +Execute: + AssertEqual 'csDefault', SyntaxAt(1, 1) + +Given cs (default literal - ternary consequent): + var foo = bar ? default : 42; + +Execute: + AssertEqual 'csDefault', SyntaxOf('default') + Given cs (null): null diff --git a/test/operators.vader b/test/operators.vader index e692b97..8d17064 100644 --- a/test/operators.vader +++ b/test/operators.vader @@ -73,6 +73,32 @@ Execute: # Keyword operators +Given cs (default operator): + default(Dictionary>) + +Execute: + AssertEqual 'csKeywordOperator', SyntaxOf('default') + AssertEqual 'csParens', SyntaxOf('(') + AssertEqual 'csDefaultOperand', SyntaxOf('(\zs') + AssertEqual 'csParens', SyntaxOf(')') + +Given cs (default operator with space before open paren): + default (Dictionary>) + +Execute: + AssertEqual 'csKeywordOperator', SyntaxOf('default') + AssertEqual 'csParens', SyntaxOf('(') + AssertEqual 'csDefaultOperand', SyntaxOf('(\zs') + AssertEqual 'csParens', SyntaxOf(')') + +Given cs (default operator with missing operand parens): + default Dictionary> + +Execute: +# TODO: Not enough context in default literal matching to match this as a +# missing paren operator call + AssertEqual 'csDefault', SyntaxOf('default') + Given cs (typeof operator): typeof(Dictionary>) diff --git a/test/statements.vader b/test/statements.vader index 6d6af92..ec453d7 100644 --- a/test/statements.vader +++ b/test/statements.vader @@ -1,3 +1,9 @@ +Given cs (switch statement - default case label): + switch (42) { default: ; break; } + +Execute: + AssertEqual 'csLabel', SyntaxOf('default') + Given cs (unsafe statement): unsafe { /* boom! */ } From 4bd0a610c1945345ea293016545440b9c7f1afc0 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Mon, 3 Jan 2022 00:04:33 +1100 Subject: [PATCH 3/3] Highlight new operator with csKeywordOperator group --- syntax/cs.vim | 2 +- test/operators.vader | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/syntax/cs.vim b/syntax/cs.vim index a973259..d2a2080 100644 --- a/syntax/cs.vim +++ b/syntax/cs.vim @@ -261,7 +261,7 @@ hi def link csException Exception hi def link csUnspecifiedStatement Statement hi def link csUnsupportedStatement Statement hi def link csUnspecifiedKeyword Keyword -hi def link csNew Statement +hi def link csNew csKeywordOperator hi def link csLinq Statement hi def link csIsAs csKeywordOperator hi def link csAsyncModifier csModifier diff --git a/test/operators.vader b/test/operators.vader index 8d17064..b1abb58 100644 --- a/test/operators.vader +++ b/test/operators.vader @@ -192,6 +192,12 @@ Given cs (unchecked operator): Execute: AssertEqual 'csKeywordOperator', SyntaxOf('unchecked') +Given cs (new operator): + var foo = new Bar(); + +Execute: + AssertEqual 'csNew', SyntaxOf('new') + Given cs (stackalloc operator): Span foobar = stackalloc byte[42];