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