public void Resolve() { foreach (var unit in metadata.Loader.LoadedUnits) { if (unit is MosaType) { MosaType type = (MosaType)unit; using (var mosaType = metadata.Controller.MutateType(type)) { TypeDef typeDef = type.GetUnderlyingObject <UnitDesc <TypeDef, TypeSig> >().Definition; if (typeDef.BaseType != null) { mosaType.BaseType = metadata.Loader.GetType(typeDef.BaseType.ToTypeSig()); } if (typeDef.DeclaringType != null) { mosaType.DeclaringType = metadata.Loader.GetType(typeDef.DeclaringType.ToTypeSig()); } if (typeDef.IsEnum) { mosaType.ElementType = metadata.Loader.GetType(typeDef.GetEnumUnderlyingType()); } foreach (var iface in typeDef.Interfaces) { mosaType.Interfaces.Add(metadata.Loader.GetType(iface.Interface.ToTypeSig())); } if (typeDef.BaseType != null) { ResolveInterfacesInBaseTypes(mosaType, type.BaseType); } } ResolveType(type); } else if (unit is MosaField || unit is MosaMethod || unit is MosaModule || unit is MosaProperty) { resolveQueue.Enqueue(unit); } } while (resolveQueue.Count > 0) { MosaUnit unit = resolveQueue.Dequeue(); if (unit is MosaType) { ResolveType((MosaType)unit); } if (unit is MosaField) { ResolveField((MosaField)unit); } if (unit is MosaMethod) { ResolveMethod((MosaMethod)unit); } if (unit is MosaProperty) { ResolveProperty((MosaProperty)unit); } if (unit is MosaModule) { MosaModule module = (MosaModule)unit; using (var mosaModule = metadata.Controller.MutateModule(module)) ResolveCustomAttributes(mosaModule, module.GetUnderlyingObject <UnitDesc <ModuleDef, object> >().Definition); } } foreach (var module in metadata.Cache.Modules.Values) { ModuleDef moduleDef = module.GetUnderlyingObject <UnitDesc <ModuleDef, object> >().Definition; if (moduleDef.EntryPoint != null) { using (var mosaModule = metadata.Controller.MutateModule(module)) mosaModule.EntryPoint = metadata.Cache.GetMethodByToken(new ScopedToken(moduleDef, moduleDef.EntryPoint.MDToken)); } } while (arrayResolveQueue.Count > 0) { MosaType type = arrayResolveQueue.Dequeue(); type.FinishSZArray(); } }
public void AddModule(MosaModule module) { Modules.Add(module.Name, module); var desc = module.GetUnderlyingObject<UnitDesc<ModuleDef, object>>(); }