1
1
// Copyright (c) .NET Foundation. All rights reserved.
2
2
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3
3
4
+ using System ;
4
5
using System . Collections . Generic ;
5
6
using System . Diagnostics ;
6
7
using Microsoft . AspNetCore . Razor . Language . Syntax . InternalSyntax ;
@@ -9,8 +10,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
9
10
{
10
11
internal class CSharpLanguageCharacteristics : LanguageCharacteristics < CSharpTokenizer >
11
12
{
12
- private static readonly CSharpLanguageCharacteristics _instance = new CSharpLanguageCharacteristics ( ) ;
13
-
14
13
private static Dictionary < SyntaxKind , string > _tokenSamples = new Dictionary < SyntaxKind , string > ( )
15
14
{
16
15
{ SyntaxKind . Arrow , "->" } ,
@@ -64,8 +63,108 @@ internal class CSharpLanguageCharacteristics : LanguageCharacteristics<CSharpTok
64
63
{ SyntaxKind . Transition , "@" } ,
65
64
} ;
66
65
66
+ // Allows performance optimization of GetKeyword such that it need not do Enum.ToString
67
+ private static IReadOnlyDictionary < CSharpKeyword , string > _keywordNames = new Dictionary < CSharpKeyword , string > ( )
68
+ {
69
+ { CSharpKeyword . Await , "await" } ,
70
+ { CSharpKeyword . Abstract , "abstract" } ,
71
+ { CSharpKeyword . Byte , "byte" } ,
72
+ { CSharpKeyword . Class , "class" } ,
73
+ { CSharpKeyword . Delegate , "delegate" } ,
74
+ { CSharpKeyword . Event , "event" } ,
75
+ { CSharpKeyword . Fixed , "fixed" } ,
76
+ { CSharpKeyword . If , "if" } ,
77
+ { CSharpKeyword . Internal , "internal" } ,
78
+ { CSharpKeyword . New , "new" } ,
79
+ { CSharpKeyword . Override , "override" } ,
80
+ { CSharpKeyword . Readonly , "readonly" } ,
81
+ { CSharpKeyword . Short , "short" } ,
82
+ { CSharpKeyword . Struct , "struct" } ,
83
+ { CSharpKeyword . Try , "try" } ,
84
+ { CSharpKeyword . Unsafe , "unsafe" } ,
85
+ { CSharpKeyword . Volatile , "volatile" } ,
86
+ { CSharpKeyword . As , "as" } ,
87
+ { CSharpKeyword . Do , "do" } ,
88
+ { CSharpKeyword . Is , "is" } ,
89
+ { CSharpKeyword . Params , "params" } ,
90
+ { CSharpKeyword . Ref , "ref" } ,
91
+ { CSharpKeyword . Switch , "switch" } ,
92
+ { CSharpKeyword . Ushort , "ushort" } ,
93
+ { CSharpKeyword . While , "while" } ,
94
+ { CSharpKeyword . Case , "case" } ,
95
+ { CSharpKeyword . Const , "const" } ,
96
+ { CSharpKeyword . Explicit , "explicit" } ,
97
+ { CSharpKeyword . Float , "float" } ,
98
+ { CSharpKeyword . Null , "null" } ,
99
+ { CSharpKeyword . Sizeof , "sizeof" } ,
100
+ { CSharpKeyword . Typeof , "typeof" } ,
101
+ { CSharpKeyword . Implicit , "implicit" } ,
102
+ { CSharpKeyword . Private , "private" } ,
103
+ { CSharpKeyword . This , "this" } ,
104
+ { CSharpKeyword . Using , "using" } ,
105
+ { CSharpKeyword . Extern , "extern" } ,
106
+ { CSharpKeyword . Return , "return" } ,
107
+ { CSharpKeyword . Stackalloc , "stackalloc" } ,
108
+ { CSharpKeyword . Uint , "uint" } ,
109
+ { CSharpKeyword . Base , "base" } ,
110
+ { CSharpKeyword . Catch , "catch" } ,
111
+ { CSharpKeyword . Continue , "continue" } ,
112
+ { CSharpKeyword . Double , "double" } ,
113
+ { CSharpKeyword . For , "for" } ,
114
+ { CSharpKeyword . In , "in" } ,
115
+ { CSharpKeyword . Lock , "lock" } ,
116
+ { CSharpKeyword . Object , "object" } ,
117
+ { CSharpKeyword . Protected , "protected" } ,
118
+ { CSharpKeyword . Static , "static" } ,
119
+ { CSharpKeyword . False , "false" } ,
120
+ { CSharpKeyword . Public , "public" } ,
121
+ { CSharpKeyword . Sbyte , "sbyte" } ,
122
+ { CSharpKeyword . Throw , "throw" } ,
123
+ { CSharpKeyword . Virtual , "virtual" } ,
124
+ { CSharpKeyword . Decimal , "decimal" } ,
125
+ { CSharpKeyword . Else , "else" } ,
126
+ { CSharpKeyword . Operator , "operator" } ,
127
+ { CSharpKeyword . String , "string" } ,
128
+ { CSharpKeyword . Ulong , "ulong" } ,
129
+ { CSharpKeyword . Bool , "bool" } ,
130
+ { CSharpKeyword . Char , "char" } ,
131
+ { CSharpKeyword . Default , "default" } ,
132
+ { CSharpKeyword . Foreach , "foreach" } ,
133
+ { CSharpKeyword . Long , "long" } ,
134
+ { CSharpKeyword . Void , "void" } ,
135
+ { CSharpKeyword . Enum , "enum" } ,
136
+ { CSharpKeyword . Finally , "finally" } ,
137
+ { CSharpKeyword . Int , "int" } ,
138
+ { CSharpKeyword . Out , "out" } ,
139
+ { CSharpKeyword . Sealed , "sealed" } ,
140
+ { CSharpKeyword . True , "true" } ,
141
+ { CSharpKeyword . Goto , "goto" } ,
142
+ { CSharpKeyword . Unchecked , "unchecked" } ,
143
+ { CSharpKeyword . Interface , "interface" } ,
144
+ { CSharpKeyword . Break , "break" } ,
145
+ { CSharpKeyword . Checked , "checked" } ,
146
+ { CSharpKeyword . Namespace , "namespace" } ,
147
+ { CSharpKeyword . When , "when" } ,
148
+ } ;
149
+
150
+ private static readonly CSharpLanguageCharacteristics _instance = new CSharpLanguageCharacteristics ( ) ;
151
+
67
152
protected CSharpLanguageCharacteristics ( )
68
153
{
154
+ #if DEBUG
155
+ var values = Enum . GetValues ( typeof ( CSharpKeyword ) ) ;
156
+
157
+ Debug . Assert ( values . Length == _keywordNames . Count , "_keywordNames and CSharpKeyword are out of sync" ) ;
158
+ for ( var i = 0 ; i < values . Length ; i ++ )
159
+ {
160
+ var keyword = ( CSharpKeyword ) values . GetValue ( i ) ;
161
+
162
+ var expectedValue = keyword . ToString ( ) . ToLowerInvariant ( ) ;
163
+ var actualValue = _keywordNames [ keyword ] ;
164
+
165
+ Debug . Assert ( expectedValue == actualValue , "_keywordNames and CSharpKeyword are out of sync for " + expectedValue ) ;
166
+ }
167
+ #endif
69
168
}
70
169
71
170
public static CSharpLanguageCharacteristics Instance => _instance ;
@@ -170,7 +269,12 @@ public override SyntaxKind FlipBracket(SyntaxKind bracket)
170
269
171
270
public static string GetKeyword ( CSharpKeyword keyword )
172
271
{
173
- return keyword . ToString ( ) . ToLowerInvariant ( ) ;
272
+ if ( ! _keywordNames . TryGetValue ( keyword , out var value ) )
273
+ {
274
+ value = keyword . ToString ( ) . ToLowerInvariant ( ) ;
275
+ }
276
+
277
+ return value ;
174
278
}
175
279
}
176
280
}
0 commit comments