Completed
Push — master ( 6054a8...c11aa8 )
by Kacper
04:06
created

CSharp::setupRules()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 36
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 4
Bugs 0 Features 0
Metric Value
c 4
b 0
f 0
dl 0
loc 36
rs 8.8571
cc 1
eloc 25
nc 1
nop 0
1
<?php
2
/**
3
 * Highlighter
4
 *
5
 * Copyright (C) 2016, Some right reserved.
6
 *
7
 * @author Kacper "Kadet" Donat <[email protected]>
8
 *
9
 * Contact with author:
10
 * Xmpp: [email protected]
11
 * E-mail: [email protected]
12
 *
13
 * From Kadet with love.
14
 */
15
16
namespace Kadet\Highlighter\Language;
17
18
19
use Kadet\Highlighter\Matcher\RegexMatcher;
20
use Kadet\Highlighter\Matcher\WordMatcher;
21
use Kadet\Highlighter\Parser\Rule;
22
use Kadet\Highlighter\Parser\Token\Token;
23
24
class CSharp extends C
25
{
26
    public function setupRules()
27
    {
28
        parent::setupRules();
29
30
        $this->rules->rule('preprocessor')->setMatcher(new RegexMatcher('/^\s*(#)/m'));
31
        $this->rules->rule('call.preprocessor')->setMatcher(new RegexMatcher('/^\s*#(\w+)/m'));
32
33
        $this->rules->remove('operator'); // & and *
34
        $this->rules->remove('symbol.type', 0); // symbol.type[0] stands for universal type matching in arguments
35
36
        $this->rules->rule('keyword')->setMatcher(new WordMatcher([
37
            'abstract', 'as', 'base', 'break', 'case', 'catch', 'char', 'checked', 'class', 'const', 'continue',
38
            'default', 'delegate', 'do', 'else', 'enum', 'event', 'explicit', 'extern', 'finally', 'fixed', 'for',
39
            'foreach', 'goto', 'if', 'implicit', 'in', 'interface', 'internal', 'is', 'lock', 'namespace', 'new',
40
            'object', 'operator', 'out', 'override', 'partial', 'params', 'private', 'protected', 'public', 'readonly', 'ref',
41
            'return', 'sealed', 'short', 'sizeof', 'stackalloc', 'static', 'string', 'struct', 'switch', 'throw', 'try',
42
            'typeof', 'unchecked', 'unsafe', 'using', 'virtual', 'volatile', 'var', 'while', 'yield',
43
            '__makeref', '__reftype', '__refvalue', '__arglist', 'get', 'set'
44
        ]));
45
46
        $this->rules->addMany([
47
            'symbol.class'          => new Rule(new RegexMatcher('/(\w+)(?:\s+)\w+\s*[={}();,]/')),
48
            'symbol.class.template' => new Rule(new RegexMatcher('/(\w+)\s*<.*?>/')),
49
            'variable.special'      => new Rule(new RegexMatcher('/\b(this)\b/')),
50
            'constant.special'      => new Rule(new WordMatcher(['true', 'false', 'null'])),
51
            'operator'              => new Rule(new RegexMatcher('/([!+-\/*&|^<>=]{1,2}=?)/')),
52
            'operator.scope'        => new Rule(new RegexMatcher('/\w(\??\.)\w/')),
53
54
            'symbol.annotation' => new Rule(
55
                new RegexMatcher('/\[([\w\.]+)\s*(?P<arguments>\((?>[^()]+|(?&arguments))*\))\s*\]/si', [
56
                    1           => Token::NAME,
57
                    'arguments' => '$.arguments'
58
                ])
59
            ),
60
        ]);
61
    }
62
63
    public function getIdentifier()
64
    {
65
        return 'csharp';
66
    }
67
68
    public static function getMetadata()
69
    {
70
        return [
71
            'name'      => ['CSharp', 'C#'],
72
            'mime'      => ['text/x-csharp'],
73
            'extension' => ['*.cs']
74
        ];
75
    }
76
}
77