Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v6.0 #2800

Merged
merged 34 commits into from
Mar 27, 2023
Merged

v6.0 #2800

Changes from 1 commit
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
ea60b22
Extend logging and verbosity options (#2693)
dawedawe Jan 15, 2023
e1c0926
Sunset MultilineBlockBracketsOnSameColumn & ExperimentalStroustrupSty…
dawedawe Jan 20, 2023
240b135
Move FormatConfig into Fantomas.Core namespace. (#2736)
nojaf Jan 20, 2023
43d47fc
Let the icons (green, orange, ...) in the explanation be rendered. (#…
dawedawe Jan 23, 2023
bfaf6af
Initial cursor (#2739)
nojaf Jan 24, 2023
05263a0
Update output for copy-and-update expression for Stroustrup (#2748)
josh-degraw Jan 31, 2023
3bc97eb
Refactor IsStroustrupStyleExpr and isStroustrupStyleType into Context…
josh-degraw Feb 1, 2023
9b2e32c
Drop `Experimental` prefix from `ExperimentalStroustrup`. (#2755)
josh-degraw Feb 1, 2023
43c5e0b
Expose SyntaxOak API (#2758)
edgarfgp Feb 1, 2023
ac3b8ac
Extract setting for preference of newline placement for computation e…
josh-degraw Feb 2, 2023
c83a7d1
Remove F# option from public API. (#2759)
nojaf Feb 3, 2023
7bcd5a5
Adds naive parallel formatting implementation.
TheAngryByrd Feb 4, 2023
e528cc6
Add separate CodeFormatter.FormatDocumentAsync overloads with cursor …
DedSec256 Feb 4, 2023
9681ea5
Add release notes for 6.0.0-alpha-003.
nojaf Feb 4, 2023
ea8af47
Consolidate and share logic for Records and AnonymousRecords (#2750)
josh-degraw Feb 8, 2023
77ca940
Add Spectr.Console (#2765)
nojaf Feb 10, 2023
691100c
Consolidate records part two (#2766)
nojaf Feb 11, 2023
73fa7d7
Upgrade guide (#2767)
nojaf Feb 12, 2023
770e361
Update GeneratingCode.fsx to use the Oak model. (#2769)
nojaf Feb 14, 2023
78b4c8b
Always process folder recursive. (#2775)
nojaf Feb 18, 2023
82ffbaf
Move profile logic to Format.fs and use Spectre (#2770)
dawedawe Feb 20, 2023
91253aa
Don't hook up SerilogTraceListener in FantomasDaemon. (#2777)
nojaf Feb 22, 2023
0a84d82
Add release notes for 6.0.0-alpha-004.
nojaf Feb 22, 2023
5ea3fdb
Fix record type generation for stroustrup types with members (#2773)
josh-degraw Feb 23, 2023
0c73517
Fix handling of AppExpr with a single stroustrup record (#2747)
josh-degraw Feb 23, 2023
d96f018
Manually deserialize FormatDocumentResponse. (#2780)
nojaf Feb 24, 2023
392f8db
Add release notes for 6.0.0-alpha-005.
nojaf Feb 24, 2023
118a666
Extract Stroustrup for final list argument into a separate setting. (…
nojaf Mar 6, 2023
5a020e3
Fix Stroustrup record member declaration indent issue (#2788)
josh-degraw Mar 7, 2023
76be1b9
EndsWithSingleListApp & EndsWithDualListApp are enable by IsStroustru…
nojaf Mar 17, 2023
e8106b1
Add release notes for 6.0.0-alpha-006.
nojaf Mar 17, 2023
1aba34c
Remove strict mode (#2798)
nojaf Mar 18, 2023
17deecc
Cursor with defines (#2774)
nojaf Mar 19, 2023
21b11d3
Return string from FormatASTAsync api. (#2799)
nojaf Mar 27, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Consolidate records part two (#2766)
* Remove genCrampedFields inside genMultilineRecord.

* Remove ExprAnonRecordNode for now.

* Expr.AnonStructRecord!
nojaf committed Mar 17, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit 691100cc458b7b261f789ee90657f005ae301314
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module Fantomas.Core.Tests.MultilineBlockBracketsOnSameColumnArrayOrListTests
module Fantomas.Core.Tests.AlignedMultilineBracketStyleArrayOrListTests

open NUnit.Framework
open FsUnit
25 changes: 25 additions & 0 deletions src/Fantomas.Core.Tests/AlignedMultilineBracketStyleTests.fs
Original file line number Diff line number Diff line change
@@ -1545,3 +1545,28 @@ let v = {
Lackeys = [ "Zippy" ; "George" ; "Bungle" ]
}
"""

[<Test>]
let ``anonymous struct record with trivia`` () =
formatSourceString
false
"""
struct // 1
{| // 2
// 3
X = 4
// 5
|} // 6
"""
config
|> prepend newline
|> should
equal
"""
struct // 1
{| // 2
// 3
X = 4
// 5
|} // 6
"""
8 changes: 4 additions & 4 deletions src/Fantomas.Core.Tests/CrampedMultilineBracketStyleTests.fs
Original file line number Diff line number Diff line change
@@ -1721,8 +1721,8 @@ let ``record with comments above field, indent 2`` () =
equal
"""
{ Foo =
// bar
someValue }
// bar
someValue }
"""

[<Test>]
@@ -1778,8 +1778,8 @@ let ``anonymous record with multiline field, indent 2`` () =
equal
"""
{| Foo =
// meh
someValue |}
// meh
someValue |}
"""

[<Test>]
3 changes: 2 additions & 1 deletion src/Fantomas.Core.Tests/Fantomas.Core.Tests.fsproj
Original file line number Diff line number Diff line change
@@ -59,7 +59,7 @@
<Compile Include="SpaceBeforeClassConstructorTests.fs" />
<Compile Include="SpaceBeforeMemberTests.fs" />
<Compile Include="AlignedMultilineBracketStyleTests.fs" />
<Compile Include="MultilineBlockBracketsOnSameColumnArrayOrListTests.fs" />
<Compile Include="AlignedMultilineBracketStyleArrayOrListTests.fs" />
<Compile Include="NewlineBetweenTypeDefinitionAndMembersTests.fs" />
<Compile Include="MaxValueBindingWidthTests.fs" />
<Compile Include="MaxFunctionBindingWidthTests.fs" />
@@ -108,6 +108,7 @@
<Compile Include="Stroustrup\ElmishTests.fs" />
<Compile Include="Stroustrup\FunctionApplicationSingleListTests.fs" />
<Compile Include="Stroustrup\FunctionApplicationDualListTests.fs" />
<Compile Include="Stroustrup\SynExprAnonRecdStructTests.fs" />
<Compile Include="IdentTests.fs" />
<Compile Include="RecordDeclarationsWithXMLDocTests.fs" />
<Compile Include="MaxIfThenShortWidthTests.fs" />
4 changes: 2 additions & 2 deletions src/Fantomas.Core.Tests/NumberOfItemsRecordTests.fs
Original file line number Diff line number Diff line change
@@ -697,8 +697,8 @@ let ``indent update anonymous record fields far enough`` () =
"""
let expected =
{| ThisIsAThing.Empty with
TheNewValue = 1
ThatValue = 2 |}
TheNewValue = 1
ThatValue = 2 |}
"""

[<Test>]
35 changes: 35 additions & 0 deletions src/Fantomas.Core.Tests/Stroustrup/SynExprAnonRecdStructTests.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
module Fantomas.Core.Tests.Stroustrup.SynExprAnonRecdStructTests

open NUnit.Framework
open FsUnit
open Fantomas.Core.Tests.TestHelper
open Fantomas.Core

let config =
{ config with
MultilineBracketStyle = Stroustrup }

[<Test>]
let ``anonymous struct record with trivia`` () =
formatSourceString
false
"""
struct // 1
{| // 2
// 3
X = 4
// 5
|} // 6
"""
config
|> prepend newline
|> should
equal
"""
struct // 1
{| // 2
// 3
X = 4
// 5
|} // 6
"""
25 changes: 25 additions & 0 deletions src/Fantomas.Core.Tests/StructTests.fs
Original file line number Diff line number Diff line change
@@ -164,3 +164,28 @@ type NameStruct() =
struct
end
"""

[<Test>]
let ``anonymous struct record with trivia`` () =
formatSourceString
false
"""
struct // 1
{| // 2
// 3
X = 4
// 5
|} // 6
"""
config
|> prepend newline
|> should
equal
"""
struct // 1
{| // 2
// 3
X = 4
// 5
|} // 6
"""
33 changes: 29 additions & 4 deletions src/Fantomas.Core/ASTTransformer.fs
Original file line number Diff line number Diff line change
@@ -975,7 +975,11 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr =
| None, None ->
ExprRecordNode(stn "{" mOpen, None, fieldNodes, stn "}" mClose, exprRange)
|> Expr.Record
| SynExpr.AnonRecd(isStruct, copyInfo, recordFields, StartEndRange 2 (mOpen, _, mClose)) ->
| SynExpr.AnonRecd(true,
copyInfo,
recordFields,
(StartRange 6 (mStruct, _) & EndRange 2 (mClose, _)),
{ OpeningBraceRange = mOpen }) ->
let fields =
recordFields
|> List.choose (function
@@ -988,15 +992,36 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr =
Some(RecordFieldNode(longIdent, stn "=" mEq, mkExpr creationAide e, m))
| _ -> None)

ExprAnonRecordNode(
isStruct,
ExprAnonStructRecordNode(
stn "struct" mStruct,
stn "{|" mOpen,
Option.map (fst >> mkExpr creationAide) copyInfo,
fields,
stn "|}" mClose,
exprRange
)
|> Expr.AnonRecord
|> Expr.AnonStructRecord
| SynExpr.AnonRecd(false, copyInfo, recordFields, EndRange 2 (mClose, _), { OpeningBraceRange = mOpen }) ->
let fields =
recordFields
|> List.choose (function
| ident, Some mEq, e ->
let m = unionRanges ident.idRange e.Range

let longIdent =
IdentListNode([ IdentifierOrDot.Ident(mkIdent ident) ], ident.idRange)

Some(RecordFieldNode(longIdent, stn "=" mEq, mkExpr creationAide e, m))
| _ -> None)

ExprRecordNode(
stn "{|" mOpen,
Option.map (fst >> mkExpr creationAide) copyInfo,
fields,
stn "|}" mClose,
exprRange
)
|> Expr.Record
| SynExpr.ObjExpr(t, eio, withKeyword, bd, members, ims, StartRange 3 (mNew, _), StartEndRange 1 (mOpen, _, mClose)) ->
let interfaceNodes =
ims
119 changes: 48 additions & 71 deletions src/Fantomas.Core/CodePrinter.fs
Original file line number Diff line number Diff line change
@@ -462,58 +462,17 @@ let genExpr (e: Expr) =
|> genNode node
| Expr.Record node ->
let smallRecordExpr = genSmallRecordNode node

let genCrampedFields targetColumn =
match node.CopyInfo with
| Some we -> genMultilineRecordCopyExpr (genMultilineRecordFieldsExpr node) we
| None ->
fun (ctx: Context) ->
col
sepNln
node.Fields
(fun e ->
// Add spaces to ensure the record field (incl trivia) starts at the right column.
addFixedSpaces targetColumn
// Lock the start of the record field, however keep potential indentations in relation to the opening curly brace
+> atCurrentColumn (genRecordFieldName e))
ctx

let multilineRecordExpr = genMultilineRecord genCrampedFields node
let multilineRecordExpr = genMultilineRecord node
genRecord smallRecordExpr multilineRecordExpr node
| Expr.AnonRecord node ->
let genStructPrefix = onlyIf node.IsStruct !- "struct "
| Expr.AnonStructRecord node ->
let genStructPrefix = genSingleTextNodeWithSpaceSuffix sepSpace node.Struct
let smallRecordExpr = genStructPrefix +> genSmallRecordNode node

let genMultilineAnonCrampedFields targetColumn =
match node.CopyInfo with
| Some we ->
atCurrentColumn (
genExpr we
+> (!- " with" +> indentSepNlnUnindent (genMultilineRecordFieldsExpr node))
)
| None ->
fun (ctx: Context) ->
col
sepNln
node.Fields
(fun fieldNode ->
let genNode =
if ctx.Config.IndentSize < 3 then
sepSpaceOrDoubleIndentAndNlnIfExpressionExceedsPageWidth
else
sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth

// Add spaces to ensure the record field (incl trivia) starts at the right column.
addFixedSpaces targetColumn
+> atCurrentColumn (enterNode fieldNode +> genIdentListNode fieldNode.FieldName)
+> sepSpace
+> genSingleTextNode fieldNode.Equals
+> genNode (genExpr fieldNode.Expr)
+> leaveNode fieldNode)
ctx

let multilineRecordExpr =
genStructPrefix +> genMultilineRecord genMultilineAnonCrampedFields node
if node.Struct.HasContentAfter then
genStructPrefix +> indentSepNlnUnindent (genMultilineRecord node)
else
genStructPrefix +> genMultilineRecord node

genRecord smallRecordExpr multilineRecordExpr node
| Expr.InheritRecord node ->
@@ -873,7 +832,7 @@ let genExpr (e: Expr) =
let genExpr e =
match e with
| Expr.Record _
| Expr.AnonRecord _ -> atCurrentColumnIndent (genExpr e)
| Expr.AnonStructRecord _ -> atCurrentColumnIndent (genExpr e)
| _ -> genExpr e

genExpr node.LeftHandSide
@@ -1630,24 +1589,28 @@ let genQuoteExpr (node: ExprQuoteNode) =
/// Prints the inside of an update record expression.
/// This function does not print the opening and closing braces.
/// </summary>
/// <param name="addAdditionalIndent">Should there be an additional indent after the `with` keyword.</param>
/// <param name="fieldsExpr">Record fields.</param>
/// <param name="copyExpr">Expression before the `with` keyword.</param>
let genMultilineRecordCopyExpr fieldsExpr copyExpr =
let genMultilineRecordCopyExpr (addAdditionalIndent: bool) fieldsExpr copyExpr =
atCurrentColumnIndent (genExpr copyExpr)
+> !- " with"
+> indent
+> whenShortIndent indent
+> onlyIf addAdditionalIndent indent
+> sepNln
+> fieldsExpr
+> whenShortIndent unindent
+> onlyIf addAdditionalIndent unindent
+> unindent

let genRecordFieldName (node: RecordFieldNode) =
genIdentListNode node.FieldName
+> sepSpace
+> genSingleTextNode node.Equals
atCurrentColumn (
enterNode node
+> genIdentListNode node.FieldName
+> sepSpace
+> genSingleTextNode node.Equals
)
+> sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidthUnlessStroustrup genExpr node.Expr
|> genNode node
+> leaveNode node

let genMultilineRecordFieldsExpr (node: ExprRecordBaseNode) =
col sepNln node.Fields genRecordFieldName
@@ -1680,23 +1643,13 @@ let genSmallRecordNode (node: ExprRecordNode) =
/// This is too avoid offset errors when using a smaller `indent_size`.
/// </para>
/// </summary>
/// <param name="genCrampedFields">
///<para>
/// Takes a targetColumn that indicates the column
/// after the opening brace `{ ` with respect to the `SpaceAroundDelimiter` setting.
/// </para>
/// <para>
/// In `Cramped` style we try to ensure that all record fields are starting at that column.
/// </para>
/// </param>
/// <param name="node">The ExprRecordNode</param>
/// <param name="ctx">Context</param>
let genMultilineRecord genCrampedFields (node: ExprRecordNode) (ctx: Context) =
let genMultilineRecord (node: ExprRecordNode) (ctx: Context) =
let expressionStartColumn = ctx.Column
let openBraceLength = node.OpeningBrace.Text.Length

let targetColumn =
let openBraceLength = node.OpeningBrace.Text.Length

expressionStartColumn
+ (if ctx.Config.SpaceAroundDelimiter then
openBraceLength + 1
@@ -1708,12 +1661,14 @@ let genMultilineRecord genCrampedFields (node: ExprRecordNode) (ctx: Context) =

match node.CopyInfo with
| Some ci ->
let additionalIndent = ctx.Config.IndentSize < 3

genSingleTextNodeSuffixDelimiter node.OpeningBrace
+> ifElseCtx
(fun ctx -> ctx.Config.IsStroustrupStyle)
(indent +> sepNln)
sepNlnWhenWriteBeforeNewlineNotEmpty // comment after curly brace
+> genMultilineRecordCopyExpr fieldsExpr ci
+> genMultilineRecordCopyExpr additionalIndent fieldsExpr ci
+> onlyIfCtx (fun ctx -> ctx.Config.IsStroustrupStyle) unindent
+> sepNln
+> genSingleTextNode node.ClosingBrace
@@ -1724,18 +1679,40 @@ let genMultilineRecord genCrampedFields (node: ExprRecordNode) (ctx: Context) =
+> genSingleTextNode node.ClosingBrace

let genMultilineCramped =
let genFields =
match node.CopyInfo with
| Some we ->
let additionalIndent =
// Anonymous record
(openBraceLength = 2 && ctx.Config.IndentSize <= 3)
// Regular record
|| ctx.Config.IndentSize < 3

genMultilineRecordCopyExpr additionalIndent (genMultilineRecordFieldsExpr node) we
| None ->
fun (ctx: Context) ->
col
sepNln
node.Fields
(fun e ->
// Add spaces to ensure the record field (incl trivia) starts at the right column.
addFixedSpaces targetColumn
// Potential indentations will be in relation to the opening curly brace.
+> genRecordFieldName e)
ctx

match node.CopyInfo with
| Some _ ->
genSingleTextNode node.OpeningBrace
+> sepNlnWhenWriteBeforeNewlineNotEmptyOr addSpaceIfSpaceAroundDelimiter // comment after curly brace
+> genCrampedFields targetColumn
+> genFields
+> addSpaceIfSpaceAroundDelimiter
+> genSingleTextNode node.ClosingBrace
| None ->
atCurrentColumn (
genSingleTextNodeSuffixDelimiter node.OpeningBrace
+> sepNlnWhenWriteBeforeNewlineNotEmpty // comment after curly brace
+> genCrampedFields targetColumn
+> genFields
+> sepNlnWhenWriteBeforeNewlineNotEmpty
+> (fun ctx ->
// Edge case scenario to make sure that the closing brace is not before the opening one
2 changes: 1 addition & 1 deletion src/Fantomas.Core/Context.fs
Original file line number Diff line number Diff line change
@@ -757,7 +757,7 @@ let isStroustrupStyleExpr (config: FormatConfig) (e: Expr) =

match e with
| Expr.Record _
| Expr.AnonRecord _
| Expr.AnonStructRecord _
| Expr.ArrayOrList _ -> isStroustrupEnabled
| Expr.NamedComputation _ -> not config.NewlineBeforeMultilineComputationExpression
| _ -> false
6 changes: 3 additions & 3 deletions src/Fantomas.Core/Selection.fs
Original file line number Diff line number Diff line change
@@ -163,12 +163,12 @@ let mkTreeWithSingleNode (node: Node) : TreeForSelection =
| :? ExprArrayOrListNode as node ->
let expr = Expr.ArrayOrList node
mkOakFromModuleDecl (ModuleDecl.DeclExpr expr)
| :? ExprAnonRecordNode as node ->
let expr = Expr.AnonRecord node
mkOakFromModuleDecl (ModuleDecl.DeclExpr expr)
| :? ExprInheritRecordNode as node ->
let expr = Expr.InheritRecord node
mkOakFromModuleDecl (ModuleDecl.DeclExpr expr)
| :? ExprAnonStructRecordNode as node ->
let expr = Expr.AnonStructRecord node
mkOakFromModuleDecl (ModuleDecl.DeclExpr expr)
| :? ExprRecordNode as node ->
let expr = Expr.Record node
mkOakFromModuleDecl (ModuleDecl.DeclExpr expr)
38 changes: 24 additions & 14 deletions src/Fantomas.Core/SyntaxOak.fs
Original file line number Diff line number Diff line change
@@ -759,6 +759,9 @@ type ExprRecordBaseNode(openingBrace: SingleTextNode, fields: RecordFieldNode li
member val ClosingBrace = closingBrace
member x.HasFields = List.isNotEmpty x.Fields

/// <summary>
/// Represents a record instance, parsed from both `SynExpr.Record` and `SynExpr.AnonRecd`.
/// </summary>
type ExprRecordNode
(
openingBrace: SingleTextNode,
@@ -779,35 +782,42 @@ type ExprRecordNode

member x.HasFields = List.isNotEmpty x.Fields

type ExprInheritRecordNode
type ExprAnonStructRecordNode
(
structNode: SingleTextNode,
openingBrace: SingleTextNode,
inheritConstructor: InheritConstructor,
copyInfo: Expr option,
fields: RecordFieldNode list,
closingBrace: SingleTextNode,
range
) =
inherit ExprRecordBaseNode(openingBrace, fields, closingBrace, range)

member val InheritConstructor = inheritConstructor
inherit ExprRecordNode(openingBrace, copyInfo, fields, closingBrace, range)
member val Struct = structNode

override val Children: Node array =
[| yield openingBrace
yield InheritConstructor.Node inheritConstructor
[| yield structNode
yield openingBrace
yield! copyInfo |> Option.map Expr.Node |> noa
yield! nodes fields
yield closingBrace |]

type ExprAnonRecordNode
type ExprInheritRecordNode
(
isStruct: bool,
openingBrace: SingleTextNode,
copyInfo: Expr option,
inheritConstructor: InheritConstructor,
fields: RecordFieldNode list,
closingBrace: SingleTextNode,
range
) =
inherit ExprRecordNode(openingBrace, copyInfo, fields, closingBrace, range)
member val IsStruct = isStruct
inherit ExprRecordBaseNode(openingBrace, fields, closingBrace, range)

member val InheritConstructor = inheritConstructor

override val Children: Node array =
[| yield openingBrace
yield InheritConstructor.Node inheritConstructor
yield! nodes fields
yield closingBrace |]

type InterfaceImplNode
(
@@ -1605,7 +1615,7 @@ type Expr =
| ArrayOrList of ExprArrayOrListNode
| Record of ExprRecordNode
| InheritRecord of ExprInheritRecordNode
| AnonRecord of ExprAnonRecordNode
| AnonStructRecord of ExprAnonStructRecordNode
| ObjExpr of ExprObjExprNode
| While of ExprWhileNode
| For of ExprForNode
@@ -1670,7 +1680,7 @@ type Expr =
| ArrayOrList n -> n
| Record n -> n
| InheritRecord n -> n
| AnonRecord n -> n
| AnonStructRecord n -> n
| ObjExpr n -> n
| While n -> n
| For n -> n