From 0d977319880badd701ad057fb0d914ce0ebb753b Mon Sep 17 00:00:00 2001 From: Josh DeGraw Date: Wed, 11 Jan 2023 13:57:23 -0700 Subject: [PATCH] Fix anonymous record type alias handling for stroustrup --- CHANGELOG.md | 1 + .../SynTypeDefnSimpleReprRecordTests.fs | 22 ++++++++++++ src/Fantomas.Core/CodePrinter.fs | 34 ++++++++++++------- src/Fantomas.Core/Context.fs | 20 +++++------ src/Fantomas.Core/Context.fsi | 5 ++- 5 files changed, 58 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a98e5dde7a..9226b89112 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ * Unit is lost inside dot get chain. [#2683](https://github.com/fsprojects/fantomas/issues/2683) * Piped multiline application is indented too far. [#2682](https://github.com/fsprojects/fantomas/issues/2682) * Comment not assigned to first parameter in constructor. [#2692](https://github.com/fsprojects/fantomas/issues/2692) +* Stroustrup: Type alias for anonymous record type. [#2179](https://github.com/fsprojects/fantomas/issues/2179) ## [5.2.0-beta-001] - 2023-01-02 diff --git a/src/Fantomas.Core.Tests/Stroustrup/SynTypeDefnSimpleReprRecordTests.fs b/src/Fantomas.Core.Tests/Stroustrup/SynTypeDefnSimpleReprRecordTests.fs index 351b1050a7..11e531eab4 100644 --- a/src/Fantomas.Core.Tests/Stroustrup/SynTypeDefnSimpleReprRecordTests.fs +++ b/src/Fantomas.Core.Tests/Stroustrup/SynTypeDefnSimpleReprRecordTests.fs @@ -31,6 +31,28 @@ type V = { } """ +[] +let ``anonymous record type alias`` () = + formatSourceString + false + """ +type V = + {| X: SomeFieldType + Y: OhSomethingElse + Z: ALongTypeName |} +""" + config + |> prepend newline + |> should + equal + """ +type V = {| + X: SomeFieldType + Y: OhSomethingElse + Z: ALongTypeName +|} +""" + [] [] let ``record type definition with comment after equals`` () = diff --git a/src/Fantomas.Core/CodePrinter.fs b/src/Fantomas.Core/CodePrinter.fs index 3fdcd376ca..224511c447 100644 --- a/src/Fantomas.Core/CodePrinter.fs +++ b/src/Fantomas.Core/CodePrinter.fs @@ -3351,19 +3351,27 @@ let genTypeDefn (td: TypeDefn) = | TypeDefn.Abbrev node -> let hasMembers = List.isNotEmpty members - header - +> sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth (genType node.Type) - +> onlyIf - hasMembers - (optSingle - (fun withNode -> - indentSepNlnUnindent ( - genSingleTextNode withNode - +> onlyIfCtx (fun ctx -> ctx.Config.NewlineBetweenTypeDefinitionAndMembers) sepNln - +> indentSepNlnUnindent (genMemberDefnList members) - )) - typeName.WithKeyword) - |> genNode node + fun (ctx: Context) -> + (match node.Type with + | Type.AnonRecord _ when not hasMembers && ctx.Config.ExperimentalStroustrupStyle -> + header + +> sepSpaceOrIndentAndNlnIfTypeExceedsPageWidthUnlessStroustrup genType node.Type + |> genNode node + | _ -> + header + +> sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth (genType node.Type) + +> onlyIf + hasMembers + (optSingle + (fun withNode -> + indentSepNlnUnindent ( + genSingleTextNode withNode + +> onlyIfCtx (fun ctx -> ctx.Config.NewlineBetweenTypeDefinitionAndMembers) sepNln + +> indentSepNlnUnindent (genMemberDefnList members) + )) + typeName.WithKeyword) + |> genNode node) + ctx | TypeDefn.Explicit node -> let bodyNode = node.Body diff --git a/src/Fantomas.Core/Context.fs b/src/Fantomas.Core/Context.fs index d3bcfac3a6..8ddb9a2231 100644 --- a/src/Fantomas.Core/Context.fs +++ b/src/Fantomas.Core/Context.fs @@ -746,21 +746,21 @@ let sepSpaceOrDoubleIndentAndNlnIfExpressionExceedsPageWidth expr (ctx: Context) expr ctx -let sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidthUnlessStroustrup - (f: Expr -> Context -> Context) - (expr: Expr) - (ctx: Context) - = - let node = Expr.Node expr - +let sepSpaceOrIndentAndNlnIfExceedsPageWidthUnlessStroustrup isStroustrup f (node: Node) (ctx: Context) = if ctx.Config.ExperimentalStroustrupStyle - && expr.IsStroustrupStyleExpr + && isStroustrup && Seq.isEmpty node.ContentBefore then - (sepSpace +> f expr) ctx + (sepSpace +> f) ctx else - sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth (f expr) ctx + sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth f ctx + +let sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidthUnlessStroustrup f (expr: Expr) = + sepSpaceOrIndentAndNlnIfExceedsPageWidthUnlessStroustrup expr.IsStroustrupStyleExpr (f expr) (Expr.Node expr) + +let sepSpaceOrIndentAndNlnIfTypeExceedsPageWidthUnlessStroustrup f (t: Type) = + sepSpaceOrIndentAndNlnIfExceedsPageWidthUnlessStroustrup t.IsStroustrupStyleType (f t) (Type.Node t) let autoNlnIfExpressionExceedsPageWidth expr (ctx: Context) = expressionExceedsPageWidth diff --git a/src/Fantomas.Core/Context.fsi b/src/Fantomas.Core/Context.fsi index 9a3b39d8af..cf11bd354d 100644 --- a/src/Fantomas.Core/Context.fsi +++ b/src/Fantomas.Core/Context.fsi @@ -230,7 +230,10 @@ val sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth: expr: (Context -> Contex val sepSpaceOrDoubleIndentAndNlnIfExpressionExceedsPageWidth: expr: (Context -> Context) -> ctx: Context -> Context val sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidthUnlessStroustrup: - f: (Expr -> Context -> Context) -> expr: Expr -> ctx: Context -> Context + f: (Expr -> Context -> Context) -> expr: Expr -> (Context -> Context) + +val sepSpaceOrIndentAndNlnIfTypeExceedsPageWidthUnlessStroustrup: + f: (Type -> Context -> Context) -> t: Type -> (Context -> Context) val autoParenthesisIfExpressionExceedsPageWidth: expr: (Context -> Context) -> ctx: Context -> Context val futureNlnCheck: f: (Context -> Context) -> ctx: Context -> bool