@@ -2908,6 +2908,21 @@ module Util =
29082908 else
29092909 ValueNone
29102910
2911+ /// Member bound to native code (binding) rather than implemented in F#.
2912+ let private callsExternalBinding ( memb : FSharpMemberOrFunctionOrValue ) =
2913+ isEmittedOrImportedMember memb
2914+ || match memb.DeclaringEntity with
2915+ | Some ent ->
2916+ isGlobalOrImportedFSharpEntity ent
2917+ || isErasedOrStringEnumFSharpEntity ent
2918+ // Fable's own bindings carry no attribute, match by namespace.
2919+ || (
2920+ match ent.TryFullName with
2921+ | Some name -> name.StartsWithAny( " Fable.Core.JS." , " Fable.Core.Py." )
2922+ | None -> false
2923+ )
2924+ | None -> false
2925+
29112926 /// Removes optional arguments set to None in tail position
29122927 let transformOptionalArguments
29132928 ( com : IFableCompiler )
@@ -2923,11 +2938,16 @@ module Util =
29232938 then
29242939 args
29252940 else
2941+ // Native bindings expect the raw value, not F#'s `Some` wrapper for `?` args.
2942+ let unwrapProvidedOptional = callsExternalBinding memb
2943+
29262944 ( memb.CurriedParameterGroups[ 0 ], args, ( true , []))
29272945 |||> Seq.foldBack2 ( fun par arg ( keepChecking , acc ) ->
2928- if keepChecking && par.IsOptionalArg then
2946+ if par.IsOptionalArg then
29292947 match arg with
2930- | Fable.Value( Fable.NewOption( None, _, _), _) -> true , acc
2948+ | Fable.Value( Fable.NewOption( None, _, _), _) when keepChecking -> true , acc
2949+ | Fable.Value( Fable.NewOption( Some value, _, _), _) when unwrapProvidedOptional ->
2950+ false , value :: acc
29312951 | _ -> false , arg :: acc
29322952 else
29332953 false , arg :: acc
0 commit comments