in src/Microsoft.VisualStudio.Composition/ReflectionHelpers.cs [325:382]
internal static string GetTypeName(Type type, bool genericTypeDefinition, bool evenNonPublic, HashSet<Assembly>? relevantAssemblies, HashSet<Type>? relevantEmbeddedTypes)
{
Requires.NotNull(type, nameof(type));
if (type.IsArray)
{
return GetTypeName(type.GetElementType()!, genericTypeDefinition, evenNonPublic, relevantAssemblies, relevantEmbeddedTypes) + "[]";
}
if (relevantAssemblies != null)
{
relevantAssemblies.Add(type.GetTypeInfo().Assembly);
relevantAssemblies.UnionWith(GetAllBaseTypesAndInterfaces(type).Select(t => t.GetTypeInfo().Assembly));
}
if (relevantEmbeddedTypes != null)
{
AddEmbeddedInterfaces(type, relevantEmbeddedTypes);
}
if (type.IsGenericParameter)
{
return type.Name;
}
if (!IsPublic(type, checkGenericTypeArgs: true) && !evenNonPublic)
{
return GetTypeName(type.GetTypeInfo().BaseType ?? typeof(object), genericTypeDefinition, evenNonPublic, relevantAssemblies, relevantEmbeddedTypes);
}
if (type.IsEquivalentTo(typeof(ValueType)))
{
return "object";
}
string result = string.Empty;
if (type.DeclaringType != null)
{
// Take care to propagate generic type arguments to the declaring type.
var declaringTypeInfo = type.DeclaringType.GetTypeInfo();
var declaringType = declaringTypeInfo.ContainsGenericParameters && type.GenericTypeArguments.Length > declaringTypeInfo.GenericTypeArguments.Length
? type.DeclaringType.MakeGenericType(type.GenericTypeArguments.Take(declaringTypeInfo.GenericTypeParameters.Length).ToArray())
: type.DeclaringType;
result = GetTypeName(declaringType, genericTypeDefinition, evenNonPublic, relevantAssemblies, relevantEmbeddedTypes) + ".";
}
if (genericTypeDefinition)
{
result += FilterTypeNameForGenericTypeDefinition(type, type.DeclaringType == null);
}
else
{
string[] typeArguments = type.GetTypeInfo().GenericTypeArguments.Select(t => GetTypeName(t, false, evenNonPublic, relevantAssemblies, relevantEmbeddedTypes)).ToArray();
result += ReplaceBackTickWithTypeArgs(type.DeclaringType == null ? (type.FullName ?? type.Name) : type.Name, typeArguments);
}
return result;
}