public AssemblyMapping(CompilerEnvironment env, CST.AssemblyDef assemblyDef) { ctxt = CST.MessageContextBuilders.Assembly(env.Global, assemblyDef); // Type slots appear as field names in assembly structure, possibly without prefixes, and // as directory names on disk types = new SlotAllocation <CST.TypeName>(env.DebugMode, NameFlavor.LowercaseIdentifier, FriendlyTypeName); if (assemblyDef.Name.Equals(env.Global.MsCorLibName)) { types.Add(env.Global.ArrayTypeConstructorRef.QualifiedTypeName.Type); types.Add(env.Global.ManagedPointerTypeConstructorRef.QualifiedTypeName.Type); } // Types are already in canonical order foreach (var typeDef in assemblyDef.Types.Where(t => t.IsUsed && t.Invalid == null)) { types.Add(typeDef.EffectiveName(env.Global)); } // Assembly slots appear as field names in assembly structures, prefixed by 'A' referencedAssemblies = new SlotAllocation <CST.AssemblyName> (env.DebugMode, NameFlavor.Identifier, FriendlyAssemblyName); var assmEnv = env.Global.Environment().AddAssembly(assemblyDef); foreach (var nm in assmEnv.AllAssembliesInLoadOrder()) { if (!nm.Equals(env.Global.MsCorLibName) && !nm.Equals(assemblyDef.Name)) { referencedAssemblies.Add(nm); } // else: mscorlib is bound into root structure, don't need self ref } }
public string ResolveStringToSlot(string str) { if (stringSlots == null) { // String slots are only used as object fields stringSlots = new SlotAllocation <string>(env.DebugMode, NameFlavor.Identifier, FriendlyStringName); // Collect statistincs on string literals var stringStats = new StringStats(); stringStats.Collect(env.Global, assemblyDef, typeDef); // Setup slots for shared strings foreach (var kv in stringStats) { if (kv.Value == StringBindScope.Type) { stringSlots.Add(kv.Key); } } } return(stringSlots.HasSlot(str) ? stringSlots.For(ctxt, str) : null); }
private static void AddNames( CompilerEnvironment env, CST.AssemblyDef assemblyDef, CST.TypeDef typeDef, SlotAllocation <CST.QualifiedMemberName> methodSlots, SlotAllocation <CST.QualifiedMemberName> fieldSlots, SlotAllocation <CST.QualifiedMemberName> eventSlots, SlotAllocation <CST.QualifiedMemberName> propSlots) { // Allocate slots for any base type so that this type's slots won't collide with them. // NOTE: Not strictly necessary for methods, since only virtual methods of supertype may find their // way into derived type, but seems easiest to just allocate them all. // NOTE: Interface method slots need only be unique within their interface type since the type // id is included in the final slot name. if (typeDef.Extends != null) { var extAssemblyDef = default(CST.AssemblyDef); var extTypeDef = default(CST.TypeDef); if (typeDef.Extends.PrimTryResolve(env.Global, out extAssemblyDef, out extTypeDef)) { AddNames(env, extAssemblyDef, extTypeDef, methodSlots, fieldSlots, eventSlots, propSlots); } } // Members are already in canonical order foreach (var memberDef in typeDef.Members.Where(m => m.IsUsed && m.Invalid == null)) { var name = memberDef.QualifiedMemberName(env.Global, assemblyDef, typeDef); switch (memberDef.Flavor) { case CST.MemberDefFlavor.Field: { fieldSlots.Add(name); break; } case CST.MemberDefFlavor.Event: { eventSlots.Add(name); break; } case CST.MemberDefFlavor.Method: { methodSlots.Add(name); break; } case CST.MemberDefFlavor.Property: { propSlots.Add(name); break; } default: throw new ArgumentOutOfRangeException(); } } return; }