Exemplo n.º 1
0
        public StructuralTypeNode Ensure(RuntimicSystemModel runtimicSystemModel, StructuralModuleNode structuralModuleNode, TypeReference typeReference)
        {
            var metadataToken = typeReference.MetadataToken.ToInt32();

            var tableId = (int)(metadataToken & 0xFF000000);

            var rowId = metadataToken & 0x00FFFFFF;

            bool isDerived = rowId < 1;

            if (!structuralModuleNode.Tables.TryGetValue(tableId, out StructuralTypeTable table))
            {
                table = new StructuralTypeTable();

                structuralModuleNode.Tables.Add(tableId, table);
            }

            if (table.ByRow.TryGetValue((uint)rowId, out StructuralTypeNode structuralTypeNode))
            {
                return(structuralTypeNode);
            }

            structuralTypeNode = new StructuralTypeNode()
            {
                CecilTypeReference = typeReference,
                MetadataToken      = metadataToken,
                Module             = structuralModuleNode,
                IsDerived          = isDerived,
                FullName           = typeReference.FullName ?? typeReference.Name,
                IsGenericParameter = typeReference.IsGenericParameter
            };

            if (typeReference.IsDefinition)
            {
                var typeDefinition = (TypeDefinition)typeReference;

                structuralTypeNode.GenericParameters = new StructuralTypeNode[typeDefinition.GenericParameters.Count];

                for (int i = 0; i < typeDefinition.GenericParameters.Count; i++)
                {
                    structuralTypeNode.GenericParameters[i] = Ensure(runtimicSystemModel, structuralModuleNode, typeDefinition.GenericParameters[i]);
                }

                for (int i = 0; i < typeDefinition.Methods.Count; i++)
                {
                    var method = typeDefinition.Methods[i];

                    for (int j = 0; j < method.GenericParameters.Count; j++)
                    {
                        Ensure(runtimicSystemModel, structuralModuleNode, method.GenericParameters[j]);
                    }
                }
            }



            table.ByRow.Add((uint)rowId, structuralTypeNode);

            return(structuralTypeNode);
        }
Exemplo n.º 2
0
        private StructuralTypeNode LookupStructuralTypeNode(StructuralModuleNode structuralModuleNode, int tableId, int rowId)
        {
            if (!structuralModuleNode.Tables.TryGetValue(tableId, out StructuralTypeTable table))
            {
                throw new Exception("Expected type definition to already be loaded.");
            }

            if (!table.ByRow.TryGetValue((uint)rowId, out StructuralTypeNode structuralTypeNode))
            {
                throw new Exception("Expected type definition to already be loaded.");
            }

            return(structuralTypeNode);
        }
Exemplo n.º 3
0
        public StructuralModuleNode Ensure(RuntimicSystemModel runtimicSystem, StructuralAssemblyNode structuralAssemblyNode,
                                           ModuleDefinition moduleDefinition)
        {
            var moduleNode = new StructuralModuleNode()
            {
                CecilModuleDefinition = moduleDefinition,
                VersionId             = moduleDefinition.Mvid,
                Assembly = structuralAssemblyNode
            };

            runtimicSystem.TypeSystems.Structural.Modules.ByVersionId.Add(moduleDefinition.Mvid, moduleNode);

            structuralAssemblyNode.Modules.Add(moduleDefinition.Mvid, moduleNode);

            return(moduleNode);
        }
Exemplo n.º 4
0
        public BoundModuleNode EnsureNode(RuntimicSystemModel runtimic, BoundAssemblyNode assemblyNode,
                                          StructuralModuleNode structuralModule)
        {
            var bound = runtimic.TypeSystems.Bound;

            if (bound.Modules.ByVersionId.TryGetValue(structuralModule.VersionId, out BoundModuleNode node))
            {
                return(node);
            }

            var moduleNode = new BoundModuleNode()
            {
                AssemblyNode = assemblyNode,
                InputStructuralDefinition = structuralModule
            };

            bound.Modules.ByVersionId.Add(structuralModule.VersionId, moduleNode);

            moduleNode.BoundModule = Modules.Creation.Create(runtimic, moduleNode);

            return(moduleNode);
        }
Exemplo n.º 5
0
        public ConvertedModuleNode Ensure(ILConversion conversion, ConvertedAssemblyNode assemblyNode, StructuralModuleNode structuralModule)
        {
            if (conversion.MetadataModel.Modules.ByVersionId.TryGetValue(structuralModule.VersionId, out ConvertedModuleNode node))
            {
                return(node);
            }

            var moduleNode = new ConvertedModuleNode()
            {
                AssemblyNode = assemblyNode,
                InputStructuralDefinition = structuralModule
            };

            conversion.MetadataModel.Modules.ByVersionId.Add(structuralModule.VersionId, moduleNode);

            moduleNode.ConvertedModule = Modules.Creation.Create(conversion, moduleNode);

            return(moduleNode);
        }
Exemplo n.º 6
0
        public bool Ensure(RuntimicSystemModel model, StructuralModuleNode structuralModuleNode, int typeMetadataToken, out StructuralTypeNode structuralTypeNode)
        {
            //model.TypeSystems.Structural.Types.

            throw new Exception("");
        }
Exemplo n.º 7
0
        private void EnsureTypeAndNestedTypes(RuntimicSystemModel runtimicSystemModel, StructuralAssemblyNode assemblyNode, StructuralModuleNode structuralModuleNode, TypeDefinition currentType)
        {
            var node = Infrastructure.Structural.Types.Ensure(runtimicSystemModel, structuralModuleNode, currentType);

            assemblyNode.Types.Add(node.FullName, node);

            for (int i = 0; i < currentType.NestedTypes.Count; i++)
            {
                EnsureTypeAndNestedTypes(runtimicSystemModel, assemblyNode, structuralModuleNode, currentType.NestedTypes[i]);
            }
        }