/// <summary> /// Convert an IL type reference to an XTypeReference. /// </summary> private static XTypeReference CreateTypeReference(XModule module, TypeReference type) { if (type == null) { return(null); } if (type.IsArray) { var arrayType = (ArrayType)type; var dimensions = arrayType.Dimensions.Select(x => new XArrayDimension(x.LowerBound, x.UpperBound)); return(new XArrayType(AsTypeReference(module, arrayType.ElementType), dimensions)); } // Handle known primitive types var ts = module.TypeSystem; switch (type.MetadataType) { case MetadataType.Boolean: return(ts.Bool); case MetadataType.Byte: return(ts.Byte); case MetadataType.SByte: return(ts.SByte); case MetadataType.Char: return(ts.Char); case MetadataType.Int16: return(ts.Short); case MetadataType.UInt16: return(ts.UShort); case MetadataType.Int32: return(ts.Int); case MetadataType.UInt32: return(ts.UInt); case MetadataType.Int64: return(ts.Long); case MetadataType.UInt64: return(ts.ULong); case MetadataType.Single: return(ts.Float); case MetadataType.Double: return(ts.Double); case MetadataType.Void: return(ts.Void); case MetadataType.IntPtr: return(ts.IntPtr); case MetadataType.UIntPtr: return(ts.UIntPtr); case MetadataType.Object: return(ts.Object); case MetadataType.String: return(ts.String); } if (type.IsByReference) { var byReferenceType = (ByReferenceType)type; return(new XByReferenceType(AsTypeReference(module, byReferenceType.ElementType))); } if (type.IsGenericParameter) { var gp = (GenericParameter)type; return(new ILGenericParameter(module, gp)); } if (type.IsGenericInstance) { var git = (GenericInstanceType)type; var genericArguments = git.GenericArguments.Select(x => AsTypeReference(module, x)); return(new XGenericInstanceType(AsTypeReference(module, git.ElementType), genericArguments)); } if (type.IsPointer) { var pointerType = (PointerType)type; return(new XPointerType(AsTypeReference(module, pointerType.ElementType))); } if (type.IsOptionalModifier) { var modType = (OptionalModifierType)type; return(new XOptionalModifierType(AsTypeReference(module, modType.ModifierType), AsTypeReference(module, modType.ElementType))); } if (type.IsRequiredModifier) { var modType = (RequiredModifierType)type; return(new XRequiredModifierType(AsTypeReference(module, modType.ModifierType), AsTypeReference(module, modType.ElementType))); } if (type is TypeSpecification) { throw new NotImplementedException("Unknown type " + type); } if (type.IsDefinition) { XTypeDefinition typeDef; if (module.TryGetType(type.FullName, out typeDef)) { return(typeDef); // Add extra resolve since some type definitions resolve to others. } } { var declaringType = (type.DeclaringType != null) ? AsTypeReference(module, type.DeclaringType) : null; var genericParameterNames = type.GenericParameters.Select(x => x.Name); return(new XTypeReference.SimpleXTypeReference(module, type.Namespace, type.Name, declaringType, type.IsValueType, genericParameterNames)); } }