Skip to content

Commit

Permalink
Print trivia for less and greater tokens of TypeApp. Fixes fsprojects…
Browse files Browse the repository at this point in the history
  • Loading branch information
nojaf committed Aug 11, 2021
1 parent 3288200 commit 42712ce
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 38 deletions.
15 changes: 15 additions & 0 deletions src/Fantomas.Tests/AppTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -748,3 +748,18 @@ module Foo =
| _ -> () // hi!
))
"""

[<Test>]
let ``comment after typeApp greater sign, 1861`` () =
formatSourceString
false
"""
x |> f<y> // some comment
"""
config
|> prepend newline
|> should
equal
"""
x |> f<y> // some comment
"""
2 changes: 1 addition & 1 deletion src/Fantomas.Tests/TypeDeclarationTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2352,7 +2352,7 @@ nameof (+) // gives '+'
nameof op_Addition // gives 'op_Addition'
type C<'TType> =
member _.TypeName = nameof<'TType>
member _.TypeName = nameof<'TType> // Nameof with a generic type parameter via 'nameof<>'
/// Simplified version of EventStore's API
[<Struct; IsByRefLike>]
Expand Down
69 changes: 39 additions & 30 deletions src/Fantomas/CodePrinter.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1751,11 +1751,11 @@ and genExpr astContext synExpr ctx =
)

// Result<int, string>.Ok 42
| App (DotGet (TypeApp (e, ts), lids), es) ->
| App (DotGet (TypeApp (e, lt, ts, gt), lids), es) ->
let s = List.map fst lids |> String.concat "."

genExpr astContext e
+> genGenericTypeParameters astContext ts
+> genGenericTypeParameters astContext lt ts gt
+> !-(sprintf ".%s" s)
+> sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth (col sepSpace es (genExpr astContext))

Expand All @@ -1772,8 +1772,8 @@ and genExpr astContext synExpr ctx =
let functionName =
match e with
| LongIdentPiecesExpr lids when (List.moreThanOne lids) -> genFunctionNameWithMultilineLids id lids
| TypeApp (LongIdentPiecesExpr lids, ts) when (List.moreThanOne lids) ->
genFunctionNameWithMultilineLids (genGenericTypeParameters astContext ts) lids
| TypeApp (LongIdentPiecesExpr lids, lt, ts, gt) when (List.moreThanOne lids) ->
genFunctionNameWithMultilineLids (genGenericTypeParameters astContext lt ts gt) lids
| _ -> genExpr astContext e

functionName
Expand All @@ -1798,8 +1798,11 @@ and genExpr astContext synExpr ctx =
match e with
| LongIdentPiecesExpr lids when (List.moreThanOne lids) ->
genFunctionNameWithMultilineLids argFn lids
| TypeApp (LongIdentPiecesExpr lids, ts) when (List.moreThanOne lids) ->
genFunctionNameWithMultilineLids (genGenericTypeParameters astContext ts +> argFn) lids
| TypeApp (LongIdentPiecesExpr lids, lt, ts, gt) when (List.moreThanOne lids) ->
genFunctionNameWithMultilineLids
(genGenericTypeParameters astContext lt ts gt
+> argFn)
lids
| DotGetAppDotGetAppParenLambda _ ->
leadingExpressionIsMultiline
(genExpr astContext e)
Expand Down Expand Up @@ -1835,22 +1838,25 @@ and genExpr astContext synExpr ctx =
let genLongFunctionName f =
match e with
| LongIdentPiecesExpr lids when (List.moreThanOne lids) -> genFunctionNameWithMultilineLids f lids
| TypeApp (LongIdentPiecesExpr lids, ts) when (List.moreThanOne lids) ->
genFunctionNameWithMultilineLids (genGenericTypeParameters astContext ts +> f) lids
| TypeApp (LongIdentPiecesExpr lids, lt, ts, gt) when (List.moreThanOne lids) ->
genFunctionNameWithMultilineLids (genGenericTypeParameters astContext lt ts gt +> f) lids
| _ -> genExpr astContext e +> f

let lastEsIndex = es.Length - 1

let genApp (idx: int) ((lids, e, ts): (string * range) list * SynExpr * SynType list) : Context -> Context =
let genApp
(idx: int)
((lids, e, t): (string * range) list * SynExpr * (range * SynType list * range) option)
: Context -> Context =
let short =
genLidsWithDots lids
+> genGenericTypeParameters astContext ts
+> optSingle (fun (lt, ts, gt) -> genGenericTypeParameters astContext lt ts gt) t
+> genSpaceBeforeLids idx lastEsIndex lids e
+> genExpr astContext e

let long =
genLidsWithDotsAndNewlines lids
+> genGenericTypeParameters astContext ts
+> optSingle (fun (lt, ts, gt) -> genGenericTypeParameters astContext lt ts gt) t
+> genSpaceBeforeLids idx lastEsIndex lids e
+> genMultilineFunctionApplicationArguments astContext e

Expand All @@ -1862,9 +1868,9 @@ and genExpr astContext synExpr ctx =
+> coli
sepNone
es
(fun idx (lids, e, ts) ->
(fun idx (lids, e, t) ->
genLidsWithDots lids
+> genGenericTypeParameters astContext ts
+> optSingle (fun (lt, ts, gt) -> genGenericTypeParameters astContext lt ts gt) t
+> genSpaceBeforeLids idx lastEsIndex lids e
+> genExpr astContext e)

Expand All @@ -1881,48 +1887,51 @@ and genExpr astContext synExpr ctx =
| DotGetApp (e, es) ->
let genLongFunctionName =
match e with
| AppOrTypeApp (LongIdentPiecesExpr lids, ts, [ Paren _ as px ]) when (List.moreThanOne lids) ->
| AppOrTypeApp (LongIdentPiecesExpr lids, t, [ Paren _ as px ]) when (List.moreThanOne lids) ->
genFunctionNameWithMultilineLids
(optSingle (genGenericTypeParameters astContext) ts
(optSingle (fun (lt, ts, gt) -> genGenericTypeParameters astContext lt ts gt) t
+> expressionFitsOnRestOfLine
(genExpr astContext px)
(genMultilineFunctionApplicationArguments astContext px))
lids
| AppOrTypeApp (LongIdentPiecesExpr lids, ts, [ e2 ]) when (List.moreThanOne lids) ->
| AppOrTypeApp (LongIdentPiecesExpr lids, t, [ e2 ]) when (List.moreThanOne lids) ->
genFunctionNameWithMultilineLids
(optSingle (genGenericTypeParameters astContext) ts
(optSingle (fun (lt, ts, gt) -> genGenericTypeParameters astContext lt ts gt) t
+> genExpr astContext e2)
lids
| AppOrTypeApp (SimpleExpr e, ts, [ ConstExpr (SynConst.Unit, r) ]) ->
| AppOrTypeApp (SimpleExpr e, t, [ ConstExpr (SynConst.Unit, r) ]) ->
genExpr astContext e
+> optSingle (genGenericTypeParameters astContext) ts
+> optSingle (fun (lt, ts, gt) -> genGenericTypeParameters astContext lt ts gt) t
+> genConst SynConst.Unit r
| AppOrTypeApp (SimpleExpr e, ts, [ Paren _ as px ]) ->
| AppOrTypeApp (SimpleExpr e, t, [ Paren _ as px ]) ->
let short =
genExpr astContext e
+> optSingle (genGenericTypeParameters astContext) ts
+> optSingle (fun (lt, ts, gt) -> genGenericTypeParameters astContext lt ts gt) t
+> genExpr astContext px

let long =
genExpr astContext e
+> optSingle (genGenericTypeParameters astContext) ts
+> optSingle (fun (lt, ts, gt) -> genGenericTypeParameters astContext lt ts gt) t
+> genMultilineFunctionApplicationArguments astContext px

expressionFitsOnRestOfLine short long
| _ -> genExpr astContext e

let lastEsIndex = es.Length - 1

let genApp (idx: int) ((lids, e, ts): (string * range) list * SynExpr * SynType list) : Context -> Context =
let genApp
(idx: int)
((lids, e, t): (string * range) list * SynExpr * (range * SynType list * range) option)
: Context -> Context =
let short =
genLidsWithDots lids
+> genGenericTypeParameters astContext ts
+> optSingle (fun (lt, ts, gt) -> genGenericTypeParameters astContext lt ts gt) t
+> genSpaceBeforeLids idx lastEsIndex lids e
+> genExpr astContext e

let long =
genLidsWithDotsAndNewlines lids
+> genGenericTypeParameters astContext ts
+> optSingle (fun (lt, ts, gt) -> genGenericTypeParameters astContext lt ts gt) t
+> genSpaceBeforeLids idx lastEsIndex lids e
+> genMultilineFunctionApplicationArguments astContext e

Expand Down Expand Up @@ -1974,9 +1983,9 @@ and genExpr astContext synExpr ctx =

// Always spacing in multiple arguments
| App (e, es) -> genApp astContext e es
| TypeApp (e, ts) ->
| TypeApp (e, lt, ts, gt) ->
genExpr astContext e
+> genGenericTypeParameters astContext ts
+> genGenericTypeParameters astContext lt ts gt
| LetOrUses (bs, e) ->
fun ctx ->
let items =
Expand Down Expand Up @@ -2679,11 +2688,11 @@ and genMultilineFunctionApplicationArguments astContext argExpr =
|> argsInsideParenthesis lpr rpr pr
| _ -> genExpr astContext argExpr

and genGenericTypeParameters astContext ts =
and genGenericTypeParameters astContext lt ts gt =
match ts with
| [] -> sepNone
| ts ->
!- "<"
tokN lt LESS (!- "<")
+> coli
sepComma
ts
Expand All @@ -2693,7 +2702,7 @@ and genGenericTypeParameters astContext ts =
IsFirstTypeParam = idx = 0 }
false)
+> indentIfNeeded sepNone
-- ">"
+> tokN gt GREATER (!- ">")

and genMultilineRecordInstance
(inheritOpt: (SynType * SynExpr) option)
Expand Down
25 changes: 18 additions & 7 deletions src/Fantomas/SourceParser.fs
Original file line number Diff line number Diff line change
Expand Up @@ -634,7 +634,14 @@ let (|ConstUnitExpr|_|) =

let (|TypeApp|_|) =
function
| SynExpr.TypeApp (e, _, ts, _, _, _, _) -> Some(e, ts)
| SynExpr.TypeApp (e, _, ts, _, _, _, range) ->
let lessThanRange =
Range.mkRange range.FileName e.Range.End ts.Head.Range.Start

let greaterThanRange =
Range.mkRange range.FileName (Pos.mkPos range.EndLine (range.EndColumn - 1)) range.End

Some(e, lessThanRange, ts, greaterThanRange)
| _ -> None

let (|Match|_|) =
Expand Down Expand Up @@ -774,7 +781,7 @@ let (|AppSingleParenArg|_|) =

let (|AppOrTypeApp|_|) e =
match e with
| App (TypeApp (e, ts), es) -> Some(e, Some ts, es)
| App (TypeApp (e, lt, ts, gt), es) -> Some(e, Some(lt, ts, gt), es)
| App (e, es) -> Some(e, None, es)
| _ -> None

Expand Down Expand Up @@ -1008,11 +1015,15 @@ let (|DotGetAppDotGetAppParenLambda|_|) (e: SynExpr) =
/// Gather series of application for line breaking
let rec (|DotGetApp|_|) =
function
| SynExpr.App (_, _, DotGet (DotGetApp (e, es), s), e', _) -> Some(e, [ yield! es; yield (s, e', []) ])
| SynExpr.App (_, _, DotGet (e, s), e', _) -> Some(e, [ (s, e', []) ])
| SynExpr.App (_, _, SynExpr.TypeApp (DotGet (DotGetApp (e, es), s), _, ts, _, _, _, _), e', _) ->
Some(e, [ yield! es; yield (s, e', ts) ])
| SynExpr.App (_, _, SynExpr.TypeApp (DotGet (e, s), _, ts, _, _, _, _), e', _) -> Some(e, [ (s, e', ts) ])
| SynExpr.App (_, _, DotGet (DotGetApp (e, es), s), e', _) -> Some(e, [ yield! es; yield (s, e', None) ])
| SynExpr.App (_, _, DotGet (e, s), e', _) -> Some(e, [ (s, e', None) ])
| SynExpr.App (_, _, TypeApp (DotGet (DotGetApp (e, es), s), lt, ts, gt), e', _) ->
Some(
e,
[ yield! es
yield (s, e', Some(lt, ts, gt)) ]
)
| SynExpr.App (_, _, TypeApp (DotGet (e, s), lt, ts, gt), e', _) -> Some(e, [ (s, e', Some(lt, ts, gt)) ])
| _ -> None

let (|DotSet|_|) =
Expand Down

0 comments on commit 42712ce

Please sign in to comment.