diff options
Diffstat (limited to 'runtime/syntax/cs.vim')
-rw-r--r-- | runtime/syntax/cs.vim | 276 |
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' |