in ReSharper.FSharp/src/FSharp/FSharp.Psi/src/Util/FcsTypeMappingUtil.cs [183:241]
public static IType MapType([NotNull] this ProvidedType providedType, IPsiModule module)
{
if (providedType is not IProxyProvidedType proxyProvidedType)
{
Assertion.Fail("ProvidedType should be IProxyProvidedType");
return TypeFactory.CreateUnknownType(module);
}
if (proxyProvidedType.IsCreatedByProvider &&
providedType.DeclaringType is ProxyProvidedTypeWithContext declaringType)
{
var declaringTypeIType = declaringType.MapType(module);
if (declaringTypeIType.GetTypeElement() is { } x)
return TypeFactory.CreateType(new FSharpGenerativeProvidedNestedClass(providedType, module, x));
var recoveredTypeElement = module
.GetSymbolScope(false)
.GetTypeElementsByCLRName(declaringType.GetClrName())
.FirstOrDefault(t => t is FSharpClassOrProvidedTypeAbbreviation { IsProvidedAndGenerated: true });
Assertion.AssertNotNull(recoveredTypeElement,
"SymbolScope must contain provided and generated FSharpClassOrProvidedTypeAbbreviation ");
return TypeFactory.CreateType(
new FSharpGenerativeProvidedNestedClass(providedType, module, recoveredTypeElement));
}
if (providedType.IsArray)
return TypeFactory.CreateArrayType(providedType.GetElementType().MapType(module), providedType.GetArrayRank(),
NullableAnnotation.Unknown);
if (providedType.IsPointer)
return TypeFactory.CreatePointerType(providedType.GetElementType().MapType(module));
if (!providedType.IsGenericType)
return TypeFactory.CreateTypeByCLRName(proxyProvidedType.GetClrName(), module, true);
if (providedType.GetGenericTypeDefinition() is not IProxyProvidedType genericTypeDefinition)
{
Assertion.Fail("providedType.GetGenericTypeDefinition() should be IProxyProvidedType");
return TypeFactory.CreateUnknownType(module);
}
var typeDefinition =
TypeFactory.CreateTypeByCLRName(genericTypeDefinition.GetClrName(), module, true);
var genericProvidedArgs = providedType.GetGenericArguments();
var genericTypes = new IType[genericProvidedArgs.Length];
for (var i = 0; i < genericProvidedArgs.Length; i++)
genericTypes[i] = MapType(genericProvidedArgs[i], module);
var typeElement = typeDefinition.GetTypeElement();
return typeElement != null
? TypeFactory.CreateType(typeElement, genericTypes)
: TypeFactory.CreateUnknownType(module);
}