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); }
public StructuralTypeNode Ensure(RuntimicSystemModel model, Type type) { var rowId = type.MetadataToken & 0x00FFFFFF; bool isDerived = rowId < 1; if (isDerived) { if (type.IsPointer) { var pointerStemType = Ensure(model, type.GetElementType()); if (pointerStemType.PointerType != null) { return(pointerStemType.PointerType); } pointerStemType.PointerType = new StructuralTypeNode() { IsPointerType = true, StemType = pointerStemType, IsDerived = true, MetadataToken = type.MetadataToken, CecilTypeReference = pointerStemType.CecilTypeReference.MakeByReferenceType() }; return(pointerStemType.PointerType); } if (type.IsByRef) { var byRefStemType = Ensure(model, type.GetElementType()); if (byRefStemType.ByRefType != null) { return(byRefStemType.ByRefType); } byRefStemType.ByRefType = new StructuralTypeNode() { IsByReferenceType = true, StemType = byRefStemType, IsDerived = true, MetadataToken = type.MetadataToken, CecilTypeReference = byRefStemType.CecilTypeReference.MakeByReferenceType() }; return(byRefStemType.ByRefType); } throw new Exception("Derived type (arrays, generics?) not handled"); } if (type.IsGenericType && !type.IsGenericTypeDefinition) { var genericDefinitionType = type.GetGenericTypeDefinition(); var structuralDefinitionType = Ensure(model, genericDefinitionType); var argumentsTypes = type.GenericTypeArguments; StructuralTypeNode[] genericArguments = new StructuralTypeNode[argumentsTypes.Length]; for (int i = 0; i < argumentsTypes.Length; i++) { genericArguments[i] = Ensure(model, argumentsTypes[i]); } if (CheckForBranch(structuralDefinitionType, genericArguments, out StructuralGenericInstanceTypeNode structuralTypeNode)) { return(structuralTypeNode); } TypeReference[] cecilArguments = GetCecilArguments(genericArguments); structuralTypeNode = new StructuralGenericInstanceTypeNode() { StemType = structuralDefinitionType, CecilTypeReference = structuralDefinitionType.CecilTypeReference.MakeGenericInstanceType(cecilArguments), IsDerived = true, FullName = type.FullName ?? type.Name, IsGenericInstance = true, GenericArguments = genericArguments }; SetNode(structuralDefinitionType, structuralTypeNode); return(structuralTypeNode); } var structuralAssembly = Infrastructure.Structural.Metadata.Assemblies.Ensuring.Ensure(model, type.Assembly); var structuralModuleNode = Infrastructure.Structural.Metadata.Modules.Ensure(model, structuralAssembly, type.Module.ModuleVersionId); // Have a derived type // Have a non-derived type / thus stored type var x = structuralModuleNode.CecilModuleDefinition.LookupToken(type.MetadataToken); var tableId = (int)(type.MetadataToken & 0xFF000000); if (!structuralModuleNode.Tables.TryGetValue(tableId, out StructuralTypeTable table)) { table = new StructuralTypeTable(); structuralModuleNode.Tables.Add(tableId, table); } if (!table.ByRow.TryGetValue((uint)rowId, out StructuralTypeNode structuralTypeNode1)) { throw new Exception("Expected it to already be here."); } return(structuralTypeNode1); }