1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 using System.Diagnostics;
6 
7 namespace Microsoft.CSharp.RuntimeBinder.Syntax
8 {
9     internal static class NameManager
10     {
11         private static readonly Name[] s_predefinedNames = {
12             new Name(".ctor"),
13             new Name("Finalize"),
14             new Name(".cctor"),
15             new Name("*"),
16             new Name("?*"),
17             new Name("#"),
18             new Name("&"),
19             new Name("[X\001"),
20             new Name("[X\002"),
21             new Name("[X\003"),
22             new Name("[G\001"),
23             new Name("[G\002"),
24             new Name("[G\003"),
25             new Name("Invoke"),
26             new Name("Length"),
27             new Name("Item"),
28             new Name("$Item$"),
29             new Name("Combine"),
30             new Name("Remove"),
31             new Name("op_Explicit"),
32             new Name("op_Implicit"),
33             new Name("op_UnaryPlus"),
34             new Name("op_UnaryNegation"),
35             new Name("op_OnesComplement"),
36             new Name("op_Increment"),
37             new Name("op_Decrement"),
38             new Name("op_Addition"),
39             new Name("op_Subtraction"),
40             new Name("op_Multiply"),
41             new Name("op_Division"),
42             new Name("op_Modulus"),
43             new Name("op_ExclusiveOr"),
44             new Name("op_BitwiseAnd"),
45             new Name("op_BitwiseOr"),
46             new Name("op_LeftShift"),
47             new Name("op_RightShift"),
48             new Name("op_Equals"),
49             new Name("op_Compare"),
50             new Name("op_Equality"),
51             new Name("op_Inequality"),
52             new Name("op_GreaterThan"),
53             new Name("op_LessThan"),
54             new Name("op_GreaterThanOrEqual"),
55             new Name("op_LessThanOrEqual"),
56             new Name("op_True"),
57             new Name("op_False"),
58             new Name("op_LogicalNot"),
59             new Name("Concat"),
60             new Name("Add"),
61             new Name("get_Length"),
62             new Name("get_Chars"),
63             new Name("CreateDelegate"),
64             new Name("FixedElementField"),
65             new Name("HasValue"),
66             new Name("get_HasValue"),
67             new Name("Value"),
68             new Name("get_Value"),
69             new Name("GetValueOrDefault"),
70             new Name("?"),
71             new Name("<?>"),
72             new Name("Lambda"),
73             new Name("Parameter"),
74             new Name("Constant"),
75             new Name("Convert"),
76             new Name("ConvertChecked"),
77             new Name("AddChecked"),
78             new Name("Divide"),
79             new Name("Modulo"),
80             new Name("Multiply"),
81             new Name("MultiplyChecked"),
82             new Name("Subtract"),
83             new Name("SubtractChecked"),
84             new Name("And"),
85             new Name("Or"),
86             new Name("ExclusiveOr"),
87             new Name("LeftShift"),
88             new Name("RightShift"),
89             new Name("AndAlso"),
90             new Name("OrElse"),
91             new Name("Equal"),
92             new Name("NotEqual"),
93             new Name("GreaterThanOrEqual"),
94             new Name("GreaterThan"),
95             new Name("LessThan"),
96             new Name("LessThanOrEqual"),
97             new Name("ArrayIndex"),
98             new Name("Assign"),
99             new Name("Condition"),
100             new Name("Field"),
101             new Name("Call"),
102             new Name("New"),
103             new Name("Quote"),
104             new Name("ArrayLength"),
105             new Name("UnaryPlus"),
106             new Name("Negate"),
107             new Name("NegateChecked"),
108             new Name("Not"),
109             new Name("NewArrayInit"),
110             new Name("Property"),
111             new Name("AddEventHandler"),
112             new Name("RemoveEventHandler"),
113             new Name("InvocationList"),
114             new Name("GetOrCreateEventRegistrationTokenTable"),
115             new Name("void"),
116             new Name(""),
117             /* Above here corresponds with PredefinedName enum */
118             new Name("true"),
119             new Name("false"),
120             new Name("null"),
121             new Name("base"),
122             new Name("this"),
123             new Name("explicit"),
124             new Name("implicit"),
125             new Name("__arglist"),
126             new Name("__makeref"),
127             new Name("__reftype"),
128             new Name("__refvalue"),
129             new Name("as"),
130             new Name("checked"),
131             new Name("is"),
132             new Name("typeof"),
133             new Name("unchecked")
134         };
135 
136         private static readonly NameTable s_names = GetKnownNames();
137 
GetKnownNames()138         private static NameTable GetKnownNames()
139         {
140             NameTable table = new NameTable();
141 
142             foreach (Name name in s_predefinedNames)
143             {
144                 table.Add(name);
145             }
146 
147             return table;
148         }
149 
Add(string key)150         internal static Name Add(string key)
151         {
152             if (key == null)
153             {
154                 throw Error.InternalCompilerError();
155             }
156 
157             return s_names.Add(key);
158         }
159 
Add(string key, int length)160         internal static Name Add(string key, int length)
161         {
162             Debug.Assert(key != null);
163             Debug.Assert(key.Length >= length);
164             return s_names.Add(key, length);
165         }
166 
GetPredefinedName(PredefinedName id)167         internal static Name GetPredefinedName(PredefinedName id)
168         {
169             Debug.Assert(id < PredefinedName.PN_COUNT);
170             return s_predefinedNames[(int)id];
171         }
172     }
173 }
174