diff --git a/src/ProvidedTypes.fs b/src/ProvidedTypes.fs index f39fa85..ad3d13b 100644 --- a/src/ProvidedTypes.fs +++ b/src/ProvidedTypes.fs @@ -9196,6 +9196,8 @@ namespace ProviderImplementation.ProvidedTypes ) |> ignore sourceAssemblies_ + let getSourceAssembliesTable() = getSourceAssemblies() |> ignore; sourceAssembliesTable_ + /// When translating quotations, Expr.Var's are translated to new variable respecting reference equality. let varTableFwd = Dictionary() let varTableBwd = Dictionary() @@ -9254,10 +9256,22 @@ namespace ProviderImplementation.ProvidedTypes | _ -> let asms = (if toTgt then getTargetAssemblies() else getSourceAssemblies()) let fullName = fixName t.FullName - - let bestGuess = - asms |> Seq.tryFind(fun a -> a.FullName = t.Assembly.FullName) - |> Option.bind(fun a -> tryGetTypeFromAssembly toTgt t.Assembly.FullName fullName a) + let asmSimpleName = t.Assembly.GetName().Name + + // Use the assembly-name dictionary (O(1)) rather than a sequential scan. + // Fall through to None if the assembly isn't in the table, which lets the + // linear fallback below handle cross-assembly type forwarding edge cases. + let bestGuess = + if toTgt then + let table = getTargetAssembliesTable() + match table.TryGetValue(asmSimpleName) with + | true, Choice1Of2 asm -> tryGetTypeFromAssembly toTgt t.Assembly.FullName fullName asm + | _ -> None + else + let table = getSourceAssembliesTable() + match table.TryGetValue(asmSimpleName) with + | true, asm -> tryGetTypeFromAssembly toTgt t.Assembly.FullName fullName asm + | _ -> None match bestGuess with | Some (newT, canSave) ->