From afc6eade46797b587beec2d7d6989353fea84b97 Mon Sep 17 00:00:00 2001 From: Florian Verdonck Date: Sun, 27 Jun 2021 12:08:37 +0200 Subject: [PATCH] Add support for SynExpr.LibraryOnlyStaticOptimization. Fixes #1769. (#1788) --- src/Fantomas.Tests/Fantomas.Tests.fsproj | 1 + src/Fantomas.Tests/LibraryOnlySynExprTests.fs | 22 ++++++++++++++++++ src/Fantomas/CodePrinter.fs | 23 +++++++++++++++++++ src/Fantomas/SourceParser.fs | 8 +++++-- 4 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 src/Fantomas.Tests/LibraryOnlySynExprTests.fs diff --git a/src/Fantomas.Tests/Fantomas.Tests.fsproj b/src/Fantomas.Tests/Fantomas.Tests.fsproj index fba693f909..4c4a4e055d 100644 --- a/src/Fantomas.Tests/Fantomas.Tests.fsproj +++ b/src/Fantomas.Tests/Fantomas.Tests.fsproj @@ -89,6 +89,7 @@ + diff --git a/src/Fantomas.Tests/LibraryOnlySynExprTests.fs b/src/Fantomas.Tests/LibraryOnlySynExprTests.fs new file mode 100644 index 0000000000..955def6a2e --- /dev/null +++ b/src/Fantomas.Tests/LibraryOnlySynExprTests.fs @@ -0,0 +1,22 @@ +module Fantomas.Tests.LibraryOnlySynExprTests + +open NUnit.Framework +open FsUnit +open Fantomas.Tests.TestHelper + +[] +let ``SynExpr.LibraryOnlyStaticOptimization`` () = + formatSourceString + false + """ + let FromZero () : 'T = + (get32 0 :?> 'T) when 'T : BigInteger = BigInteger.Zero +""" + config + |> prepend newline + |> should + equal + """ +let FromZero () : 'T = + (get32 0 :?> 'T) when 'T: BigInteger = BigInteger.Zero +""" diff --git a/src/Fantomas/CodePrinter.fs b/src/Fantomas/CodePrinter.fs index 85c3d9a955..8b06a65b34 100644 --- a/src/Fantomas/CodePrinter.fs +++ b/src/Fantomas/CodePrinter.fs @@ -2426,6 +2426,13 @@ and genExpr astContext synExpr ctx = r.EndLine (r.EndColumn + 1) ) + + | LibraryOnlyStaticOptimization (optExpr, constraints, e) -> + genExpr astContext optExpr + +> genSynStaticOptimizationConstraint astContext constraints + +> sepEq + +> sepSpaceOrNlnIfExpressionExceedsPageWidth (genExpr astContext e) + | UnsupportedExpr r -> raise <| FormatException( @@ -5540,6 +5547,22 @@ and genConstBytes (bytes: byte []) (r: Range) = | None -> !-(sprintf "%A" bytes) <| ctx +and genSynStaticOptimizationConstraint + (astContext: ASTContext) + (constraints: SynStaticOptimizationConstraint list) + : Context -> Context = + let genConstraint astContext con = + match con with + | SynStaticOptimizationConstraint.WhenTyparTyconEqualsTycon (t1, t2, _) -> + genTypar astContext t1 + +> sepColon + +> sepSpace + +> genType astContext false t2 + | SynStaticOptimizationConstraint.WhenTyparIsStruct (t, _) -> genTypar astContext t + + !- " when " + +> col sepSpace constraints (genConstraint astContext) + and genTriviaFor (mainNodeName: FsAstType) (range: Range) f ctx = (enterNodeFor mainNodeName range +> f diff --git a/src/Fantomas/SourceParser.fs b/src/Fantomas/SourceParser.fs index 915ef71bc6..d67bdae871 100644 --- a/src/Fantomas/SourceParser.fs +++ b/src/Fantomas/SourceParser.fs @@ -1092,10 +1092,14 @@ let (|ILEmbedded|_|) = | SynExpr.LibraryOnlyILAssembly (_, _, _, _, r) -> Some(r) | _ -> None +let (|LibraryOnlyStaticOptimization|_|) (e: SynExpr) = + match e with + | SynExpr.LibraryOnlyStaticOptimization (constraints, e, optExpr, _) -> Some(optExpr, constraints, e) + | _ -> None + let (|UnsupportedExpr|_|) = function - // Temprorarily ignore these cases not often used outside FSharp.Core - | SynExpr.LibraryOnlyStaticOptimization (_, _, _, r) + // Temporarily ignore these cases not often used outside FSharp.Core | SynExpr.LibraryOnlyUnionCaseFieldGet (_, _, _, r) | SynExpr.LibraryOnlyUnionCaseFieldSet (_, _, _, _, r) -> Some r | _ -> None