blob: 8cec04ab6b73917e1ad4642e0e8d4a436416e4d1 [file] [log] [blame]
# -*- coding: utf-8 -*- #
module Rouge
module Lexers
class CSharp < RegexLexer
tag 'csharp'
aliases 'c#', 'cs'
filenames '*.cs'
mimetypes 'text/x-csharp'
title "C#"
desc 'a multi-paradigm language targeting .NET'
# TODO: support more of unicode
id = /@?[_a-z]\w*/i
#Reserved Identifiers
#Contextual Keywords
#LINQ Query Expressions
keywords = %w(
abstract as base break case catch checked const continue
default delegate do else enum event explicit extern false
finally fixed for foreach 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 volatile while
add alias async await get global partial remove set value where
yield
ascending by descending equals from group in into join let on
orderby select
)
keywords_type = %w(
bool byte char decimal double dynamic float int long object
sbyte short string uint ulong ushort var
)
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*"/, Str, :splice_string
# rule /[$]\s*<#/, Str, :splice_recstring
# rule /<#/, Str, :recstring
rule /(<\[)\s*(#{id}:)?/, Keyword
rule /\]>/, Keyword
rule /[~!%^&*()+=|\[\]{}:;,.<>\/?-]/, Punctuation
rule /@"(\\.|.)*?"/, Str
rule /"(\\.|.)*?["\n]/, Str
rule /'(\\.|.)'/, Str::Char
rule /0x[0-9a-f]+[lu]?/i, Num
rule %r(
[0-9]
([.][0-9]*)? # decimal
(e[+-][0-9]+)? # exponent
[fldu]? # type
)ix, Num
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