@@ -1573,6 +1573,18 @@ let (|PatParameter|_|) (p: SynPat) =
1573
1573
1574
1574
let mkUnit ( StartEndRange 1 ( lpr , m , rpr )) = UnitNode( stn " (" lpr, stn " )" rpr, m)
1575
1575
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
+
1576
1588
let mkPat ( creationAide : CreationAide ) ( p : SynPat ) =
1577
1589
let patternRange = p.Range
1578
1590
@@ -1650,8 +1662,8 @@ let mkPat (creationAide: CreationAide) (p: SynPat) =
1650
1662
| SynPat.Paren( p, StartEndRange 1 ( lpr, _, rpr)) ->
1651
1663
PatParenNode( stn " (" lpr, mkPat creationAide p, stn " )" rpr, patternRange)
1652
1664
|> 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, _, _ ) ->
1655
1667
PatStructTupleNode( List.map ( mkPat creationAide) ps, patternRange)
1656
1668
|> Pattern.StructTuple
1657
1669
| SynPat.ArrayOrList( isArray, ps, range) ->
@@ -1862,7 +1874,8 @@ let mkExternBinding
1862
1874
let identifier , openNode , parameters , closeNode =
1863
1875
match pat with
1864
1876
| 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)) ]) ->
1866
1879
mkSynLongIdent longDotId, stn " (" mOpen, List.map mkExternPat ps, stn " )" mClose
1867
1880
| _ -> failwith " expecting a SynPat.LongIdent for extern binding"
1868
1881
@@ -2255,6 +2268,28 @@ let mkSynUnionCase
2255
2268
fullRange
2256
2269
)
2257
2270
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
+
2258
2293
let mkImplicitCtor
2259
2294
creationAide
2260
2295
vis
@@ -2263,43 +2298,30 @@ let mkImplicitCtor
2263
2298
( self : ( range * Ident ) option )
2264
2299
( xmlDoc : PreXmlDoc )
2265
2300
=
2266
- let openNode , closeNode =
2301
+ let openNode , pats , commas , closeNode =
2267
2302
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
2270
2305
2271
2306
let pats =
2272
2307
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 ]
2303
2325
2304
2326
let range =
2305
2327
let startRange =
@@ -2540,18 +2562,25 @@ let mkPropertyGetSetBinding
2540
2562
2541
2563
let pats =
2542
2564
match ps with
2543
- | [ SynPat.Tuple( false , [ p1; p2; p3 ], _) ] ->
2565
+ | [ SynPat.Tuple( false , [ p1; p2; p3 ], [ comma ], _) ] ->
2544
2566
let mTuple = unionRanges p1.Range p2.Range
2545
2567
2546
2568
[ PatParenNode(
2547
2569
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
+ ),
2549
2578
stn " )" Range.Zero,
2550
2579
mTuple
2551
2580
)
2552
2581
|> Pattern.Paren
2553
2582
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 ]
2555
2584
| ps -> List.map ( mkPat creationAide) ps
2556
2585
2557
2586
let range = unionRanges extraIdent.idRange e.Range
0 commit comments