SymFactory
using Microsoft.CSharp.RuntimeBinder.Syntax;
namespace Microsoft.CSharp.RuntimeBinder.Semantics
{
internal static class SymFactory
{
private static Symbol NewBasicSymbol(SYMKIND kind, Name name, ParentSymbol parent)
{
Symbol symbol;
switch (kind) {
case SYMKIND.SK_NamespaceSymbol:
symbol = new NamespaceSymbol();
symbol.name = name;
break;
case SYMKIND.SK_AggregateSymbol:
symbol = new AggregateSymbol();
symbol.name = name;
break;
case SYMKIND.SK_TypeParameterSymbol:
symbol = new TypeParameterSymbol();
symbol.name = name;
break;
case SYMKIND.SK_FieldSymbol:
symbol = new FieldSymbol();
symbol.name = name;
break;
case SYMKIND.SK_LocalVariableSymbol:
symbol = new LocalVariableSymbol();
symbol.name = name;
break;
case SYMKIND.SK_MethodSymbol:
symbol = new MethodSymbol();
symbol.name = name;
break;
case SYMKIND.SK_PropertySymbol:
symbol = new PropertySymbol();
symbol.name = name;
break;
case SYMKIND.SK_EventSymbol:
symbol = new EventSymbol();
symbol.name = name;
break;
case SYMKIND.SK_Scope:
symbol = new Scope();
symbol.name = name;
break;
case SYMKIND.SK_IndexerSymbol:
symbol = new IndexerSymbol();
symbol.name = name;
break;
default:
throw Error.InternalCompilerError();
}
symbol.setKind(kind);
if (parent != null) {
parent.AddToChildList(symbol);
SymbolStore.InsertChild(parent, symbol);
}
return symbol;
}
public static NamespaceSymbol CreateNamespace(Name name, NamespaceSymbol parent)
{
NamespaceSymbol namespaceSymbol = (NamespaceSymbol)NewBasicSymbol(SYMKIND.SK_NamespaceSymbol, name, parent);
namespaceSymbol.SetAccess(ACCESS.ACC_PUBLIC);
return namespaceSymbol;
}
public static AggregateSymbol CreateAggregate(Name name, NamespaceOrAggregateSymbol parent)
{
AggregateSymbol aggregateSymbol = (AggregateSymbol)NewBasicSymbol(SYMKIND.SK_AggregateSymbol, name, parent);
aggregateSymbol.name = name;
aggregateSymbol.SetSealed(false);
aggregateSymbol.SetAccess(ACCESS.ACC_UNKNOWN);
aggregateSymbol.SetIfaces(null);
aggregateSymbol.SetIfacesAll(null);
aggregateSymbol.SetTypeVars(null);
return aggregateSymbol;
}
public static FieldSymbol CreateMemberVar(Name name, AggregateSymbol parent)
{
return NewBasicSymbol(SYMKIND.SK_FieldSymbol, name, parent) as FieldSymbol;
}
public static LocalVariableSymbol CreateLocalVar(Name name, Scope parent, CType type)
{
LocalVariableSymbol localVariableSymbol = (LocalVariableSymbol)NewBasicSymbol(SYMKIND.SK_LocalVariableSymbol, name, parent);
localVariableSymbol.SetType(type);
localVariableSymbol.SetAccess(ACCESS.ACC_UNKNOWN);
localVariableSymbol.wrap = null;
return localVariableSymbol;
}
public static MethodSymbol CreateMethod(Name name, AggregateSymbol parent)
{
return NewBasicSymbol(SYMKIND.SK_MethodSymbol, name, parent) as MethodSymbol;
}
public static PropertySymbol CreateProperty(Name name, AggregateSymbol parent)
{
return NewBasicSymbol(SYMKIND.SK_PropertySymbol, name, parent) as PropertySymbol;
}
public static EventSymbol CreateEvent(Name name, AggregateSymbol parent)
{
return NewBasicSymbol(SYMKIND.SK_EventSymbol, name, parent) as EventSymbol;
}
public static TypeParameterSymbol CreateMethodTypeParameter(Name pName, MethodSymbol pParent, int index, int indexTotal)
{
TypeParameterSymbol typeParameterSymbol = (TypeParameterSymbol)NewBasicSymbol(SYMKIND.SK_TypeParameterSymbol, pName, pParent);
typeParameterSymbol.SetIndexInOwnParameters(index);
typeParameterSymbol.SetIndexInTotalParameters(indexTotal);
typeParameterSymbol.SetIsMethodTypeParameter(true);
typeParameterSymbol.SetAccess(ACCESS.ACC_PRIVATE);
return typeParameterSymbol;
}
public static TypeParameterSymbol CreateClassTypeParameter(Name pName, AggregateSymbol pParent, int index, int indexTotal)
{
TypeParameterSymbol typeParameterSymbol = (TypeParameterSymbol)NewBasicSymbol(SYMKIND.SK_TypeParameterSymbol, pName, pParent);
typeParameterSymbol.SetIndexInOwnParameters(index);
typeParameterSymbol.SetIndexInTotalParameters(indexTotal);
typeParameterSymbol.SetIsMethodTypeParameter(false);
typeParameterSymbol.SetAccess(ACCESS.ACC_PRIVATE);
return typeParameterSymbol;
}
public static Scope CreateScope()
{
return (Scope)NewBasicSymbol(SYMKIND.SK_Scope, null, null);
}
public static IndexerSymbol CreateIndexer(Name name, ParentSymbol parent)
{
IndexerSymbol indexerSymbol = (IndexerSymbol)NewBasicSymbol(SYMKIND.SK_IndexerSymbol, name, parent);
indexerSymbol.setKind(SYMKIND.SK_PropertySymbol);
indexerSymbol.isOperator = true;
return indexerSymbol;
}
}
}