diff --git a/CHANGELOG.md b/CHANGELOG.md index 853299e9e9..91857d18b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ ### Fixed * Comment no longer attached to autoproperty. [#2948](https://github.com/fsprojects/fantomas/issues/2948) +* `begin`/`end` are replaced with parens. [#2368](https://github.com/fsprojects/fantomas/issues/2368) ## 6.1.3 - 2023-08-25 diff --git a/src/Fantomas.Core.Tests/BeginEndTests.fs b/src/Fantomas.Core.Tests/BeginEndTests.fs new file mode 100644 index 0000000000..8756521d03 --- /dev/null +++ b/src/Fantomas.Core.Tests/BeginEndTests.fs @@ -0,0 +1,52 @@ +module Fantomas.Core.Tests.BeginEndTests + +open NUnit.Framework +open FsUnit +open Fantomas.Core.Tests.TestHelpers + +[] +let ``detect begin end from SynExpr.Paren, 2368`` () = + formatSourceString + false + """ +do + begin 1 end +""" + config + |> prepend newline + |> should + equal + """ +do begin 1 end +""" + +[] +let ``multiline begin end in expression`` () = + formatSourceString + false + """ +do + let a = 1 + begin + use b = f () + () + end + let c = 2 + () +""" + config + |> prepend newline + |> should + equal + """ +do + let a = 1 + + begin + use b = f () + () + end + + let c = 2 + () +""" diff --git a/src/Fantomas.Core.Tests/Fantomas.Core.Tests.fsproj b/src/Fantomas.Core.Tests/Fantomas.Core.Tests.fsproj index 257ea09bb3..4d7404e54c 100644 --- a/src/Fantomas.Core.Tests/Fantomas.Core.Tests.fsproj +++ b/src/Fantomas.Core.Tests/Fantomas.Core.Tests.fsproj @@ -130,6 +130,7 @@ + diff --git a/src/Fantomas.Core/ASTTransformer.fs b/src/Fantomas.Core/ASTTransformer.fs index 1645ea50c1..dff2b02858 100644 --- a/src/Fantomas.Core/ASTTransformer.fs +++ b/src/Fantomas.Core/ASTTransformer.fs @@ -1165,7 +1165,15 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr = | SynExpr.LongIdent(longDotId = SynLongIdent([ ident ], [], [ Some(ParenStarSynIdent(lpr, originalNotation, rpr)) ])) -> ExprParenFunctionNameWithStarNode(stn "(" lpr, stn originalNotation ident.idRange, stn ")" rpr, exprRange) |> Expr.ParenFunctionNameWithStar - | ParenExpr(lpr, e, rpr, pr) -> mkParenExpr creationAide lpr e rpr pr |> Expr.Paren + | ParenExpr(lpr, e, rpr, pr) -> + let hasBeginKeyword = (lpr.EndColumn - lpr.StartColumn) = 5 + let hasEndKeyword = (rpr.EndColumn - rpr.StartColumn) = 3 + + if hasBeginKeyword && hasEndKeyword then + ExprBeginEndNode(stn "begin" lpr, mkExpr creationAide e, stn "end" rpr, pr) + |> Expr.BeginEnd + else + mkParenExpr creationAide lpr e rpr pr |> Expr.Paren | SynExpr.Dynamic(funcExpr, _, argExpr, _) -> ExprDynamicNode(mkExpr creationAide funcExpr, mkExpr creationAide argExpr, exprRange) |> Expr.Dynamic diff --git a/src/Fantomas.Core/CodePrinter.fs b/src/Fantomas.Core/CodePrinter.fs index 4f6af00b75..b66bb3798d 100644 --- a/src/Fantomas.Core/CodePrinter.fs +++ b/src/Fantomas.Core/CodePrinter.fs @@ -1596,6 +1596,21 @@ let genExpr (e: Expr) = +> genSingleTextNode node.Dot +> genExpr node.Expr |> genNode node + | Expr.BeginEnd node -> + let short = + genSingleTextNode node.Begin + +> sepSpace + +> genExpr node.Expr + +> sepSpace + +> genSingleTextNode node.End + + let long = + genSingleTextNode node.Begin + +> indentSepNlnUnindent (genExpr node.Expr) + +> sepNln + +> genSingleTextNode node.End + + expressionFitsOnRestOfLine short long |> genNode node let genQuoteExpr (node: ExprQuoteNode) = genSingleTextNode node.OpenToken diff --git a/src/Fantomas.Core/SyntaxOak.fs b/src/Fantomas.Core/SyntaxOak.fs index 080d9a03f3..2ce749f196 100644 --- a/src/Fantomas.Core/SyntaxOak.fs +++ b/src/Fantomas.Core/SyntaxOak.fs @@ -1624,6 +1624,14 @@ type ExprDotLambda(underscore: SingleTextNode, dot: SingleTextNode, expr: Expr, member val Dot = dot member val Expr = expr +type ExprBeginEndNode(beginNode: SingleTextNode, expr: Expr, endNode: SingleTextNode, range) = + inherit NodeBase(range) + override val Children: Node array = [| yield beginNode; yield Expr.Node expr; yield endNode |] + + member val Begin = beginNode + member val Expr = expr + member val End = endNode + [] type Expr = | Lazy of ExprLazyNode @@ -1689,6 +1697,7 @@ type Expr = | Typar of SingleTextNode | Chain of ExprChain | DotLambda of ExprDotLambda + | BeginEnd of ExprBeginEndNode static member Node(x: Expr) : Node = match x with @@ -1755,6 +1764,7 @@ type Expr = | Typar n -> n | Chain n -> n | DotLambda n -> n + | BeginEnd n -> n member e.HasParentheses: bool = match e with