@@ -1573,6 +1573,18 @@ let (|PatParameter|_|) (p: SynPat) =
15731573
15741574let mkUnit ( StartEndRange 1 ( lpr , m , rpr )) = UnitNode( stn " (" lpr, stn " )" rpr, m)
15751575
1576+ let mkTuplePat ( creationAide : CreationAide ) ( pats : SynPat list ) ( commas : range list ) ( m : range ) =
1577+ match pats with
1578+ | [] -> failwith " SynPat.Tuple with no elements"
1579+ | head :: tail ->
1580+ let rest =
1581+ assert ( tail.Length = commas.Length)
1582+
1583+ List.zip commas tail
1584+ |> List.collect ( fun ( c , e ) -> [ yield Choice2Of2( stn " ," c); yield Choice1Of2( mkPat creationAide e) ])
1585+
1586+ PatTupleNode([ yield Choice1Of2( mkPat creationAide head); yield ! rest ], m)
1587+
15761588let mkPat ( creationAide : CreationAide ) ( p : SynPat ) =
15771589 let patternRange = p.Range
15781590
@@ -1650,8 +1662,8 @@ let mkPat (creationAide: CreationAide) (p: SynPat) =
16501662 | SynPat.Paren( p, StartEndRange 1 ( lpr, _, rpr)) ->
16511663 PatParenNode( stn " (" lpr, mkPat creationAide p, stn " )" rpr, patternRange)
16521664 |> Pattern.Paren
1653- | SynPat.Tuple( false , ps, _) -> PatTupleNode ( List.map ( mkPat creationAide) ps, patternRange) |> Pattern.Tuple
1654- | SynPat.Tuple( true , ps, _) ->
1665+ | SynPat.Tuple( false , ps, commas , _) -> mkTuplePat creationAide ps commas patternRange |> Pattern.Tuple
1666+ | SynPat.Tuple( true , ps, _, _ ) ->
16551667 PatStructTupleNode( List.map ( mkPat creationAide) ps, patternRange)
16561668 |> Pattern.StructTuple
16571669 | SynPat.ArrayOrList( isArray, ps, range) ->
@@ -1862,7 +1874,8 @@ let mkExternBinding
18621874 let identifier , openNode , parameters , closeNode =
18631875 match pat with
18641876 | SynPat.LongIdent(
1865- longDotId = longDotId; argPats = SynArgPats.Pats [ SynPat.Tuple(_, ps, StartEndRange 1 ( mOpen, _, mClose)) ]) ->
1877+ longDotId = longDotId
1878+ argPats = SynArgPats.Pats [ SynPat.Tuple(_, ps, _, StartEndRange 1 ( mOpen, _, mClose)) ]) ->
18661879 mkSynLongIdent longDotId, stn " (" mOpen, List.map mkExternPat ps, stn " )" mClose
18671880 | _ -> failwith " expecting a SynPat.LongIdent for extern binding"
18681881
@@ -2255,6 +2268,28 @@ let mkSynUnionCase
22552268 fullRange
22562269 )
22572270
2271+ let mkSynSimplePat creationAide ( pat : SynSimplePat ) =
2272+ match pat with
2273+ | SynSimplePat.Attrib( SynSimplePat.Typed( SynSimplePat.Id( ident = ident; isOptional = isOptional), t, _),
2274+ attributes,
2275+ m) ->
2276+ Some(
2277+ SimplePatNode(
2278+ mkAttributes creationAide attributes,
2279+ isOptional,
2280+ mkIdent ident,
2281+ Some( mkType creationAide t),
2282+ m
2283+ )
2284+ )
2285+ | SynSimplePat.Typed( SynSimplePat.Id( ident = ident; isOptional = isOptional), t, m) ->
2286+ Some( SimplePatNode( mkAttributes creationAide [], isOptional, mkIdent ident, Some( mkType creationAide t), m))
2287+ | SynSimplePat.Attrib( SynSimplePat.Id( ident = ident; isOptional = isOptional), attributes, m) ->
2288+ Some( SimplePatNode( mkAttributes creationAide attributes, isOptional, mkIdent ident, None, m))
2289+ | SynSimplePat.Id( ident = ident; isOptional = isOptional; range = m) ->
2290+ Some( SimplePatNode( mkAttributes creationAide [], isOptional, mkIdent ident, None, m))
2291+ | _ -> None
2292+
22582293let mkImplicitCtor
22592294 creationAide
22602295 vis
@@ -2263,43 +2298,30 @@ let mkImplicitCtor
22632298 ( self : ( range * Ident ) option )
22642299 ( xmlDoc : PreXmlDoc )
22652300 =
2266- let openNode , closeNode =
2301+ let openNode , pats , commas , closeNode =
22672302 match pats with
2268- | SynSimplePats.SimplePats( range = StartEndRange 1 ( mOpen, _, mClose))
2269- | SynSimplePats.Typed ( range = StartEndRange 1 ( mOpen , _, mClose )) -> stn " (" mOpen, stn " )" mClose
2303+ | SynSimplePats.SimplePats( pats = pats ; commaRanges = commas ; range = StartEndRange 1 ( mOpen, _, mClose)) ->
2304+ stn " (" mOpen, pats , commas , stn " )" mClose
22702305
22712306 let pats =
22722307 match pats with
2273- | SynSimplePats.SimplePats( pats = pats) -> pats
2274- | SynSimplePats.Typed _ -> []
2275- |> List.choose ( function
2276- | SynSimplePat.Attrib( SynSimplePat.Typed( SynSimplePat.Id( ident = ident; isOptional = isOptional), t, _),
2277- attributes,
2278- m) ->
2279- Some(
2280- SimplePatNode(
2281- mkAttributes creationAide attributes,
2282- isOptional,
2283- mkIdent ident,
2284- Some( mkType creationAide t),
2285- m
2286- )
2287- )
2288- | SynSimplePat.Typed( SynSimplePat.Id( ident = ident; isOptional = isOptional), t, m) ->
2289- Some(
2290- SimplePatNode(
2291- mkAttributes creationAide [],
2292- isOptional,
2293- mkIdent ident,
2294- Some( mkType creationAide t),
2295- m
2296- )
2297- )
2298- | SynSimplePat.Attrib( SynSimplePat.Id( ident = ident; isOptional = isOptional), attributes, m) ->
2299- Some( SimplePatNode( mkAttributes creationAide attributes, isOptional, mkIdent ident, None, m))
2300- | SynSimplePat.Id( ident = ident; isOptional = isOptional; range = m) ->
2301- Some( SimplePatNode( mkAttributes creationAide [], isOptional, mkIdent ident, None, m))
2302- | _ -> None)
2308+ | [] ->
2309+ // Unit pattern
2310+ []
2311+ | head :: tail ->
2312+ let rest =
2313+ assert ( tail.Length = commas.Length)
2314+
2315+ List.zip commas tail
2316+ |> List.collect ( fun ( c , p ) ->
2317+ match mkSynSimplePat creationAide p with
2318+ | None -> []
2319+ | Some simplePat -> [ Choice2Of2( stn " ," c); Choice1Of2 simplePat ])
2320+
2321+ [ match mkSynSimplePat creationAide head with
2322+ | None -> ()
2323+ | Some simplePat -> yield Choice1Of2 simplePat
2324+ yield ! rest ]
23032325
23042326 let range =
23052327 let startRange =
@@ -2540,18 +2562,25 @@ let mkPropertyGetSetBinding
25402562
25412563 let pats =
25422564 match ps with
2543- | [ SynPat.Tuple( false , [ p1; p2; p3 ], _) ] ->
2565+ | [ SynPat.Tuple( false , [ p1; p2; p3 ], [ comma ], _) ] ->
25442566 let mTuple = unionRanges p1.Range p2.Range
25452567
25462568 [ PatParenNode(
25472569 stn " (" Range.Zero,
2548- Pattern.Tuple( PatTupleNode([ mkPat creationAide p1; mkPat creationAide p2 ], mTuple)),
2570+ Pattern.Tuple(
2571+ PatTupleNode(
2572+ [ Choice1Of2( mkPat creationAide p1)
2573+ Choice2Of2( stn " ," comma)
2574+ Choice1Of2( mkPat creationAide p2) ],
2575+ mTuple
2576+ )
2577+ ),
25492578 stn " )" Range.Zero,
25502579 mTuple
25512580 )
25522581 |> Pattern.Paren
25532582 mkPat creationAide p3 ]
2554- | [ SynPat.Tuple( false , [ p1; p2 ], _) ] -> [ mkPat creationAide p1; mkPat creationAide p2 ]
2583+ | [ SynPat.Tuple( false , [ p1; p2 ], _, _ ) ] -> [ mkPat creationAide p1; mkPat creationAide p2 ]
25552584 | ps -> List.map ( mkPat creationAide) ps
25562585
25572586 let range = unionRanges extraIdent.idRange e.Range
0 commit comments