NameManager
class NameManager
using System.Threading;
namespace Microsoft.CSharp.RuntimeBinder.Syntax
{
internal class NameManager
{
internal class KnownName : Name
{
private PredefinedName _id = PredefinedName.PN_COUNT;
public override PredefinedName PredefinedName => _id;
public KnownName(string text)
: base(text)
{
}
public KnownName(string text, PredefinedName id)
: base(text)
{
_id = id;
}
}
private static NameTable s_knownNames;
private static KnownName[] s_predefinedNames = new KnownName[103] {
new KnownName(".ctor", PredefinedName.PN_CTOR),
new KnownName("Finalize", PredefinedName.PN_DTOR),
new KnownName(".cctor", PredefinedName.PN_STATCTOR),
new KnownName("*", PredefinedName.PN_PTR),
new KnownName("?*", PredefinedName.PN_NUB),
new KnownName("#", PredefinedName.PN_OUTPARAM),
new KnownName("&", PredefinedName.PN_REFPARAM),
new KnownName("[X 01", PredefinedName.PN_ARRAY0),
new KnownName("[X 02", PredefinedName.PN_ARRAY1),
new KnownName("[X 03", PredefinedName.PN_ARRAY2),
new KnownName("[G 01", PredefinedName.PN_GARRAY0),
new KnownName("[G 02", PredefinedName.PN_GARRAY1),
new KnownName("[G 03", PredefinedName.PN_GARRAY2),
new KnownName("Invoke", PredefinedName.PN_INVOKE),
new KnownName("Length", PredefinedName.PN_LENGTH),
new KnownName("Item", PredefinedName.PN_INDEXER),
new KnownName("$Item$", PredefinedName.PN_INDEXERINTERNAL),
new KnownName("Combine", PredefinedName.PN_COMBINE),
new KnownName("Remove", PredefinedName.PN_REMOVE),
new KnownName("op_Explicit", PredefinedName.PN_OPEXPLICITMN),
new KnownName("op_Implicit", PredefinedName.PN_OPIMPLICITMN),
new KnownName("op_UnaryPlus", PredefinedName.PN_OPUNARYPLUS),
new KnownName("op_UnaryNegation", PredefinedName.PN_OPUNARYMINUS),
new KnownName("op_OnesComplement", PredefinedName.PN_OPCOMPLEMENT),
new KnownName("op_Increment", PredefinedName.PN_OPINCREMENT),
new KnownName("op_Decrement", PredefinedName.PN_OPDECREMENT),
new KnownName("op_Addition", PredefinedName.PN_OPPLUS),
new KnownName("op_Subtraction", PredefinedName.PN_OPMINUS),
new KnownName("op_Multiply", PredefinedName.PN_OPMULTIPLY),
new KnownName("op_Division", PredefinedName.PN_OPDIVISION),
new KnownName("op_Modulus", PredefinedName.PN_OPMODULUS),
new KnownName("op_ExclusiveOr", PredefinedName.PN_OPXOR),
new KnownName("op_BitwiseAnd", PredefinedName.PN_OPBITWISEAND),
new KnownName("op_BitwiseOr", PredefinedName.PN_OPBITWISEOR),
new KnownName("op_LeftShift", PredefinedName.PN_OPLEFTSHIFT),
new KnownName("op_RightShift", PredefinedName.PN_OPRIGHTSHIFT),
new KnownName("op_Equals", PredefinedName.PN_OPEQUALS),
new KnownName("op_Compare", PredefinedName.PN_OPCOMPARE),
new KnownName("op_Equality", PredefinedName.PN_OPEQUALITY),
new KnownName("op_Inequality", PredefinedName.PN_OPINEQUALITY),
new KnownName("op_GreaterThan", PredefinedName.PN_OPGREATERTHAN),
new KnownName("op_LessThan", PredefinedName.PN_OPLESSTHAN),
new KnownName("op_GreaterThanOrEqual", PredefinedName.PN_OPGREATERTHANOREQUAL),
new KnownName("op_LessThanOrEqual", PredefinedName.PN_OPLESSTHANOREQUAL),
new KnownName("op_True", PredefinedName.PN_OPTRUE),
new KnownName("op_False", PredefinedName.PN_OPFALSE),
new KnownName("op_LogicalNot", PredefinedName.PN_OPNEGATION),
new KnownName("Concat", PredefinedName.PN_CONCAT),
new KnownName("Add", PredefinedName.PN_ADD),
new KnownName("get_Length", PredefinedName.PN_GETLENGTH),
new KnownName("get_Chars", PredefinedName.PN_GETCHARS),
new KnownName("CreateDelegate", PredefinedName.PN_CREATEDELEGATE),
new KnownName("FixedElementField", PredefinedName.PN_FIXEDELEMENT),
new KnownName("HasValue", PredefinedName.PN_HASVALUE),
new KnownName("get_HasValue", PredefinedName.PN_GETHASVALUE),
new KnownName("Value", PredefinedName.PN_CAP_VALUE),
new KnownName("get_Value", PredefinedName.PN_GETVALUE),
new KnownName("GetValueOrDefault", PredefinedName.PN_GET_VALUE_OR_DEF),
new KnownName("?", PredefinedName.PN_MISSING),
new KnownName("<?>", PredefinedName.PN_MISSINGSYM),
new KnownName("Lambda", PredefinedName.PN_LAMBDA),
new KnownName("Parameter", PredefinedName.PN_PARAMETER),
new KnownName("Constant", PredefinedName.PN_CONSTANT),
new KnownName("Convert", PredefinedName.PN_CONVERT),
new KnownName("ConvertChecked", PredefinedName.PN_CONVERTCHECKED),
new KnownName("AddChecked", PredefinedName.PN_ADDCHECKED),
new KnownName("Divide", PredefinedName.PN_DIVIDE),
new KnownName("Modulo", PredefinedName.PN_MODULO),
new KnownName("Multiply", PredefinedName.PN_MULTIPLY),
new KnownName("MultiplyChecked", PredefinedName.PN_MULTIPLYCHECKED),
new KnownName("Subtract", PredefinedName.PN_SUBTRACT),
new KnownName("SubtractChecked", PredefinedName.PN_SUBTRACTCHECKED),
new KnownName("And", PredefinedName.PN_AND),
new KnownName("Or", PredefinedName.PN_OR),
new KnownName("ExclusiveOr", PredefinedName.PN_EXCLUSIVEOR),
new KnownName("LeftShift", PredefinedName.PN_LEFTSHIFT),
new KnownName("RightShift", PredefinedName.PN_RIGHTSHIFT),
new KnownName("AndAlso", PredefinedName.PN_ANDALSO),
new KnownName("OrElse", PredefinedName.PN_ORELSE),
new KnownName("Equal", PredefinedName.PN_EQUAL),
new KnownName("NotEqual", PredefinedName.PN_NOTEQUAL),
new KnownName("GreaterThanOrEqual", PredefinedName.PN_GREATERTHANOREQUAL),
new KnownName("GreaterThan", PredefinedName.PN_GREATERTHAN),
new KnownName("LessThan", PredefinedName.PN_LESSTHAN),
new KnownName("LessThanOrEqual", PredefinedName.PN_LESSTHANOREQUAL),
new KnownName("ArrayIndex", PredefinedName.PN_ARRAYINDEX),
new KnownName("Assign", PredefinedName.PN_ASSIGN),
new KnownName("Condition", PredefinedName.PN_CONDITION),
new KnownName("Field", PredefinedName.PN_CAP_FIELD),
new KnownName("Call", PredefinedName.PN_CALL),
new KnownName("New", PredefinedName.PN_NEW),
new KnownName("Quote", PredefinedName.PN_QUOTE),
new KnownName("ArrayLength", PredefinedName.PN_ARRAYLENGTH),
new KnownName("UnaryPlus", PredefinedName.PN_PLUS),
new KnownName("Negate", PredefinedName.PN_NEGATE),
new KnownName("NegateChecked", PredefinedName.PN_NEGATECHECKED),
new KnownName("Not", PredefinedName.PN_NOT),
new KnownName("NewArrayInit", PredefinedName.PN_NEWARRAYINIT),
new KnownName("Property", PredefinedName.PN_EXPRESSION_PROPERTY),
new KnownName("AddEventHandler", PredefinedName.PN_ADDEVENTHANDLER),
new KnownName("RemoveEventHandler", PredefinedName.PN_REMOVEEVENTHANDLER),
new KnownName("InvocationList", PredefinedName.PN_INVOCATIONLIST),
new KnownName("GetOrCreateEventRegistrationTokenTable", PredefinedName.PN_GETORCREATEEVENTREGISTRATIONTOKENTABLE)
};
private static KnownName[] s_otherNames = new KnownName[17] {
new KnownName("true"),
new KnownName("false"),
new KnownName("null"),
new KnownName("base"),
new KnownName("this"),
new KnownName("explicit"),
new KnownName("implicit"),
new KnownName("__arglist"),
new KnownName("__makeref"),
new KnownName("__reftype"),
new KnownName("__refvalue"),
new KnownName("as"),
new KnownName("checked"),
new KnownName("is"),
new KnownName("typeof"),
new KnownName("unchecked"),
new KnownName("void")
};
private NameTable _names;
private void InitKnownNames()
{
if (s_knownNames == null) {
NameTable nameTable = new NameTable();
int i = 0;
for (int num = s_predefinedNames.Length; i < num; i++) {
Name name = s_predefinedNames[i];
nameTable.Add(name);
}
KnownName[] array = s_otherNames;
foreach (KnownName name2 in array) {
nameTable.Add(name2);
}
Interlocked.CompareExchange(ref s_knownNames, nameTable, null);
}
}
internal NameManager()
: this(new NameTable())
{
}
internal NameManager(NameTable nameTable)
{
_names = nameTable;
InitKnownNames();
}
internal Name Add(string key)
{
if (key == null)
throw Error.InternalCompilerError();
Name name = s_knownNames.Lookup(key);
if (name == null)
name = _names.Add(key);
return name;
}
internal Name Lookup(string key)
{
if (key == null)
throw Error.InternalCompilerError();
Name name = s_knownNames.Lookup(key);
if (name == null)
name = _names.Lookup(key);
return name;
}
internal Name GetPredefinedName(PredefinedName id)
{
return s_predefinedNames[(int)id];
}
internal Name GetPredefName(PredefinedName id)
{
return GetPredefinedName(id);
}
}
}