Skip to content

Commit 4a20522

Browse files
ProvidedTypeBuilder.MakeGenericType should use t.MakeGenericType when all types are not provided
1 parent add1d43 commit 4a20522

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

src/ProvidedTypes.fs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8339,7 +8339,20 @@ namespace ProviderImplementation.ProvidedTypes
83398339
| :? TargetTypeDefinition -> failwithf "unexpected target model in ProvidedTypeBuilder.MakeGenericType, stacktrace = %s " Environment.StackTrace
83408340
| :? ProvidedTypeDefinition as ptd when ptd.BelongsToTargetModel -> failwithf "unexpected target model ptd in MakeGenericType, stacktrace = %s " Environment.StackTrace
83418341
| :? ProvidedTypeDefinition -> ProvidedTypeSymbol(ProvidedTypeSymbolKind.Generic genericTypeDefinition, genericArguments, ProvidedTypeBuilder.typeBuilder) :> Type
8342-
| _ -> TypeSymbol(TypeSymbolKind.OtherGeneric genericTypeDefinition, List.toArray genericArguments, ProvidedTypeBuilder.typeBuilder) :> Type
8342+
| _ ->
8343+
let hasProvidedArguments =
8344+
genericArguments
8345+
|> List.exists (function
8346+
| :? ProvidedTypeDefinition
8347+
| :? ProvidedTypeSymbol -> true
8348+
| _ -> false )
8349+
if hasProvidedArguments then
8350+
TypeSymbol(TypeSymbolKind.OtherGeneric genericTypeDefinition, List.toArray genericArguments, ProvidedTypeBuilder.typeBuilder) :> Type
8351+
else
8352+
// both genericTypeDefinition and genericArguments are not provided,
8353+
// fallback on fx MakeGenericType
8354+
genericTypeDefinition.MakeGenericType(List.toArray genericArguments)
8355+
83438356

83448357
static member MakeGenericMethod(genericMethodDefinition, genericArguments: Type list) =
83458358
if genericArguments.Length = 0 then genericMethodDefinition else

tests/BasicErasedProvisionTests.fs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,13 @@ let ``test basic symbol type ops``() =
296296
t2T.GetConstructors() |> ignore
297297
t2T.GetMethod("get_Item1") |> ignore
298298

299+
// MakeGenericType should fallback to classic generic type when neither typedef and arguments are generated
300+
301+
let t3 = ProvidedTypeBuilder.MakeGenericType(typedefof<seq<_>>, [ typeof<bool> ])
302+
Assert.NotEqual<string>("TypeSymbol", t3.GetType().Name )
303+
304+
305+
299306
let stressTestCore() =
300307
let refs = Targets.DotNetStandard20FSharpRefs()
301308
let config = Testing.MakeSimulatedTypeProviderConfig (resolutionFolder=__SOURCE_DIRECTORY__, runtimeAssembly="whatever.dll", runtimeAssemblyRefs=refs)

0 commit comments

Comments
 (0)