static TypeName ConvertGenericType(Type type) { if (type.GetTypeInfo().IsGenericTypeDefinition) { DefaultTypeName result; int skipCount; string plainName = StripMangle(type.Name); if (type.DeclaringType == null) { result = new DefaultTypeName( AssemblyName.FromAssemblyName(type.GetTypeInfo().Assembly.GetName()), plainName, type.Namespace); skipCount = 0; } else { var declaring = FromType(type.DeclaringType); result = new DefaultTypeName(plainName, (DefaultTypeName)declaring); skipCount = declaring.GenericParameterCount; } var gen = type.GetGenericArguments().Skip(skipCount).Select( (t, i) => GenericParameterName.New(result, i, t.Name)).ToArray(); result.FinalizeGenerics(gen); return(result); } var args = type.GetGenericArguments().Select(FromType); return(FromType(type.GetGenericTypeDefinition()).MakeGenericType(args)); }
public static TypeName FromType(Type type) { if (type == null) { throw new ArgumentNullException("type"); } if (type.IsByRef) { return(FromType(type.GetElementType()).MakeByReferenceType()); } else if (type.IsArray) { return(FromType(type.GetElementType()).MakeArrayType(Enumerable.Repeat(ArrayDimension.Unsized, type.GetArrayRank()))); } else if (type.IsPointer) { return(FromType(type.GetElementType()).MakePointerType()); } else if (type.IsGenericParameter) { if (type.GetTypeInfo().DeclaringMethod == null) { return(GenericParameterName.New(FromType(type.DeclaringType), type.GenericParameterPosition, type.Name)); } else { // TODO This is unbound, but getting the method is recursive return(MethodName.GenericParameter(type.GenericParameterPosition)); } } else if (type.GetTypeInfo().IsGenericType) { return(ConvertGenericType(type)); } else { TypeName declaring = null; if (type.DeclaringType == null) { return(new DefaultTypeName( AssemblyName.FromAssemblyName(type.GetTypeInfo().Assembly.GetName()), type.Name, type.Namespace ?? string.Empty)); } else { declaring = FromType(type.DeclaringType); return(new DefaultTypeName(type.Name, (DefaultTypeName)declaring)); } } }