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); }
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); }
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); }
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); }
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); }
public bool Ensure(RuntimicSystemModel model, StructuralModuleNode structuralModuleNode, int typeMetadataToken, out StructuralTypeNode structuralTypeNode) { //model.TypeSystems.Structural.Types. throw new Exception(""); }
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]); } }