Exemple #1
0
        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();
            }
        }
Exemple #2
0
 public void AddModule(MosaModule module)
 {
     Modules.Add(module.Name, module);
     var desc = module.GetUnderlyingObject<UnitDesc<ModuleDef, object>>();
 }