<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />

SymFactory

static class 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; } } }