@@ -703,15 +703,17 @@ let rec stripValue = function
703703 | SizeValue(_, details) -> stripValue details (* step through SizeValue "aliases" *)
704704 | vinfo -> vinfo
705705
706+ [<return : Struct>]
706707let (| StripConstValue | _ |) ev =
707708 match stripValue ev with
708- | ConstValue( c, _) -> Some c
709- | _ -> None
709+ | ConstValue( c, _) -> ValueSome c
710+ | _ -> ValueNone
710711
712+ [<return : Struct>]
711713let (| StripLambdaValue | _ |) ev =
712714 match stripValue ev with
713- | CurriedLambdaValue ( id, arity, sz, expr, ty) -> Some ( id, arity, sz, expr, ty)
714- | _ -> None
715+ | CurriedLambdaValue ( id, arity, sz, expr, ty) -> ValueSome ( id, arity, sz, expr, ty)
716+ | _ -> ValueNone
715717
716718let destTupleValue ev =
717719 match stripValue ev with
@@ -723,10 +725,11 @@ let destRecdValue ev =
723725 | RecdValue (_ tcref, info) -> Some info
724726 | _ -> None
725727
728+ [<return : Struct>]
726729let (| StripUnionCaseValue | _ |) ev =
727730 match stripValue ev with
728- | UnionCaseValue ( c, info) -> Some ( c, info)
729- | _ -> None
731+ | UnionCaseValue ( c, info) -> ValueSome ( c, info)
732+ | _ -> ValueNone
730733
731734let mkBoolVal ( g : TcGlobals ) n = ConstValue( Const.Bool n, g.bool_ ty)
732735
@@ -1764,26 +1767,29 @@ let TryEliminateLet cenv env bind e2 m =
17641767 | None -> mkLetBind m bind e2, 0
17651768
17661769/// Detect the application of a value to an arbitrary number of arguments
1770+ [<return : Struct>]
17671771let rec (| KnownValApp | _ |) expr =
17681772 match stripDebugPoints expr with
1769- | Expr.Val ( vref, _, _) -> Some ( vref, [], [])
1770- | Expr.App ( KnownValApp( vref, typeArgs1, otherArgs1), _, typeArgs2, otherArgs2, _) -> Some ( vref, typeArgs1@ typeArgs2, otherArgs1@ otherArgs2)
1771- | _ -> None
1773+ | Expr.Val ( vref, _, _) -> ValueSome ( vref, [], [])
1774+ | Expr.App ( KnownValApp( vref, typeArgs1, otherArgs1), _, typeArgs2, otherArgs2, _) -> ValueSome ( vref, typeArgs1@ typeArgs2, otherArgs1@ otherArgs2)
1775+ | _ -> ValueNone
17721776
17731777/// Matches boolean decision tree:
17741778/// check single case with bool const.
1779+ [<return : Struct>]
17751780let (| TDBoolSwitch | _ |) dtree =
17761781 match dtree with
17771782 | TDSwitch( expr, [ TCase ( DecisionTreeTest.Const( Const.Bool testBool), caseTree )], Some defaultTree, range) ->
1778- Some ( expr, testBool, caseTree, defaultTree, range)
1783+ ValueSome ( expr, testBool, caseTree, defaultTree, range)
17791784 | _ ->
1780- None
1785+ ValueNone
17811786
17821787/// Check target that have a constant bool value
1788+ [<return : Struct>]
17831789let (| ConstantBoolTarget | _ |) target =
17841790 match target with
1785- | TTarget([], Expr.Const ( Const.Bool b, _, _), _) -> Some b
1786- | _ -> None
1791+ | TTarget([], Expr.Const ( Const.Bool b, _, _), _) -> ValueSome b
1792+ | _ -> ValueNone
17871793
17881794/// Is this a tree, where each decision is a two-way switch (to prevent later duplication of trees), and each branch returns or true/false,
17891795/// apart from one branch which defers to another expression
@@ -2053,50 +2059,59 @@ let ExpandStructuralBinding cenv expr =
20532059 ExpandStructuralBindingRaw cenv e
20542060
20552061/// Detect a query { ... }
2062+ [<return : Struct>]
20562063let (| QueryRun | _ |) g expr =
20572064 match expr with
20582065 | Expr.App ( Expr.Val ( vref, _, _), _, _, [_ builder; arg], _) when valRefEq g vref g.query_ run_ value_ vref ->
2059- Some ( arg, None)
2066+ ValueSome ( arg, None)
20602067 | Expr.App ( Expr.Val ( vref, _, _), _, [ elemTy ], [_ builder; arg], _) when valRefEq g vref g.query_ run_ enumerable_ vref ->
2061- Some ( arg, Some elemTy)
2068+ ValueSome ( arg, Some elemTy)
20622069 | _ ->
2063- None
2070+ ValueNone
20642071
20652072let (| MaybeRefTupled |) e = tryDestRefTupleExpr e
20662073
2074+ [<return : Struct>]
20672075let (| AnyInstanceMethodApp | _ |) e =
20682076 match e with
2069- | Expr.App ( Expr.Val ( vref, _, _), _, tyargs, [ obj; MaybeRefTupled args], _) -> Some ( vref, tyargs, obj, args)
2070- | _ -> None
2077+ | Expr.App ( Expr.Val ( vref, _, _), _, tyargs, [ obj; MaybeRefTupled args], _) -> ValueSome ( vref, tyargs, obj, args)
2078+ | _ -> ValueNone
20712079
2080+ [<return : Struct>]
20722081let (| InstanceMethodApp | _ |) g ( expectedValRef : ValRef ) e =
20732082 match e with
2074- | AnyInstanceMethodApp ( vref, tyargs, obj, args) when valRefEq g vref expectedValRef -> Some ( tyargs, obj, args)
2075- | _ -> None
2083+ | AnyInstanceMethodApp ( vref, tyargs, obj, args) when valRefEq g vref expectedValRef -> ValueSome ( tyargs, obj, args)
2084+ | _ -> ValueNone
20762085
2086+ [<return : Struct>]
20772087let (| QuerySourceEnumerable | _ |) g = function
2078- | InstanceMethodApp g g.query_ source_ vref ([ resTy], _ builder, [ res]) -> Some ( resTy, res)
2079- | _ -> None
2088+ | InstanceMethodApp g g.query_ source_ vref ([ resTy], _ builder, [ res]) -> ValueSome ( resTy, res)
2089+ | _ -> ValueNone
20802090
2091+ [<return : Struct>]
20812092let (| QueryFor | _ |) g = function
2082- | InstanceMethodApp g g.query_ for_ vref ([ srcTy; qTy; resTy;_ qInnerTy], _ builder, [ src; selector]) -> Some ( qTy, srcTy, resTy, src, selector)
2083- | _ -> None
2093+ | InstanceMethodApp g g.query_ for_ vref ([ srcTy; qTy; resTy;_ qInnerTy], _ builder, [ src; selector]) -> ValueSome ( qTy, srcTy, resTy, src, selector)
2094+ | _ -> ValueNone
20842095
2096+ [<return : Struct>]
20852097let (| QueryYield | _ |) g = function
2086- | InstanceMethodApp g g.query_ yield_ vref ([ resTy; qTy], _ builder, [ res]) -> Some ( qTy, resTy, res)
2087- | _ -> None
2098+ | InstanceMethodApp g g.query_ yield_ vref ([ resTy; qTy], _ builder, [ res]) -> ValueSome ( qTy, resTy, res)
2099+ | _ -> ValueNone
20882100
2101+ [<return : Struct>]
20892102let (| QueryYieldFrom | _ |) g = function
2090- | InstanceMethodApp g g.query_ yield_ from_ vref ([ resTy; qTy], _ builder, [ res]) -> Some ( qTy, resTy, res)
2091- | _ -> None
2103+ | InstanceMethodApp g g.query_ yield_ from_ vref ([ resTy; qTy], _ builder, [ res]) -> ValueSome ( qTy, resTy, res)
2104+ | _ -> ValueNone
20922105
2106+ [<return : Struct>]
20932107let (| QuerySelect | _ |) g = function
2094- | InstanceMethodApp g g.query_ select_ vref ([ srcTy; qTy; resTy], _ builder, [ src; selector]) -> Some ( qTy, srcTy, resTy, src, selector)
2095- | _ -> None
2108+ | InstanceMethodApp g g.query_ select_ vref ([ srcTy; qTy; resTy], _ builder, [ src; selector]) -> ValueSome ( qTy, srcTy, resTy, src, selector)
2109+ | _ -> ValueNone
20962110
2111+ [<return : Struct>]
20972112let (| QueryZero | _ |) g = function
2098- | InstanceMethodApp g g.query_ zero_ vref ([ resTy; qTy], _ builder, _) -> Some ( qTy, resTy)
2099- | _ -> None
2113+ | InstanceMethodApp g g.query_ zero_ vref ([ resTy; qTy], _ builder, _) -> ValueSome ( qTy, resTy)
2114+ | _ -> ValueNone
21002115
21012116/// Look for a possible tuple and transform
21022117let (| AnyRefTupleTrans |) e =
@@ -2105,11 +2120,12 @@ let (|AnyRefTupleTrans|) e =
21052120 | _ -> [ e], ( function [ e] -> e | _ -> assert false ; failwith " unreachable" )
21062121
21072122/// Look for any QueryBuilder.* operation and transform
2123+ [<return : Struct>]
21082124let (| AnyQueryBuilderOpTrans | _ |) g = function
21092125 | Expr.App ( Expr.Val ( vref, _, _) as v, vty, tyargs, [ builder; AnyRefTupleTrans( src :: rest, replaceArgs) ], m) when
21102126 ( match vref.ApparentEnclosingEntity with Parent tcref -> tyconRefEq g tcref g.query_ builder_ tcref | ParentNone -> false ) ->
2111- Some ( src, ( fun newSource -> Expr.App ( v, vty, tyargs, [ builder; replaceArgs( newSource :: rest)], m)))
2112- | _ -> None
2127+ ValueSome ( src, ( fun newSource -> Expr.App ( v, vty, tyargs, [ builder; replaceArgs( newSource :: rest)], m)))
2128+ | _ -> ValueNone
21132129
21142130/// If this returns "Some" then the source is not IQueryable.
21152131// <qexprInner> :=
0 commit comments