module Rouge module Lexers class CSharp < RegexLexer tag 'csharp' aliases 'c#', 'cs' filenames '*.cs' mimetypes 'text/x-csharp' # TODO: support more of unicode id = /@?[_a-z]\w*/i keywords = %w( abstract alias as base break case catch checked const continue default delegate do else enum event explicit extern false finally fixed for foreach global goto if implicit in interface internal is lock new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw true try typeof unchecked unsafe virtual void while get set new partial yield add remove value ) keywords_type = %w( bool byte char decimal double float int long object sbyte short string uint ulong ushort ) cpp_keywords = %w( if endif else elif define undef line error warning region endregion pragma ) state :whitespace do rule /\s+/m, 'Text' rule %r(//.*?\n), 'Comment.Single' rule %r(/[*].*?[*]/)m, 'Comment.Multiline' end state :root do mixin :whitespace rule /^\s*\[.*?\]/, 'Name.Attribute' rule /[$]\s*"/, 'Literal.String', :splice_string rule /[$]\s*<#/, 'Literal.String', :splice_recstring rule /<#/, 'Literal.String', :recstring rule /(<\[)\s*(#{id}:)?/, 'Keyword' rule /\]>/, 'Keyword' rule /[~!%^&*()+=|\[\]{}:;,.<>\/?-]/, 'Punctuation' rule /@"(\\.|.)*?"/, 'Literal.String' rule /"(\\.|.)*?["\n]/, 'Literal.String' rule /'(\\.|.)'/, 'Literal.String.Char' rule /0x[0-9a-f]+[lu]?/i, 'Literal.Number' rule %r( [0-9] ([.][0-9]*)? # decimal (e[+-][0-9]+)? # exponent [fldu]? # type )ix, 'Literal.Number' rule /^#[ \t]*(#{cpp_keywords.join('|')})\b.*?\n/, 'Comment.Preproc' rule /\b(#{keywords.join('|')})\b/, 'Keyword' rule /\b(#{keywords_type.join('|')})\b/, 'Keyword.Type' rule /class|struct/, 'Keyword', :class rule /namespace|using/, 'Keyword', :namespace rule /#{id}(?=\s*[(])/, 'Name.Function' rule id, 'Name' end state :class do mixin :whitespace rule id, 'Name.Class', :pop! end state :namespace do mixin :whitespace rule /(?=[(])/, 'Text', :pop! rule /(#{id}|[.])+/, 'Name.Namespace', :pop! end end end end