Skip to content

Commit 5b806eb

Browse files
Support ValueOption module
1 parent 0696acd commit 5b806eb

File tree

4 files changed

+46
-11
lines changed

4 files changed

+46
-11
lines changed

src/Fable.Transforms/Dart/Replacements.fs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1484,17 +1484,18 @@ let nullables (com: ICompiler) (_: Context) r (t: Type) (i: CallInfo) (thisArg:
14841484
| "get_HasValue", Some c -> makeEqOp r c (makeNull()) BinaryUnequal |> Some
14851485
| _ -> None
14861486

1487-
// See fable-library/Option.ts for more info on how options behave in Fable runtime
1488-
let options (com: ICompiler) (_: Context) r (t: Type) (i: CallInfo) (thisArg: Expr option) (args: Expr list) =
1487+
let options isStruct (com: ICompiler) (_: Context) r (t: Type) (i: CallInfo) (thisArg: Expr option) (args: Expr list) =
14891488
match i.CompiledName, thisArg with
1489+
| "get_None", _ -> NewOption(None, t.Generics.Head, isStruct) |> makeValue r |> Some
1490+
| "Some", _ -> NewOption(List.tryHead args, t.Generics.Head, isStruct) |> makeValue r |> Some
14901491
| "get_Value", Some c -> getOptionValue r t c |> Some
14911492
| "get_IsSome", Some c -> Test(c, OptionTest true, r) |> Some
14921493
| "get_IsNone", Some c -> Test(c, OptionTest false, r) |> Some
14931494
| _ -> None
14941495

1495-
let optionModule (com: ICompiler) (ctx: Context) r (t: Type) (i: CallInfo) (_: Expr option) (args: Expr list) =
1496+
let optionModule isStruct (com: ICompiler) (ctx: Context) r (t: Type) (i: CallInfo) (_: Expr option) (args: Expr list) =
14961497
match i.CompiledName, args with
1497-
| "None", _ -> NewOption(None, t, false) |> makeValue r |> Some
1498+
| "None", _ -> NewOption(None, t, isStruct) |> makeValue r |> Some
14981499
| "GetValue", [c] -> getOptionValue r t c |> Some
14991500
| "IsSome", [c] -> Test(c, OptionTest true, r) |> Some
15001501
| "IsNone", [c] -> Test(c, OptionTest false, r) |> Some
@@ -2708,10 +2709,11 @@ let private replacedModules =
27082709
Types.queue, bclType
27092710
Types.iset, hashSets
27102711
Types.idisposable, disposables
2711-
Types.option, options
2712-
Types.valueOption, options
2712+
Types.option, options false
2713+
Types.valueOption, options true
27132714
"System.Nullable`1", nullables
2714-
"Microsoft.FSharp.Core.OptionModule", optionModule
2715+
"Microsoft.FSharp.Core.OptionModule", optionModule false
2716+
"Microsoft.FSharp.Core.ValueOption", optionModule true
27152717
"Microsoft.FSharp.Core.ResultModule", results
27162718
Types.bigint, bigints
27172719
"Microsoft.FSharp.Core.NumericLiterals.NumericLiteralI", bigints
@@ -2892,7 +2894,7 @@ let tryType = function
28922894
Some(getNumberFullName false kind info, f, [])
28932895
| String -> Some(Types.string, strings, [])
28942896
| Tuple(genArgs, _) as t -> Some(getTypeFullName false t, tuples, genArgs)
2895-
| Option(genArg, _) -> Some(Types.option, options, [genArg])
2897+
| Option(genArg, isStruct) -> Some(Types.option, options isStruct, [genArg])
28962898
| Array(genArg,_) -> Some(Types.array, arrays, [genArg])
28972899
| List genArg -> Some(Types.list, lists, [genArg])
28982900
| Builtin kind ->

src/Fable.Transforms/Replacements.fs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1687,11 +1687,11 @@ let options isStruct (com: ICompiler) (_: Context) r (t: Type) (i: CallInfo) (th
16871687
| "get_IsNone", Some c -> Test(c, OptionTest false, r) |> Some
16881688
| _ -> None
16891689

1690-
let optionModule (com: ICompiler) (ctx: Context) r (t: Type) (i: CallInfo) (_: Expr option) (args: Expr list) =
1690+
let optionModule isStruct (com: ICompiler) (ctx: Context) r (t: Type) (i: CallInfo) (_: Expr option) (args: Expr list) =
16911691
let toArray r t arg =
16921692
Helper.LibCall(com, "Option", "toArray", Array(t, MutableArray), [arg], ?loc=r)
16931693
match i.CompiledName, args with
1694-
| "None", _ -> NewOption(None, t, false) |> makeValue r |> Some
1694+
| "None", _ -> NewOption(None, t, isStruct) |> makeValue r |> Some
16951695
| "GetValue", [c] ->
16961696
Helper.LibCall(com, "Option", "value", t, args, ?loc=r) |> Some
16971697
| ("OfObj" | "OfNullable"), _ ->
@@ -2900,7 +2900,8 @@ let private replacedModules =
29002900
Types.option, options false
29012901
Types.valueOption, options true
29022902
"System.Nullable`1", nullables
2903-
"Microsoft.FSharp.Core.OptionModule", optionModule
2903+
"Microsoft.FSharp.Core.OptionModule", optionModule false
2904+
"Microsoft.FSharp.Core.ValueOption", optionModule true
29042905
"Microsoft.FSharp.Core.ResultModule", results
29052906
Types.bigint, bigints
29062907
"Microsoft.FSharp.Core.NumericLiterals.NumericLiteralI", bigints

tests/Dart/src/OptionTests.fs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,14 @@ let tests() =
7474
Option.isNone o2 |> equal false
7575
Option.isSome o2 |> equal true
7676

77+
testCase "ValueOption.isSome/isNone works" <| fun () ->
78+
let o1: int voption = ValueNone
79+
let o2 = ValueSome 5
80+
ValueOption.isNone o1 |> equal true
81+
ValueOption.isSome o1 |> equal false
82+
ValueOption.isNone o2 |> equal false
83+
ValueOption.isSome o2 |> equal true
84+
7785
testCase "Option.IsSome/IsNone works" <| fun () ->
7886
let o1: int option = None
7987
let o2 = Some 5
@@ -82,6 +90,14 @@ let tests() =
8290
o2.IsNone |> equal false
8391
o2.IsSome |> equal true
8492

93+
testCase "ValueOption.IsSome/IsNone works" <| fun () ->
94+
let o1: int voption = ValueNone
95+
let o2 = Some 5
96+
o1.IsNone |> equal true
97+
o1.IsSome |> equal false
98+
o2.IsNone |> equal false
99+
o2.IsSome |> equal true
100+
85101
testCase "Option.iter works" <| fun () -> // See #198
86102
let mutable res = false
87103
let getOnlyOnce =

tests/Js/Main/OptionTests.fs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,14 @@ let tests =
8080
Option.isNone o2 |> equal false
8181
Option.isSome o2 |> equal true
8282

83+
testCase "ValueOption.isSome/isNone works" <| fun () ->
84+
let o1: int voption = ValueNone
85+
let o2 = ValueSome 5
86+
ValueOption.isNone o1 |> equal true
87+
ValueOption.isSome o1 |> equal false
88+
ValueOption.isNone o2 |> equal false
89+
ValueOption.isSome o2 |> equal true
90+
8391
testCase "Option.IsSome/IsNone works" <| fun () ->
8492
let o1 = None
8593
let o2 = Some 5
@@ -88,6 +96,14 @@ let tests =
8896
o2.IsNone |> equal false
8997
o2.IsSome |> equal true
9098

99+
testCase "ValueOption.IsSome/IsNone works" <| fun () ->
100+
let o1: int voption = ValueNone
101+
let o2 = Some 5
102+
o1.IsNone |> equal true
103+
o1.IsSome |> equal false
104+
o2.IsNone |> equal false
105+
o2.IsSome |> equal true
106+
91107
testCase "Option.iter works" <| fun () -> // See #198
92108
let mutable res = false
93109
let getOnlyOnce =

0 commit comments

Comments
 (0)