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