aboutsummaryrefslogtreecommitdiff
path: root/runtime/syntax/cs.vim
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/syntax/cs.vim')
-rw-r--r--runtime/syntax/cs.vim276
1 files changed, 188 insertions, 88 deletions
diff --git a/runtime/syntax/cs.vim b/runtime/syntax/cs.vim
index b4cb6489e6..722ddbedf6 100644
--- a/runtime/syntax/cs.vim
+++ b/runtime/syntax/cs.vim
@@ -3,13 +3,16 @@
" Maintainer: Nick Jensen <nickspoon@gmail.com>
" Former Maintainers: Anduin Withers <awithers@anduin.com>
" Johannes Zellner <johannes@zellner.org>
-" Last Change: 2020-11-23
+" Last Change: 2022-03-01
" Filenames: *.cs
" License: Vim (see :h license)
" Repository: https://github.com/nickspoons/vim-cs
"
-" REFERENCES:
-" [1] ECMA TC39: C# Language Specification (WD13Oct01.doc)
+" References:
+" - ECMA-334 5th Edition: C# Language Specification
+" https://www.ecma-international.org/publications-and-standards/standards/ecma-334/
+" - C# Language Design: Draft 6th Edition and later proposals
+" https://github.com/dotnet/csharplang
if exists('b:current_syntax')
finish
@@ -19,37 +22,72 @@ let s:save_cpo = &cpoptions
set cpoptions&vim
syn keyword csType bool byte char decimal double float int long object sbyte short string T uint ulong ushort var void dynamic
-syn keyword csStorage delegate enum interface namespace struct
+syn keyword csType nint nuint " contextual
+
+syn keyword csStorage enum interface namespace struct
+syn match csStorage "\<delegate\>"
syn keyword csRepeat break continue do for foreach goto return while
syn keyword csConditional else if switch
syn keyword csLabel case default
-syn match csOperatorError display +::+
-syn match csGlobal display +global::+
-" user labels (see [1] 8.6 Statements)
+
+syn match csNamespaceAlias "@\=\h\w*\ze\_s*::" display
+syn match csGlobalNamespaceAlias "global\ze\_s*::" display
+syn cluster csNamespaceAlias contains=csGlobalNamespaceAlias,csNamespaceAlias,csNamespaceAliasQualifier
+
+" user labels
syn match csLabel display +^\s*\I\i*\s*:\%([^:]\)\@=+
-syn keyword csModifier abstract const extern internal override private protected public readonly sealed static virtual volatile
-syn keyword csConstant false null true
+
+" Function pointers
+syn match csType "\<delegate\s*\*" contains=csOpSymbols nextgroup=csManagedModifier skipwhite skipempty
+syn keyword csManagedModifier managed unmanaged contained
+
+" Modifiers
+syn match csUsingModifier "\<global\ze\_s\+using\>"
+syn keyword csAccessModifier internal private protected public
+" TODO: in new out
+syn keyword csModifier abstract const event override readonly sealed static virtual volatile
+syn match csModifier "\<\%(extern\|fixed\|unsafe\)\>"
+syn match csModifier "\<partial\ze\_s\+\%(class\|struct\|interface\|record\|void\)\>"
+
syn keyword csException try catch finally throw when
-syn keyword csLinq ascending by descending equals from group in into join let on orderby select where
-syn keyword csAsync async await
+syn keyword csLinq ascending by descending equals from group in into join let on orderby select
+syn match csLinq "\<where\>"
-syn keyword csUnspecifiedStatement as base checked event fixed in is lock nameof operator out params ref sizeof stackalloc this unchecked unsafe using
-syn keyword csUnsupportedStatement add remove value
-syn keyword csUnspecifiedKeyword explicit implicit
+" Type parameter constraint clause
+syn match csStorage "\<where\>\ze\_s\+@\=\h\w*\_s*:"
-" Contextual Keywords
-syn match csContextualStatement /\<yield[[:space:]\n]\+\%(return\|break\)/me=s+5
-syn match csContextualStatement /\<partial[[:space:]\n]\+\%(class\|struct\|interface\)/me=s+7
-syn match csContextualStatement /\<\%(get\|set\)\%(;\|[[:space:]\n]*{\)/me=s+3
-syn match csContextualStatement /\<\%(get\|set\)\s*=>/me=s+3
-syn match csContextualStatement /\<where\>[^:]\+:/me=s+5
+" Async
+syn keyword csAsyncModifier async
+syn keyword csAsyncOperator await
+
+syn match csStorage "\<extern\ze\s\+alias\>"
+syn match csStorage "\%(\<extern\s\+\)\@16<=alias\>"
+
+syn match csStatement "\<\%(checked\|unchecked\|unsafe\)\ze\_s*{"
+syn match csStatement "\<fixed\ze\_s*("
+syn keyword csStatement lock
+syn match csStatement "\<yield\ze\_s\+\%(return\|break\)\>"
+
+syn match csAccessor "\<\%(get\|set\|init\|add\|remove\)\ze\_s*\%([;{]\|=>\)"
+
+syn keyword csAccess base
+syn match csAccess "\<this\>"
+
+" Extension method parameter modifier
+syn match csModifier "\<this\ze\_s\+@\=\h"
+
+syn keyword csUnspecifiedStatement as in is nameof operator out params ref sizeof stackalloc using
+syn keyword csUnsupportedStatement value
+syn keyword csUnspecifiedKeyword explicit implicit
" Operators
-syn keyword csTypeOf typeof contained
-syn region csTypeOfStatement start="typeof(" end=")" contains=csType, csTypeOf
+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 match csKeywordOperator "\<\%(checked\|unchecked\)\ze\_s*("
" Punctuation
-syn match csBraces "[{}\[\]]" display
+syn match csBraces "[{}[\]]" display
syn match csParens "[()]" display
syn match csOpSymbols "+\{1,2}" display
syn match csOpSymbols "-\{1,2}" display
@@ -64,128 +102,173 @@ syn match csLogicSymbols "&&" display
syn match csLogicSymbols "||" display
syn match csLogicSymbols "?" display
syn match csLogicSymbols ":" display
+syn match csNamespaceAliasQualifier "::" display
" Generics
-syn region csGeneric matchgroup=csGenericBraces start="<" end=">" oneline contains=csType,csGeneric,csUserType,csUserIdentifier,csUserInterface,csUserMethod
+syn region csGeneric matchgroup=csGenericBraces start="<" end=">" oneline contains=csType,csGeneric,@csNamespaceAlias,csUserType,csUserIdentifier,csUserInterface,csUserMethod
" Comments
"
" PROVIDES: @csCommentHook
syn keyword csTodo contained TODO FIXME XXX NOTE HACK TBD
-syn region csComment start="/\*" end="\*/" contains=@csCommentHook,csTodo,@Spell
-syn match csComment "//.*$" contains=@csCommentHook,csTodo,@Spell
-
-" xml markup inside '///' comments
-syn cluster xmlRegionHook add=csXmlCommentLeader
-syn cluster xmlCdataHook add=csXmlCommentLeader
-syn cluster xmlStartTagHook add=csXmlCommentLeader
-syn keyword csXmlTag contained Libraries Packages Types Excluded ExcludedTypeName ExcludedLibraryName
-syn keyword csXmlTag contained ExcludedBucketName TypeExcluded Type TypeKind TypeSignature AssemblyInfo
-syn keyword csXmlTag contained AssemblyName AssemblyPublicKey AssemblyVersion AssemblyCulture Base
-syn keyword csXmlTag contained BaseTypeName Interfaces Interface InterfaceName Attributes Attribute
-syn keyword csXmlTag contained AttributeName Members Member MemberSignature MemberType MemberValue
-syn keyword csXmlTag contained ReturnValue ReturnType Parameters Parameter MemberOfPackage
-syn keyword csXmlTag contained ThreadingSafetyStatement Docs devdoc example overload remarks returns summary
-syn keyword csXmlTag contained threadsafe value internalonly nodoc exception param permission platnote
-syn keyword csXmlTag contained seealso b c i pre sub sup block code note paramref see subscript superscript
-syn keyword csXmlTag contained list listheader item term description altcompliant altmember
-
-syn cluster xmlTagHook add=csXmlTag
-
-syn match csXmlCommentLeader "///" contained
-syn match csXmlComment "///.*$" contains=csXmlCommentLeader,@csXml,@Spell keepend
+syn region csBlockComment start="/\*" end="\*/" contains=@csCommentHook,csTodo,@Spell
+syn match csLineComment "//.*$" contains=@csCommentHook,csTodo,@Spell
+syn cluster csComment contains=csLineComment,csBlockComment
+
+syn region csSummary start="^\s*/// <summary" end="^\%\(\s*///\)\@!" transparent fold keepend
+
+" xml markup inside '///' and /**...*/ comments
+syn cluster xmlRegionHook add=csXmlLineCommentLeader,csXmlBlockCommentMiddle
+syn cluster xmlCdataHook add=csXmlLineCommentLeader,csXmlBlockCommentMiddle
+syn cluster xmlStartTagHook add=csXmlLineCommentLeader,csXmlBlockCommentMiddle
+syn cluster xmlTagHook add=csXmlTag
+syn cluster xmlAttribHook add=csXmlAttrib
+
+" https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/xmldoc/recommended-tags
+syn keyword csXmlTag contained summary remarks
+syn keyword csXmlTag contained returns param paramref exception value
+syn keyword csXmlTag contained para list c code example
+syn keyword csXmlTag contained inheritdoc include
+syn keyword csXmlTag contained see seealso
+syn keyword csXmlTag contained typeparam typeparamref
+syn keyword csXmlTag contained b i u br a
+syn keyword csXmlAttrib contained cref href
+
+syn match csXmlLineCommentLeader "///" contained
+syn match csXmlLineComment "///.*$" contains=csXmlLineCommentLeader,@csXml,@Spell keepend
+syn match csXmlBlockCommentMiddle "^\s*\zs\*" contained
+syn region csXmlBlockComment start="/\*\*" end="\*/" contains=@csXml,@Spell,csXmlBlockCommentMiddle keepend
syn include @csXml syntax/xml.vim
hi def link xmlRegion Comment
" Since syntax/xml.vim contains `syn spell toplevel`, we need to set it back to `default` here.
syn spell default
-" [1] 9.5 Pre-processing directives
-syn region csPreCondit start="^\s*#\s*\%(define\|undef\|if\|elif\|else\|endif\|line\|error\|warning\|pragma\)\>" skip="\\$" end="$" contains=csComment keepend
-syn region csRegion matchgroup=csPreCondit start="^\s*#\s*region.*$" end="^\s*#\s*endregion" transparent fold contains=TOP
-syn region csSummary start="^\s*/// <summary" end="^\%\(\s*///\)\@!" transparent fold keepend
+" Pre-processing directives
+syn region csPreProcDeclaration start="^\s*\zs#\s*\%(define\|undef\)\>" end="$" contains=csLineComment keepend
+syn region csPreProcConditional start="^\s*\zs#\s*\%(if\|elif\)\>" end="$" contains=csLineComment keepend
+syn region csPreProcConditional start="^\s*\zs#\s*\%(else\|endif\)\>" end="$" contains=csLineComment keepend
+syn region csPreProcLine start="^\s*\zs#\s*line\>" end="$" contains=csLineComment keepend
+syn region csPreProcDiagnostic start="^\s*\zs#\s*\%(error\|warning\)\>" end="$"
+syn region csPreProcConditionalSection matchgroup=csPreProcRegion start="^\s*#\s*region\>.*" end="^\s*#\s*endregion\>.*" transparent fold contains=TOP
+syn region csPreProcPragma start="^\s*\zs#\s*pragma\>" end="$" contains=csLineComment keepend
+syn region csPreProcNullable start="^\s*\zs#\s*nullable\>" end="$" contains=csLineComment keepend
+
+if expand('%:e') == 'csx' || getline('1') =~ '^#!.*\<dotnet-script\>'
+ syn region csPreProcInclude start="^\s*\zs#\s*\%(load\|r\)\>" end="$" contains=csLineComment keepend
+ syn match csShebang "\%^#!.*" display
+endif
+syn cluster csPreProcessor contains=csPreProc.*
-syn region csClassType start="@\@1<!\<class\>"hs=s+6 end="[:\n{]"me=e-1 contains=csClass
+syn region csClassType start="\<class\>"hs=s+6 end=">" end="[:{]"me=e-1 contains=csClass
" csUserType may be defined by user scripts/plugins - it should be contained in csNewType
-syn region csNewType start="@\@1<!\<new\>"hs=s+4 end="[;\n{(<\[]"me=e-1 contains=csNew,csUserType
+syn region csNewType start="\<new\>"hs=s+4 end="[;\n{(<\[]"me=e-1 contains=csNew,@csNamespaceAlias,csUserType
syn region csIsType start=" is "hs=s+4 end="[A-Za-z0-9]\+" oneline contains=csIsAs
syn region csIsType start=" as "hs=s+4 end="[A-Za-z0-9]\+" oneline contains=csIsAs
syn keyword csNew new contained
syn keyword csClass class contained
syn keyword csIsAs is as
+syn keyword csBoolean false true
+syn keyword csNull null
+
" Strings and constants
syn match csSpecialError "\\." contained
syn match csSpecialCharError "[^']" contained
-" [1] 9.4.4.4 Character literals
-syn match csSpecialChar +\\["\\'0abfnrtvx]+ contained display
-syn match csUnicodeNumber +\\x\x\{2,4}+ contained contains=csUnicodeSpecifier display
+" Character literals
+syn match csSpecialChar +\\["\\'0abfnrtv]+ contained display
+syn match csUnicodeNumber +\\x\x\{1,4}+ contained contains=csUnicodeSpecifier display
syn match csUnicodeNumber +\\u\x\{4}+ contained contains=csUnicodeSpecifier display
-syn match csUnicodeNumber +\\U\x\{8}+ contained contains=csUnicodeSpecifier display
-syn match csUnicodeSpecifier +\\[uU]+ contained display
+syn match csUnicodeNumber +\\U00\x\{6}+ contained contains=csUnicodeSpecifier display
+syn match csUnicodeSpecifier +\\[uUx]+ contained display
syn region csString matchgroup=csQuote start=+"+ end=+"+ end=+$+ extend contains=csSpecialChar,csSpecialError,csUnicodeNumber,@Spell
syn match csCharacter "'[^']*'" contains=csSpecialChar,csSpecialCharError,csUnicodeNumber display
syn match csCharacter "'\\''" contains=csSpecialChar display
syn match csCharacter "'[^\\]'" display
-syn match csNumber "\<0[0-7]*[lL]\=\>" display
-syn match csNumber "\<0[xX][[:xdigit:]_]\+[lL]\=\>" display
-syn match csNumber "\<0[bB][01_]\+[lL]\=\>" display
-syn match csNumber "\<[[:digit:]_]\+[lL]\=\>" display
-syn match csNumber "\<[[:digit:]_]\+\.[[:digit:]_]*\%\([eE][-+]\=[[:digit:]_]\+\)\=[fFdDmM]\=" display
-syn match csNumber "\.[[:digit:]_]\+\%\([eE][-+]\=[[:digit:]_]\+\)\=[fFdDmM]\=" display
-syn match csNumber "\<[[:digit:]_]\+[eE][-+]\=[[:digit:]_]\+[fFdDmM]\=\>" display
-syn match csNumber "\<[[:digit:]_]\+\%\([eE][-+]\=[[:digit:]_]\+\)\=[fFdDmM]\>" display
+
+" Numbers
+syn case ignore
+syn match csInteger "\<0b[01_]*[01]\%([lu]\|lu\|ul\)\=\>" display
+syn match csInteger "\<\d\+\%(_\+\d\+\)*\%([lu]\|lu\|ul\)\=\>" display
+syn match csInteger "\<0x[[:xdigit:]_]*\x\%([lu]\|lu\|ul\)\=\>" display
+syn match csReal "\<\d\+\%(_\+\d\+\)*\.\d\+\%(_\+\d\+\)*\%\(e[-+]\=\d\+\%(_\+\d\+\)*\)\=[fdm]\=" display
+syn match csReal "\.\d\+\%(_\+\d\+\)*\%(e[-+]\=\d\+\%(_\+\d\+\)*\)\=[fdm]\=\>" display
+syn match csReal "\<\d\+\%(_\+\d\+\)*e[-+]\=\d\+\%(_\+\d\+\)*[fdm]\=\>" display
+syn match csReal "\<\d\+\%(_\+\d\+\)*[fdm]\>" display
+syn case match
+syn cluster csNumber contains=csInteger,csReal
syn region csInterpolatedString matchgroup=csQuote start=+\$"+ end=+"+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,@Spell
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,csConstant,csCharacter,csParens,csOpSymbols,csString,csBracketed display
+syn region csInterpolationAlign matchgroup=csInterpolationAlignDel start=+,+ end=+}+ end=+:+me=e-1 contained contains=@csNumber,csBoolean,csConstant,csCharacter,csParens,csOpSymbols,csString,csBracketed display
syn match csInterpolationFormat +:[^}]\+}+ contained contains=csInterpolationFormatDel display
syn match csInterpolationAlignDel +,+ contained display
syn match csInterpolationFormatDel +:+ contained display
syn region csVerbatimString matchgroup=csQuote start=+@"+ end=+"+ skip=+""+ extend contains=csVerbatimQuote,@Spell
syn match csVerbatimQuote +""+ contained
-syn match csQuoteError +@$"+he=s+2,me=s+2
-syn region csInterVerbString matchgroup=csQuote start=+\$@"+ end=+"+ skip=+""+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,csVerbatimQuote,@Spell
+syn region csInterVerbString matchgroup=csQuote start=+$@"+ start=+@$"+ end=+"+ skip=+""+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,csVerbatimQuote,@Spell
+
+syn cluster csString contains=csString,csInterpolatedString,csVerbatimString,csInterVerbString
+
+syn cluster csLiteral contains=csBoolean,@csNumber,csCharacter,@csString,csNull
syn region csBracketed matchgroup=csParens start=+(+ end=+)+ extend contained transparent contains=@csAll,csBraced,csBracketed
syn region csBraced matchgroup=csParens start=+{+ end=+}+ extend contained transparent contains=@csAll,csBraced,csBracketed
-syn cluster csAll contains=csCharacter,csClassType,csComment,csContextualStatement,csEndColon,csIsType,csLabel,csLogicSymbols,csNewType,csConstant,csNumber,csOpSymbols,csOperatorError,csParens,csPreCondit,csRegion,csString,csSummary,csType,csUnicodeNumber,csUnicodeSpecifier,csInterpolatedString,csVerbatimString,csInterVerbString,csUserType,csUserIdentifier,csUserInterface,csUserMethod
+syn cluster csAll contains=@csLiteral,csClassType,@csComment,csEndColon,csIsType,csLabel,csLogicSymbols,csNewType,csOpSymbols,csParens,@csPreProcessor,csSummary,@csNamespaceAlias,csType,csUnicodeNumber,csUserType,csUserIdentifier,csUserInterface,csUserMethod
+
+" Keyword identifiers
+syn match csIdentifier "@\h\w*"
" The default highlighting.
+hi def link csUnspecifiedStatement Statement
+hi def link csUnsupportedStatement Statement
+hi def link csUnspecifiedKeyword Keyword
+
+hi def link csGlobalNamespaceAlias Include
+
hi def link csType Type
hi def link csClassType Type
hi def link csIsType Type
+
hi def link csStorage Structure
hi def link csClass Structure
+hi def link csNew Statement
+hi def link csIsAs Keyword
+hi def link csAccessor Keyword
+hi def link csAccess Keyword
+
+hi def link csLinq Statement
+
+hi def link csStatement Statement
hi def link csRepeat Repeat
hi def link csConditional Conditional
hi def link csLabel Label
-hi def link csModifier StorageClass
-hi def link csConstant Constant
hi def link csException Exception
-hi def link csTypeOf Keyword
-hi def link csTypeOfStatement Typedef
-hi def link csUnspecifiedStatement Statement
-hi def link csUnsupportedStatement Statement
-hi def link csUnspecifiedKeyword Keyword
-hi def link csNew Statement
-hi def link csLinq Statement
-hi def link csIsAs Keyword
-hi def link csAsync Keyword
-hi def link csContextualStatement Statement
-hi def link csOperatorError Error
+
+hi def link csModifier StorageClass
+hi def link csAccessModifier csModifier
+hi def link csAsyncModifier csModifier
+hi def link csManagedModifier csModifier
+hi def link csUsingModifier csModifier
hi def link csTodo Todo
hi def link csComment Comment
-
+hi def link csLineComment csComment
+hi def link csBlockComment csComment
+
+hi def link csKeywordOperator Keyword
+hi def link csAsyncOperator csKeywordOperator
+hi def link csTypeOf csKeywordOperator
+hi def link csTypeOfOperand Typedef
+hi def link csTypeOfError Error
hi def link csOpSymbols Operator
hi def link csLogicSymbols Operator
@@ -193,15 +276,29 @@ hi def link csSpecialError Error
hi def link csSpecialCharError Error
hi def link csString String
hi def link csQuote String
-hi def link csQuoteError Error
hi def link csInterpolatedString String
hi def link csVerbatimString String
hi def link csInterVerbString String
hi def link csVerbatimQuote SpecialChar
-hi def link csPreCondit PreCondit
+
+hi def link csPreProc PreProc
+hi def link csPreProcDeclaration Define
+hi def link csPreProcConditional PreCondit
+hi def link csPreProcLine csPreProc
+hi def link csPreProcDiagnostic csPreProc
+hi def link csPreProcRegion csPreProc
+hi def link csPreProcPragma csPreProc
+hi def link csPreProcNullable csPreProc
+hi def link csPreProcInclude csPreProc
+hi def link csShebang csPreProc
+
+hi def link csConstant Constant
+hi def link csNull Constant
+hi def link csBoolean Boolean
hi def link csCharacter Character
hi def link csSpecialChar SpecialChar
-hi def link csNumber Number
+hi def link csInteger Number
+hi def link csReal Float
hi def link csUnicodeNumber SpecialChar
hi def link csUnicodeSpecifier SpecialChar
hi def link csInterpolationDelimiter Delimiter
@@ -212,9 +309,12 @@ hi def link csInterpolationFormatDel csInterpolationDelimiter
hi def link csGenericBraces csBraces
" xml markup
-hi def link csXmlCommentLeader Comment
-hi def link csXmlComment Comment
+hi def link csXmlLineCommentLeader Comment
+hi def link csXmlLineComment Comment
+hi def link csXmlBlockComment Comment
+hi def link csXmlBlockCommentMiddle csXmlBlockComment
hi def link csXmlTag Statement
+hi def link csXmlAttrib Statement
let b:current_syntax = 'cs'