Skip to content

Commit 25b6f95

Browse files
nojafdawedawe
andauthored
Take commas into account (#2880)
* Update FCS to e267bb9f8d590feed1b94b469d78cfce61afecad. * Use commas as nodes in PatTupleNode. * Respect commas in SynSimplePats.SimplePats. * Pick correct comma in pattern in mkPropertyGetSetBinding. * Update src/Fantomas.Core.Tests/TypeDeclarationTests.fs Co-authored-by: dawe <dawedawe@posteo.de> * 6.0.3 release --------- Co-authored-by: dawe <dawedawe@posteo.de>
1 parent 680ec8b commit 25b6f95

File tree

9 files changed

+218
-67
lines changed

9 files changed

+218
-67
lines changed

CHANGELOG.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
# Changelog
22

3-
## [Unreleased]
3+
## [6.0.3] - 2023-05-14
44

55
### Fixed
66
* Preserves quotes around type parameter names. [#2875](https://github.com/fsprojects/fantomas/issues/2875)
7+
* Additional whitespace for LineCommentAfterSourceCode when last character is a `,`. [#2589](https://github.com/fsprojects/fantomas/issues/2589)
8+
* Tupled parameter wrapped in conditional directive. [#2877](https://github.com/fsprojects/fantomas/issues/2877)
9+
10+
### Changed
11+
* Update FCS to 'Add commas to tuple pat and simple pats', commit e267bb9f8d590feed1b94b469d78cfce61afecad
712

813
## [6.0.2] - 2023-05-05
914

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ Some common use cases include:
3939

4040
<!-- Versions -->
4141
<PropertyGroup>
42-
<FCSCommitHash>ba6647ebf5b94823c4d6fafd1e7d5f806d915ee0</FCSCommitHash>
42+
<FCSCommitHash>e267bb9f8d590feed1b94b469d78cfce61afecad</FCSCommitHash>
4343
<StreamJsonRpcVersion>2.8.28</StreamJsonRpcVersion>
4444
<FSharpCoreVersion>6.0.1</FSharpCoreVersion>
4545
</PropertyGroup>

src/Fantomas.Core.Tests/CommentTests.fs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2080,8 +2080,8 @@ type CreateFSharpManifestResourceName public () =
20802080
(
20812081
fileName: string,
20822082
linkFileName: string,
2083-
rootNamespace: string, // may be null
2084-
dependentUponFileName: string, // may be null
2083+
rootNamespace: string, // may be null
2084+
dependentUponFileName: string, // may be null
20852085
binaryStream: Stream // may be null
20862086
) : string =
20872087
()
@@ -2570,7 +2570,7 @@ type MyType2 =
25702570
type MyType =
25712571
member _.MyMethod
25722572
(
2573-
[<MyAttribute>] inputA: string, // my comment 1
2573+
[<MyAttribute>] inputA: string, // my comment 1
25742574
[<MyAttribute>] inputB: string // my comment 2
25752575
) =
25762576
inputA

src/Fantomas.Core.Tests/CompilerDirectivesTests.fs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3286,3 +3286,39 @@ module
32863286
A =
32873287
let f x = x + x
32883288
"""
3289+
3290+
[<Test>]
3291+
let ``conditional directives around last tuple pattern, 2877`` () =
3292+
formatSourceString
3293+
false
3294+
"""
3295+
// Link all the assemblies together and produce the input typecheck accumulator
3296+
let CombineImportedAssembliesTask
3297+
(
3298+
a,
3299+
b
3300+
#if !NO_TYPEPROVIDERS
3301+
, c
3302+
#endif
3303+
) =
3304+
3305+
()
3306+
"""
3307+
config
3308+
|> prepend newline
3309+
|> should
3310+
equal
3311+
"""
3312+
// Link all the assemblies together and produce the input typecheck accumulator
3313+
let CombineImportedAssembliesTask
3314+
(
3315+
a,
3316+
b
3317+
#if !NO_TYPEPROVIDERS
3318+
,
3319+
c
3320+
#endif
3321+
) =
3322+
3323+
()
3324+
"""

src/Fantomas.Core.Tests/LetBindingTests.fs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2140,3 +2140,28 @@ let inline (!!) (x: ^a) : ^b = ((^a or ^b): (static member op_Implicit: ^a -> ^b
21402140
let inline (!!) (x: ^a) : ^b =
21412141
((^a or ^b): (static member op_Implicit: ^a -> ^b) x)
21422142
"""
2143+
2144+
[<Test>]
2145+
let ``avoid additional whitespace after comma, 2589`` () =
2146+
formatSourceString
2147+
false
2148+
"""
2149+
let x
2150+
(
2151+
a: string, // test
2152+
b: string // test
2153+
) =
2154+
print "hello"
2155+
"""
2156+
config
2157+
|> prepend newline
2158+
|> should
2159+
equal
2160+
"""
2161+
let x
2162+
(
2163+
a: string, // test
2164+
b: string // test
2165+
) =
2166+
print "hello"
2167+
"""

src/Fantomas.Core.Tests/TypeDeclarationTests.fs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3587,3 +3587,36 @@ type ArrayBuffer =
35873587
abstract byteLength: int
35883588
abstract slice: ``begin``: int * ?``end``: int -> ArrayBuffer
35893589
"""
3590+
3591+
[<Test>]
3592+
let ``trivia before comma in primary constructor`` () =
3593+
formatSourceString
3594+
false
3595+
"""
3596+
type Meh
3597+
(
3598+
a,
3599+
b
3600+
#if !NO_TYPEPROVIDERS
3601+
, c
3602+
#endif
3603+
) =
3604+
class end
3605+
"""
3606+
config
3607+
|> prepend newline
3608+
|> should
3609+
equal
3610+
"""
3611+
type Meh
3612+
(
3613+
a,
3614+
b
3615+
#if !NO_TYPEPROVIDERS
3616+
,
3617+
c
3618+
#endif
3619+
) =
3620+
class
3621+
end
3622+
"""

src/Fantomas.Core/ASTTransformer.fs

Lines changed: 68 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,6 +1573,18 @@ let (|PatParameter|_|) (p: SynPat) =
15731573

15741574
let 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+
15761588
let 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+
22582293
let 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

Comments
 (0)