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
        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);
        }