@@ -213,14 +213,18 @@ let mkAttributes (creationAide: CreationAide) (al: SynAttributeList list) : Mult
213213 let range = attributeLists |> List.map ( fun al -> al.Range) |> combineRanges
214214 Some( MultipleAttributeListNode( attributeLists, range))
215215
216+ /// Only used to get items of SynExpr.ArrayOrListComputed
217+ /// We can safely assume the SequentialTrivia.SeparatorRange is not going to be `then`.
216218let (| Sequentials | _ |) e =
217219 let rec visit ( e : SynExpr ) ( finalContinuation : SynExpr list -> SynExpr list ) : SynExpr list =
218220 match e with
219- | SynExpr.Sequential(_, _, e1, e2, _) -> visit e2 ( fun xs -> e1 :: xs |> finalContinuation)
221+ | SynExpr.Sequential( expr1 = e1; expr2 = e2) ->
222+
223+ visit e2 ( fun xs -> e1 :: xs |> finalContinuation)
220224 | e -> finalContinuation [ e ]
221225
222226 match e with
223- | SynExpr.Sequential(_, _, e1, e2 , _ ) ->
227+ | SynExpr.Sequential( expr1 = e1; expr2 = e2 ) ->
224228 let xs = visit e2 id
225229 Some( e1 :: xs)
226230 | _ -> None
@@ -332,12 +336,25 @@ let rec collectComputationExpressionStatements
332336
333337 collectComputationExpressionStatements creationAide body ( fun bodyStatements ->
334338 [ letOrUseBang; yield ! andBangs; yield ! bodyStatements ] |> finalContinuation)
335- | SynExpr.Sequential(_, _, e1, e2 , _ ) ->
339+ | SynExpr.Sequential( expr1 = e1; expr2 = e2 ; trivia = trivia ) ->
336340 let continuations
337341 : (( ComputationExpressionStatement list -> ComputationExpressionStatement list )
338342 -> ComputationExpressionStatement list ) list =
339- [ collectComputationExpressionStatements creationAide e1
340- collectComputationExpressionStatements creationAide e2 ]
343+ let c2 =
344+ match trivia.SeparatorRange with
345+ // detect then keyword in explicit constructor
346+ | Some mThen when mThen.StartColumn + 4 = mThen.EndColumn ->
347+ let thenNode = stn " then" mThen
348+ let expr = mkExpr creationAide e2
349+ let m = unionRanges mThen e2.Range
350+ let node = ExprExplicitConstructorThenExpr( thenNode, expr, m)
351+
352+ fun finalContinuation ->
353+ finalContinuation
354+ [ ComputationExpressionStatement.OtherStatement( Expr.ExplicitConstructorThenExpr node) ]
355+ | _ -> collectComputationExpressionStatements creationAide e2
356+
357+ [ collectComputationExpressionStatements creationAide e1; c2 ]
341358
342359 let finalContinuation ( nodes : ComputationExpressionStatement list list ) : ComputationExpressionStatement list =
343360 List.collect id nodes |> finalContinuation
@@ -2732,10 +2749,7 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) =
27322749 accessibility = ao)
27332750 expr = expr
27342751 trivia = { EqualsRange = Some mEq })) when ( newIdent.idText = " new" ) ->
2735- let exprNode , thenExprNode =
2736- match expr with
2737- | SynExpr.Sequential(_, false , e1, e2, _) -> mkExpr creationAide e1, Some( mkExpr creationAide e2)
2738- | e -> mkExpr creationAide e, None
2752+ let exprNode = mkExpr creationAide expr
27392753
27402754 MemberDefnExplicitCtorNode(
27412755 mkXmlDoc px,
@@ -2746,7 +2760,6 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) =
27462760 Option.map mkIdent ido,
27472761 stn " =" mEq,
27482762 exprNode,
2749- thenExprNode,
27502763 memberDefinitionRange
27512764 )
27522765 |> MemberDefn.ExplicitCtor
0 commit comments