Exemple #1
0
        TypeBuilder CreateTypeBuilder(DataType dt, TypeBuilder parent, TypeAttributes typeAttrs, Type typeBase)
        {
            var result = parent?.DefineNestedType(dt.CilTypeName(), dt.CilTypeAttributes(true) | typeAttrs, typeBase) ?? _module.DefineType(dt.CilTypeName(), dt.CilTypeAttributes(false) | typeAttrs, typeBase);
            var data   = new CilType(_backend, _essentials, _linker, result, dt);

            if (!dt.IsEnum && dt.IsFlattenedDefinition)
            {
                var flatParams     = dt.FlattenedParameters;
                var flatParamNames = new string[flatParams.Length];

                for (int i = 0, l = flatParamNames.Length; i < l; i++)
                {
                    flatParamNames[i] = flatParams[i].Name;
                }

                var resultParams = result.DefineGenericParameters(flatParamNames);

                for (int i = 0; i < resultParams.Length; i++)
                {
                    data.GenericParameters.Add(new CilMember <GenericTypeParameterBuilder, GenericParameterType>(resultParams[i], flatParams[i]));
                }

                if (dt.IsGenericDefinition)
                {
                    var dtParams = dt.GenericParameters;

                    for (int i = 0, l = dtParams.Length; i < l; i++)
                    {
                        _linker.AddType(dtParams[i], resultParams[resultParams.Length - dtParams.Length + i]);
                    }
                }
            }

            _linker.AddType(dt, result);
            Add(data);
            return(result);
        }
Exemple #2
0
        public Type GetType(DataType dt)
        {
            Type result;

            if (_types.TryGetValue(dt, out result))
            {
                return(result);
            }

            switch (dt.TypeType)
            {
            case TypeType.RefArray:
                result = GetType(dt.ElementType).MakeArrayType();
                break;

            case TypeType.Enum:
                if (!dt.IsMasterDefinition)
                {
                    result = GetType(dt.MasterDefinition);
                }
                else if (dt.IsNestedType)
                {
                    result = GetType(dt.ParentType).GetNestedType(dt.CilTypeName(), BindingFlags.Public | BindingFlags.NonPublic);
                }

                break;

            case TypeType.Class:
            case TypeType.Struct:
            case TypeType.Interface:
            case TypeType.Delegate:
                if (dt.IsFlattenedParameterization)
                {
                    var fargs = dt.FlattenedArguments;
                    var pargs = new Type[fargs.Length];

                    for (int i = 0; i < pargs.Length; i++)
                    {
                        pargs[i] = GetType(fargs[i]);
                    }

                    if (!dt.IsMasterDefinition)     // Should always be true
                    {
                        result = GetType(dt.MasterDefinition).MakeGenericType(pargs);
                    }
                }

                if (result == null && dt.IsNestedType)
                {
                    result = GetType(dt.ParentType).GetNestedType(dt.CilTypeName(), BindingFlags.Public | BindingFlags.NonPublic);
                }

                break;

            case TypeType.GenericParameter:
            {
                var pt = (GenericParameterType)dt;

                if (pt.IsGenericTypeParameter)
                {
                    var gt    = pt.GenericTypeParent;
                    var owner = GetType(gt);

                    var gargs = owner.GetGenericArguments();
                    var pargs = gt.FlattenedParameters;

                    for (int i = 0, l = gargs.Length; i < l; i++)
                    {
                        if (pargs[i] == pt)
                        {
                            result = gargs[i];
                        }

                        _types[pargs[i]] = gargs[i];
                    }

                    if (result != null)
                    {
                        return(result);
                    }
                }

                break;
            }
            }

            if (result == null)
            {
                var asm = dt.Package.Tag as Assembly;

                if (dt.HasAttribute(_essentials.DotNetTypeAttribute) && !_isReferenceAssembly)
                {
                    result = TryGetType(dt.TryGetAttributeString(_essentials.DotNetTypeAttribute) ?? dt.CilTypeName());
                }
                else if (asm != null)
                {
                    result = asm.GetType(dt.CilTypeName());
                }

                if (result == null)
                {
                    throw new FatalException(dt.Source, ErrorCode.E0000, ".NET type not resolved: " + dt + " [flags: " + dt.Stats + "]");
                }
            }

            _types.Add(dt, result);
            return(result);
        }