diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index bda0692f15..6e3cd0f5b4 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.400 +FROM mcr.microsoft.com/dotnet/sdk:10.0.100 # Avoid warnings by switching to noninteractive ENV DEBIAN_FRONTEND=noninteractive diff --git a/Directory.Build.props b/Directory.Build.props index e39f292f81..cb27543393 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -45,7 +45,7 @@ Some common use cases include: - e668b90e3c087e5fba8a855e502af60bf35be45e + 44c58e9663ebcb52f0eebd618af50852a831a50d diff --git a/Directory.Packages.props b/Directory.Packages.props index c3a3050a0a..0f4d93870d 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -4,7 +4,7 @@ true - + diff --git a/build.fsx b/build.fsx index 382cae6feb..11246e57c0 100644 --- a/build.fsx +++ b/build.fsx @@ -210,7 +210,7 @@ let downloadCompilerFile commitHash relativePath = let fs = file.Create() let fileName = Path.GetFileName(relativePath) let url = - $"https://raw.githubusercontent.com/dotnet/fsharp/{commitHash}/{relativePath}" + $"https://raw.githubusercontent.com/nojaf/fsharp/{commitHash}/{relativePath}" let! response = Http.AsyncRequestStream( url, @@ -233,6 +233,8 @@ pipeline "Init" { "src/Compiler/Utilities/NullnessShims.fs" "src/Compiler/Utilities/Activity.fsi" "src/Compiler/Utilities/Activity.fs" + "src/Compiler/Utilities/Caches.fsi" + "src/Compiler/Utilities/Caches.fs" "src/Compiler/Utilities/sformat.fsi" "src/Compiler/Utilities/sformat.fs" "src/Compiler/Utilities/sr.fsi" @@ -301,6 +303,10 @@ pipeline "Init" { "src/Compiler/SyntaxTree/SyntaxTree.fs" "src/Compiler/SyntaxTree/SyntaxTreeOps.fsi" "src/Compiler/SyntaxTree/SyntaxTreeOps.fs" + "src/Compiler/SyntaxTree/WarnScopes.fsi" + "src/Compiler/SyntaxTree/WarnScopes.fs" + "src/Compiler/SyntaxTree/LexerStore.fsi" + "src/Compiler/SyntaxTree/LexerStore.fs" "src/Compiler/SyntaxTree/ParseHelpers.fsi" "src/Compiler/SyntaxTree/ParseHelpers.fs" "src/Compiler/SyntaxTree/LexHelpers.fsi" diff --git a/docs/docs/contributors/Transforming.md b/docs/docs/contributors/Transforming.md index 0b96378684..b4ecfddde0 100644 --- a/docs/docs/contributors/Transforming.md +++ b/docs/docs/contributors/Transforming.md @@ -74,6 +74,15 @@ let a = Depending on the defines `[]` or `["DEBUG"]`, the AST will be different. The tree will also be created based on a single code path. +You can use your locally installed F# compiler to parse a file and view the AST via: + +```shell +# Tip: figure out the location of your installed sdk +whereis dotnet +# Invoke the parser +dotnet '/Users/nojaf/Library/Application Support/dnvm/dn/sdk/10.0.100/FSharp/fsc.dll' --parseonly --ast foo.fs +``` + ### Transform untyped AST to Oak The untyped syntax tree from the F# compiler is used as an intermediate representation of source code in the process of transforming a text file to binary. diff --git a/global.json b/global.json index 6f6aff9de6..971b5004e2 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.400", + "version": "10.0.100", "rollForward": "latestPatch" } } \ No newline at end of file diff --git a/src/Fantomas.Benchmarks/Fantomas.Benchmarks.fsproj b/src/Fantomas.Benchmarks/Fantomas.Benchmarks.fsproj index 5152fe51d8..88a3ddcbda 100644 --- a/src/Fantomas.Benchmarks/Fantomas.Benchmarks.fsproj +++ b/src/Fantomas.Benchmarks/Fantomas.Benchmarks.fsproj @@ -2,7 +2,7 @@ Exe - net8.0 + net10.0 false diff --git a/src/Fantomas.Benchmarks/packages.lock.json b/src/Fantomas.Benchmarks/packages.lock.json index bad220a5b4..488ed3ebf2 100644 --- a/src/Fantomas.Benchmarks/packages.lock.json +++ b/src/Fantomas.Benchmarks/packages.lock.json @@ -1,7 +1,7 @@ { "version": 2, "dependencies": { - "net8.0": { + "net10.0": { "BenchmarkDotNet": { "type": "Direct", "requested": "[0.14.0, )", @@ -22,9 +22,9 @@ }, "FSharp.Core": { "type": "Direct", - "requested": "[8.0.100, )", - "resolved": "8.0.100", - "contentHash": "ZOVZ/o+jI3ormTZOa28Wh0tSRoyle1f7lKFcUN61sPiXI7eDZu8eSveFybgTeyIEyW0ujjp31cp7GOglDgsNEg==" + "requested": "[9.0.300, )", + "resolved": "9.0.300", + "contentHash": "TVt2J7RCE1KCS2IaONF+p8/KIZ1eHNbW+7qmKF6hGoD4tXl+o07ja1mPtFjMqRa5uHMFaTrGTPn/m945WnDLiQ==" }, "G-Research.FSharp.Analyzers": { "type": "Direct", @@ -73,13 +73,7 @@ "resolved": "4.1.0", "contentHash": "bNzTyxP3iD5FPFHfVDl15Y6/wSoI7e3MeV0lOaj9igbIKTjgrmuw6LoVJ06jUNFA7+KaDC/OIsStWl/FQJz6sQ==", "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.3", - "System.Collections.Immutable": "5.0.0", - "System.Memory": "4.5.4", - "System.Reflection.Metadata": "5.0.0", - "System.Runtime.CompilerServices.Unsafe": "5.0.0", - "System.Text.Encoding.CodePages": "4.5.1", - "System.Threading.Tasks.Extensions": "4.5.4" + "Microsoft.CodeAnalysis.Analyzers": "3.3.3" } }, "Microsoft.CodeAnalysis.CSharp": { @@ -104,19 +98,13 @@ "resolved": "2.2.332302", "contentHash": "Hp84ivxSKIMTBzYSATxmUsm3YSXHWivcwiRRbsydGmqujMUK8BAueLN0ssAVEOkOBmh0vjUBhrq7YcroT7VCug==", "dependencies": { - "Microsoft.Diagnostics.NETCore.Client": "0.2.251802", - "System.Collections.Immutable": "5.0.0", - "System.Runtime.CompilerServices.Unsafe": "5.0.0" + "Microsoft.Diagnostics.NETCore.Client": "0.2.251802" } }, "Microsoft.Diagnostics.Tracing.TraceEvent": { "type": "Transitive", "resolved": "3.1.8", - "contentHash": "kl3UMrZKSeSEYZ8rt/GjLUQToREjgQABqfg6PzQBmSlYHTZOKE9ePEOS2xptROQ9SVvngg3QGX51TIT11iZ0wA==", - "dependencies": { - "Microsoft.Win32.Registry": "4.4.0", - "System.Runtime.CompilerServices.Unsafe": "5.0.0" - } + "contentHash": "kl3UMrZKSeSEYZ8rt/GjLUQToREjgQABqfg6PzQBmSlYHTZOKE9ePEOS2xptROQ9SVvngg3QGX51TIT11iZ0wA==" }, "Microsoft.DotNet.PlatformAbstractions": { "type": "Transitive", @@ -180,31 +168,13 @@ "Microsoft.Extensions.Primitives": { "type": "Transitive", "resolved": "2.1.1", - "contentHash": "scJ1GZNIxMmjpENh0UZ8XCQ6vzr/LzeF9WvEA51Ix2OQGAs9WPgPu8ABVUdvpKPLuor/t05gm6menJK3PwqOXg==", - "dependencies": { - "System.Memory": "4.5.1", - "System.Runtime.CompilerServices.Unsafe": "4.5.1" - } + "contentHash": "scJ1GZNIxMmjpENh0UZ8XCQ6vzr/LzeF9WvEA51Ix2OQGAs9WPgPu8ABVUdvpKPLuor/t05gm6menJK3PwqOXg==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", "resolved": "5.0.0", "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.3", - "contentHash": "3Wrmi0kJDzClwAC+iBdUBpEKmEle8FQNsCs77fkiOIw/9oYA07bL1EZNX0kQ2OMN3xpwvl0vAtOCYY3ndDNlhQ==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, "Perfolizer": { "type": "Transitive", "resolved": "0.3.17", @@ -221,91 +191,20 @@ "contentHash": "MF1CHaRcC+MLFdnDthv4/bKWBZnlnSpkGqa87pKukQefgEdwtb9zFW6zs0GjPp73qtpYYg4q6PEKbzJbxCpKfw==", "dependencies": { "Microsoft.NETCore.Platforms": "5.0.0", - "Microsoft.Win32.Registry": "5.0.0", "System.CodeDom": "5.0.0" } }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", - "dependencies": { - "Microsoft.NETCore.Platforms": "2.1.2", - "System.Runtime.CompilerServices.Unsafe": "4.5.2" - } - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" - }, "fantomas.core": { "type": "Project", "dependencies": { - "FSharp.Core": "[8.0.100, )", + "FSharp.Core": "[9.0.300, )", "Fantomas.FCS": "[1.0.0, )" } }, "fantomas.fcs": { "type": "Project", "dependencies": { - "FSharp.Core": "[8.0.100, )", - "System.Collections.Immutable": "[8.0.0, )", - "System.Diagnostics.DiagnosticSource": "[8.0.1, )", - "System.Memory": "[4.6.0, )", - "System.Runtime": "[4.3.1, )" - } - }, - "System.Collections.Immutable": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.Diagnostics.DiagnosticSource": { - "type": "CentralTransitive", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "vaoWjvkG1aenR2XdjaVivlCV9fADfgyhW5bZtXT23qaEea0lWiUljdQuze4E31vKM7ZWJaSUsbYIKE3rnzfZUg==" - }, - "System.Memory": { - "type": "CentralTransitive", - "requested": "[4.6.0, )", - "resolved": "4.6.0", - "contentHash": "OEkbBQoklHngJ8UD8ez2AERSk2g+/qpAaSWWCBFbpH727HxDq5ydVkuncBaKcKfwRqXGWx64dS6G1SUScMsitg==" - }, - "System.Runtime": { - "type": "CentralTransitive", - "requested": "[4.3.1, )", - "resolved": "4.3.1", - "contentHash": "abhfv1dTK6NXOmu4bgHIONxHyEqFjW8HwXPmpY9gmll+ix9UNo4XDcmzJn6oLooftxNssVHdJC1pGT9jkSynQg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.1", - "Microsoft.NETCore.Targets": "1.1.3" + "FSharp.Core": "[9.0.300, )" } } } diff --git a/src/Fantomas.Client.Tests/Fantomas.Client.Tests.fsproj b/src/Fantomas.Client.Tests/Fantomas.Client.Tests.fsproj index 3fe6e272c0..b1ea8b9214 100644 --- a/src/Fantomas.Client.Tests/Fantomas.Client.Tests.fsproj +++ b/src/Fantomas.Client.Tests/Fantomas.Client.Tests.fsproj @@ -2,7 +2,7 @@ FS0988 - net8.0 + net10.0 false false Major diff --git a/src/Fantomas.Client.Tests/packages.lock.json b/src/Fantomas.Client.Tests/packages.lock.json index 962b7621bb..158cd732e4 100644 --- a/src/Fantomas.Client.Tests/packages.lock.json +++ b/src/Fantomas.Client.Tests/packages.lock.json @@ -1,7 +1,7 @@ { "version": 2, "dependencies": { - "net8.0": { + "net10.0": { "CliWrap": { "type": "Direct", "requested": "[3.6.7, )", @@ -10,9 +10,9 @@ }, "FSharp.Core": { "type": "Direct", - "requested": "[8.0.100, )", - "resolved": "8.0.100", - "contentHash": "ZOVZ/o+jI3ormTZOa28Wh0tSRoyle1f7lKFcUN61sPiXI7eDZu8eSveFybgTeyIEyW0ujjp31cp7GOglDgsNEg==" + "requested": "[9.0.300, )", + "resolved": "9.0.300", + "contentHash": "TVt2J7RCE1KCS2IaONF+p8/KIZ1eHNbW+7qmKF6hGoD4tXl+o07ja1mPtFjMqRa5uHMFaTrGTPn/m945WnDLiQ==" }, "G-Research.FSharp.Analyzers": { "type": "Direct", @@ -75,10 +75,7 @@ "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", "resolved": "17.12.0", - "contentHash": "TDqkTKLfQuAaPcEb3pDDWnh7b3SyZF+/W9OZvWFp6eJCIiiYFdSB6taE2I6tWrFw5ywhzOb6sreoGJTI6m3rSQ==", - "dependencies": { - "System.Reflection.Metadata": "1.6.0" - } + "contentHash": "TDqkTKLfQuAaPcEb3pDDWnh7b3SyZF+/W9OZvWFp6eJCIiiYFdSB6taE2I6tWrFw5ywhzOb6sreoGJTI6m3rSQ==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", @@ -114,24 +111,13 @@ "contentHash": "r4G7uHHfoo8LCilPOdtf2C+Q5ymHOAXtciT4ZtB2xRlAvv4gPkWBYNAijFblStv3+uidp81j5DP11jMZl4BfJw==", "dependencies": { "Microsoft.VisualStudio.Threading": "17.10.48", - "Microsoft.VisualStudio.Validation": "17.8.8", - "System.IO.Pipelines": "8.0.0" + "Microsoft.VisualStudio.Validation": "17.8.8" } }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" - }, "fantomas.client": { "type": "Project", "dependencies": { - "FSharp.Core": "[8.0.100, )", + "FSharp.Core": "[9.0.300, )", "SemanticVersioning": "[2.0.2, )", "StreamJsonRpc": "[2.20.20, )" } @@ -159,8 +145,7 @@ "Microsoft.VisualStudio.Threading.Analyzers": "17.10.48", "Microsoft.VisualStudio.Validation": "17.8.8", "Nerdbank.Streams": "2.11.74", - "Newtonsoft.Json": "13.0.1", - "System.IO.Pipelines": "8.0.0" + "Newtonsoft.Json": "13.0.1" } } } diff --git a/src/Fantomas.Client/packages.lock.json b/src/Fantomas.Client/packages.lock.json index c389b5e46d..01c36cdedc 100644 --- a/src/Fantomas.Client/packages.lock.json +++ b/src/Fantomas.Client/packages.lock.json @@ -16,9 +16,9 @@ }, "FSharp.Core": { "type": "Direct", - "requested": "[8.0.100, )", - "resolved": "8.0.100", - "contentHash": "ZOVZ/o+jI3ormTZOa28Wh0tSRoyle1f7lKFcUN61sPiXI7eDZu8eSveFybgTeyIEyW0ujjp31cp7GOglDgsNEg==" + "requested": "[9.0.300, )", + "resolved": "9.0.300", + "contentHash": "TVt2J7RCE1KCS2IaONF+p8/KIZ1eHNbW+7qmKF6hGoD4tXl+o07ja1mPtFjMqRa5uHMFaTrGTPn/m945WnDLiQ==" }, "G-Research.FSharp.Analyzers": { "type": "Direct", diff --git a/src/Fantomas.Core.Tests/ASTTransformerTests.fs b/src/Fantomas.Core.Tests/ASTTransformerTests.fs index 498f9c86c5..2cb7409581 100644 --- a/src/Fantomas.Core.Tests/ASTTransformerTests.fs +++ b/src/Fantomas.Core.Tests/ASTTransformerTests.fs @@ -11,8 +11,8 @@ open Fantomas.Core let ``avoid stack-overflow in long array/list, 2485`` () = let mkStringExpr () = SynExpr.Const( - SynConst.String((System.Guid.NewGuid().ToString("N"), SynStringKind.Regular, Range.Zero)), - Range.Zero + SynConst.String((System.Guid.NewGuid().ToString("N"), SynStringKind.Regular, Range.range0)), + Range.range0 ) let longArrayExpr: SynExpr = @@ -27,34 +27,32 @@ let ``avoid stack-overflow in long array/list, 2485`` () = true, mkStringExpr (), childExpr, - Range.Zero, + Range.range0, SynExprSequentialTrivia.Zero )) - SynExpr.ArrayOrListComputed(true, mkArray 0 (mkStringExpr ()), Range.Zero) + SynExpr.ArrayOrListComputed(true, mkArray 0 (mkStringExpr ()), Range.range0) let ast = ParsedInput.ImplFile( ParsedImplFileInput( "filename.fsx", true, - QualifiedNameOfFile(Ident("", Range.Zero)), - [], + QualifiedNameOfFile(Ident("", Range.range0)), [], [ SynModuleOrNamespace( [], false, SynModuleOrNamespaceKind.AnonModule, - [ SynModuleDecl.Expr(longArrayExpr, Range.Zero) ], + [ SynModuleDecl.Expr(longArrayExpr, Range.range0) ], PreXmlDoc.Empty, [], None, - Range.Zero, + Range.range0, { LeadingKeyword = SynModuleOrNamespaceLeadingKeyword.None } ) ], (false, false), - { ConditionalDirectives = [] - CodeComments = [] }, + ParsedInputTrivia.Empty, Set.empty ) ) diff --git a/src/Fantomas.Core.Tests/AutoPropertiesTests.fs b/src/Fantomas.Core.Tests/AutoPropertiesTests.fs index ab6a962df9..8600920912 100644 --- a/src/Fantomas.Core.Tests/AutoPropertiesTests.fs +++ b/src/Fantomas.Core.Tests/AutoPropertiesTests.fs @@ -74,7 +74,7 @@ type X = member internal Y: int with public get, private set """ -[] +[] let ``abstract member with public get, private set`` () = formatSignatureString """ diff --git a/src/Fantomas.Core.Tests/CodeFormatterTests.fs b/src/Fantomas.Core.Tests/CodeFormatterTests.fs index f44801cc39..89e0f862cf 100644 --- a/src/Fantomas.Core.Tests/CodeFormatterTests.fs +++ b/src/Fantomas.Core.Tests/CodeFormatterTests.fs @@ -4,7 +4,6 @@ open Fantomas.Core.SyntaxOak open NUnit.Framework open Fantomas.FCS.Text open Fantomas.Core -open Fantomas.Core.SyntaxOak open Fantomas.Core.Tests.TestHelpers [] diff --git a/src/Fantomas.Core.Tests/CodePrinterHelperFunctionsTests.fs b/src/Fantomas.Core.Tests/CodePrinterHelperFunctionsTests.fs index 82d131e21a..5e28a189ab 100644 --- a/src/Fantomas.Core.Tests/CodePrinterHelperFunctionsTests.fs +++ b/src/Fantomas.Core.Tests/CodePrinterHelperFunctionsTests.fs @@ -209,7 +209,7 @@ let a = // Let's create a dummy Oak // In practise, a FCS Syntax tree will be transformed to an Oak - let zeroRange = Fantomas.FCS.Text.Range.Zero + let zeroRange = Fantomas.FCS.Text.Range.range0 let stn text = SingleTextNode(text, zeroRange) let tree = @@ -321,7 +321,7 @@ let b = 2 """ // Imagine that we always want to print a new line between let bindings. - let zeroRange = Fantomas.FCS.Text.Range.Zero + let zeroRange = Fantomas.FCS.Text.Range.range0 let stn text = SingleTextNode(text, zeroRange) let mkBinding name body = diff --git a/src/Fantomas.Core.Tests/CommentTests.fs b/src/Fantomas.Core.Tests/CommentTests.fs index e3285e3e3c..55e064344f 100644 --- a/src/Fantomas.Core.Tests/CommentTests.fs +++ b/src/Fantomas.Core.Tests/CommentTests.fs @@ -5,6 +5,11 @@ open FsUnit open Fantomas.Core.Tests.TestHelpers open Fantomas.Core +[] +let ``should keep sticky-to-the-left comments after #if directives`` () = + formatSourceString "#if DEBUG // debug only\n#endif\n" config + |> should equal "#if DEBUG // debug only\n#endif\n" + [] let ``should keep sticky-to-the-left comments after nowarn directives`` () = formatSourceString """#nowarn "51" // address-of operator can occur in the code""" config diff --git a/src/Fantomas.Core.Tests/ComputationExpressionTests.fs b/src/Fantomas.Core.Tests/ComputationExpressionTests.fs index 1b7912be90..aeaff8d4ec 100644 --- a/src/Fantomas.Core.Tests/ComputationExpressionTests.fs +++ b/src/Fantomas.Core.Tests/ComputationExpressionTests.fs @@ -1360,6 +1360,11 @@ let loginHandler = """ [] +[] let ``all keywords`` () = formatSourceString """ @@ -1642,7 +1647,9 @@ let private removeSubscription (log : ILogger) (req : HttpRequest) = return sendText "Subscription removed" } """ - { config with SpaceBeforeColon = true } + { config with + SpaceBeforeColon = true + MaxValueBindingWidth = 120 } |> prepend newline |> should equal @@ -2467,3 +2474,65 @@ A() {} """ A() { } """ + +[] +let ``typed let bang expression`` () = + formatSourceString + """ +async { + let! { Name = name }: Person = asyncPerson() + return name +} +""" + config + |> prepend newline + |> should + equal + """ +async { + let! { Name = name }: Person = asyncPerson () + return name +} +""" + +[] +let ``unwrap union case in computation expression`` () = + formatSourceString + """ +async { + let! Union value = asyncOption() + () +} +""" + config + |> prepend newline + |> should + equal + """ +async { + let! Union value = asyncOption () + () +} +""" + +[] +let ``typed and bang expression`` () = + formatSourceString + """ +async { + let! x: int = doX() + and! y: int = doY() + return x + y +} +""" + config + |> prepend newline + |> should + equal + """ +async { + let! x: int = doX () + and! y: int = doY () + return x + y +} +""" diff --git a/src/Fantomas.Core.Tests/Fantomas.Core.Tests.fsproj b/src/Fantomas.Core.Tests/Fantomas.Core.Tests.fsproj index 6f606dc0ce..433285415b 100644 --- a/src/Fantomas.Core.Tests/Fantomas.Core.Tests.fsproj +++ b/src/Fantomas.Core.Tests/Fantomas.Core.Tests.fsproj @@ -1,7 +1,7 @@ FS0988 - net8.0 + net10.0 FS0025 false Major diff --git a/src/Fantomas.Core.Tests/HashDirectiveTests.fs b/src/Fantomas.Core.Tests/HashDirectiveTests.fs index 233b10aee6..0edfeb5d08 100644 --- a/src/Fantomas.Core.Tests/HashDirectiveTests.fs +++ b/src/Fantomas.Core.Tests/HashDirectiveTests.fs @@ -248,6 +248,7 @@ let ``#help without string`` () = #help List.map """ +// As of F# 10.0, warn directives are treated as trivia like #if, so argruments are not formatted [] let ``#nowarn with integer`` () = formatSourceString @@ -259,5 +260,5 @@ let ``#nowarn with integer`` () = |> should equal """ -#nowarn 1182 +#nowarn 1182 """ diff --git a/src/Fantomas.Core.Tests/QuotationTests.fs b/src/Fantomas.Core.Tests/QuotationTests.fs index 39f40f8a02..7e6d84f67a 100644 --- a/src/Fantomas.Core.Tests/QuotationTests.fs +++ b/src/Fantomas.Core.Tests/QuotationTests.fs @@ -170,3 +170,19 @@ test Pop = null } } @> """ + +[] +let ``quotation in anonymous record`` () = + formatSourceString + """ +{| A= <@ 1 + 1 @>|} +{| A = <@@ 1 + 1 @@>|} +""" + { config with IndentSize = 2 } + |> prepend newline + |> should + equal + """ +{| A = <@ 1 + 1 @> |} +{| A = <@@ 1 + 1 @@> |} +""" diff --git a/src/Fantomas.Core.Tests/SynLongIdentTests.fs b/src/Fantomas.Core.Tests/SynLongIdentTests.fs index eed7c2d0e5..ef99c6e95a 100644 --- a/src/Fantomas.Core.Tests/SynLongIdentTests.fs +++ b/src/Fantomas.Core.Tests/SynLongIdentTests.fs @@ -344,7 +344,7 @@ let path = [] let ``backticks can be added from AST only scenarios`` () = let tree = - let testIdent = Ident("Test", Range.Zero) + let testIdent = Ident("Test", Range.range0) ParsedInput.ImplFile( ParsedImplFileInput( @@ -352,7 +352,6 @@ let ``backticks can be added from AST only scenarios`` () = true, QualifiedNameOfFile testIdent, [], - [], [ SynModuleOrNamespace( [ testIdent ], false, @@ -361,24 +360,23 @@ let ``backticks can be added from AST only scenarios`` () = SynExpr.LongIdent( false, SynLongIdent( - [ Ident("new", Range.Zero) ], + [ Ident("new", Range.range0) ], [], [ Some(IdentTrivia.OriginalNotation "``new``") ] ), None, - Range.Zero + Range.range0 ), - Range.Zero + Range.range0 ) ], PreXmlDoc.Empty, [], None, - Range.Zero, + Range.range0, { LeadingKeyword = SynModuleOrNamespaceLeadingKeyword.None } ) ], (true, false), - { ConditionalDirectives = [] - CodeComments = [] }, + ParsedInputTrivia.Empty, Set.empty ) ) diff --git a/src/Fantomas.Core.Tests/TestHelpers.fs b/src/Fantomas.Core.Tests/TestHelpers.fs index 616b5e2d8e..76c88a3d35 100644 --- a/src/Fantomas.Core.Tests/TestHelpers.fs +++ b/src/Fantomas.Core.Tests/TestHelpers.fs @@ -31,7 +31,7 @@ let formatFSharpString isFsiFile (s: string) config = if formattedCode <> secondFormattedCode then failwith $"The formatted result was not idempotent.\n%s{formattedCode}\n%s{secondFormattedCode}" - printfn "formatted code:\n%s\n" formattedCode + // printfn "formatted code:\n%s\n" formattedCode return formattedCode } diff --git a/src/Fantomas.Core.Tests/packages.lock.json b/src/Fantomas.Core.Tests/packages.lock.json index 9d84872dfc..47e54d5b51 100644 --- a/src/Fantomas.Core.Tests/packages.lock.json +++ b/src/Fantomas.Core.Tests/packages.lock.json @@ -1,7 +1,7 @@ { "version": 2, "dependencies": { - "net8.0": { + "net10.0": { "FsCheck": { "type": "Direct", "requested": "[2.16.5, )", @@ -13,9 +13,9 @@ }, "FSharp.Core": { "type": "Direct", - "requested": "[8.0.100, )", - "resolved": "8.0.100", - "contentHash": "ZOVZ/o+jI3ormTZOa28Wh0tSRoyle1f7lKFcUN61sPiXI7eDZu8eSveFybgTeyIEyW0ujjp31cp7GOglDgsNEg==" + "requested": "[9.0.300, )", + "resolved": "9.0.300", + "contentHash": "TVt2J7RCE1KCS2IaONF+p8/KIZ1eHNbW+7qmKF6hGoD4tXl+o07ja1mPtFjMqRa5uHMFaTrGTPn/m945WnDLiQ==" }, "FsUnit": { "type": "Direct", @@ -75,23 +75,10 @@ "resolved": "17.12.0", "contentHash": "4svMznBd5JM21JIG2xZKGNanAHNXplxf/kQDFfLHXQ3OnpJkayRK/TjacFjA+EYmoyuNXHo/sOETEfcYtAzIrA==" }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "TMBuzAHpTenGbGgk0SMTwyEkyijY/Eae4ZGsFNYJvAr/LDn1ku3Etp3FPxChmDp5HHF3kzJuoaa08N0xjqAJfQ==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.3", - "contentHash": "3Wrmi0kJDzClwAC+iBdUBpEKmEle8FQNsCs77fkiOIw/9oYA07bL1EZNX0kQ2OMN3xpwvl0vAtOCYY3ndDNlhQ==" - }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", "resolved": "17.12.0", - "contentHash": "TDqkTKLfQuAaPcEb3pDDWnh7b3SyZF+/W9OZvWFp6eJCIiiYFdSB6taE2I6tWrFw5ywhzOb6sreoGJTI6m3rSQ==", - "dependencies": { - "System.Reflection.Metadata": "1.6.0" - } + "contentHash": "TDqkTKLfQuAaPcEb3pDDWnh7b3SyZF+/W9OZvWFp6eJCIiiYFdSB6taE2I6tWrFw5ywhzOb6sreoGJTI6m3rSQ==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", @@ -102,11 +89,6 @@ "Newtonsoft.Json": "13.0.1" } }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" - }, "TestableIO.System.IO.Abstractions": { "type": "Transitive", "resolved": "21.1.3", @@ -132,18 +114,14 @@ "fantomas.core": { "type": "Project", "dependencies": { - "FSharp.Core": "[8.0.100, )", + "FSharp.Core": "[9.0.300, )", "Fantomas.FCS": "[1.0.0, )" } }, "fantomas.fcs": { "type": "Project", "dependencies": { - "FSharp.Core": "[8.0.100, )", - "System.Collections.Immutable": "[8.0.0, )", - "System.Diagnostics.DiagnosticSource": "[8.0.1, )", - "System.Memory": "[4.6.0, )", - "System.Runtime": "[4.3.1, )" + "FSharp.Core": "[9.0.300, )" } }, "Newtonsoft.Json": { @@ -151,34 +129,6 @@ "requested": "[13.0.3, )", "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "System.Collections.Immutable": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.Diagnostics.DiagnosticSource": { - "type": "CentralTransitive", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "vaoWjvkG1aenR2XdjaVivlCV9fADfgyhW5bZtXT23qaEea0lWiUljdQuze4E31vKM7ZWJaSUsbYIKE3rnzfZUg==" - }, - "System.Memory": { - "type": "CentralTransitive", - "requested": "[4.6.0, )", - "resolved": "4.6.0", - "contentHash": "OEkbBQoklHngJ8UD8ez2AERSk2g+/qpAaSWWCBFbpH727HxDq5ydVkuncBaKcKfwRqXGWx64dS6G1SUScMsitg==" - }, - "System.Runtime": { - "type": "CentralTransitive", - "requested": "[4.3.1, )", - "resolved": "4.3.1", - "contentHash": "abhfv1dTK6NXOmu4bgHIONxHyEqFjW8HwXPmpY9gmll+ix9UNo4XDcmzJn6oLooftxNssVHdJC1pGT9jkSynQg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.1", - "Microsoft.NETCore.Targets": "1.1.3" - } } } } diff --git a/src/Fantomas.Core/ASTTransformer.fs b/src/Fantomas.Core/ASTTransformer.fs index f7e48dad8d..a7db1b7842 100644 --- a/src/Fantomas.Core/ASTTransformer.fs +++ b/src/Fantomas.Core/ASTTransformer.fs @@ -298,10 +298,10 @@ let mkTuple (creationAide: CreationAide) (exprs: SynExpr list) (commas: range li /// Recursive and use properties have to be determined at this point let rec (|LetOrUses|_|) = function - | SynExpr.LetOrUse(_, _, xs, LetOrUses(ys, e), _, trivia) -> + | SynExpr.LetOrUse(bindings = xs; body = LetOrUses(ys, e); trivia = trivia) -> let xs' = List.mapWithLast (fun b -> b, None) (fun b -> b, trivia.InKeyword) xs Some(xs' @ ys, e) - | SynExpr.LetOrUse(_, _, xs, e, _, trivia) -> + | SynExpr.LetOrUse(bindings = xs; body = e; trivia = trivia) -> let xs' = List.mapWithLast (fun b -> b, None) (fun b -> b, trivia.InKeyword) xs Some(xs', e) | _ -> None @@ -324,46 +324,10 @@ let rec collectComputationExpressionStatements | Some mIn -> Some(stn "in" mIn), unionRanges b.Range mIn ExprLetOrUseNode(b, inNode, m) - |> ComputationExpressionStatement.LetOrUseStatement) + |> ComputationExpressionStatement.BindingStatement) collectComputationExpressionStatements creationAide body (fun bodyStatements -> [ yield! bindings; yield! bodyStatements ] |> finalContinuation) - | SynExpr.LetOrUseBang(_, - isUse, - _, - pat, - expr, - andBangs, - body, - StartRange 4 (mLeading, _m), - { EqualsRange = Some mEq }) -> - let letOrUseBang = - ExprLetOrUseBangNode( - stn (if isUse then "use!" else "let!") mLeading, - mkPat creationAide pat, - stn "=" mEq, - mkExpr creationAide expr, - unionRanges mLeading expr.Range - ) - |> ComputationExpressionStatement.LetOrUseBangStatement - - let andBangs = - andBangs - |> List.map - (fun - (SynExprAndBang(_, - _, - _, - ap, - ae, - m, - { AndBangKeyword = mAnd - EqualsRange = mEq })) -> - ExprAndBang(stn "and!" mAnd, mkPat creationAide ap, stn "=" mEq, mkExpr creationAide ae, m) - |> ComputationExpressionStatement.AndBangStatement) - - collectComputationExpressionStatements creationAide body (fun bodyStatements -> - [ letOrUseBang; yield! andBangs; yield! bodyStatements ] |> finalContinuation) | SynExpr.Sequential(expr1 = e1; expr2 = e2; trivia = trivia) -> let continuations : ((ComputationExpressionStatement list -> ComputationExpressionStatement list) @@ -966,23 +930,23 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr = | SynExpr.AddressOf(false, e, _, StartRange 2 (ampersandToken, _range)) -> ExprSingleNode(stn "&&" ampersandToken, false, false, mkExpr creationAide e, exprRange) |> Expr.Single - | SynExpr.YieldOrReturn((true, _), e, StartRange 5 (yieldKeyword, _range)) -> - ExprSingleNode(stn "yield" yieldKeyword, true, true, mkExpr creationAide e, exprRange) + | SynExpr.YieldOrReturn((true, _), e, _range, trivia) -> + ExprSingleNode(stn "yield" trivia.YieldOrReturnKeyword, true, true, mkExpr creationAide e, exprRange) |> Expr.Single - | SynExpr.YieldOrReturn((false, _), e, StartRange 6 (returnKeyword, _range)) -> - ExprSingleNode(stn "return" returnKeyword, true, true, mkExpr creationAide e, exprRange) + | SynExpr.YieldOrReturn((false, _), e, _range, trivia) -> + ExprSingleNode(stn "return" trivia.YieldOrReturnKeyword, true, true, mkExpr creationAide e, exprRange) |> Expr.Single - | SynExpr.YieldOrReturnFrom((true, _), e, StartRange 6 (yieldBangKeyword, _range)) -> - ExprSingleNode(stn "yield!" yieldBangKeyword, true, true, mkExpr creationAide e, exprRange) + | SynExpr.YieldOrReturnFrom((true, _), e, _range, trivia) -> + ExprSingleNode(stn "yield!" trivia.YieldOrReturnFromKeyword, true, true, mkExpr creationAide e, exprRange) |> Expr.Single - | SynExpr.YieldOrReturnFrom((false, _), e, StartRange 7 (returnBangKeyword, _range)) -> - ExprSingleNode(stn "return!" returnBangKeyword, true, true, mkExpr creationAide e, exprRange) + | SynExpr.YieldOrReturnFrom((false, _), e, _range, trivia) -> + ExprSingleNode(stn "return!" trivia.YieldOrReturnFromKeyword, true, true, mkExpr creationAide e, exprRange) |> Expr.Single | SynExpr.Do(e, StartRange 2 (doKeyword, _range)) -> ExprSingleNode(stn "do" doKeyword, true, true, mkExpr creationAide e, exprRange) |> Expr.Single - | SynExpr.DoBang(e, StartRange 3 (doBangKeyword, _range)) -> - ExprSingleNode(stn "do!" doBangKeyword, true, true, mkExpr creationAide e, exprRange) + | SynExpr.DoBang(e, _range, trivia) -> + ExprSingleNode(stn "do!" trivia.DoBangKeyword, true, true, mkExpr creationAide e, exprRange) |> Expr.Single | SynExpr.Fixed(e, StartRange 5 (fixedKeyword, _range)) -> ExprSingleNode(stn "fixed" fixedKeyword, true, false, mkExpr creationAide e, exprRange) @@ -1029,9 +993,7 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr = let fieldNodes = recordFields |> List.choose (function - | SynExprRecordField((fieldName, _), Some mEq, Some expr, _) -> - let m = unionRanges fieldName.Range expr.Range - + | SynExprRecordField((fieldName, _), Some mEq, Some expr, m, _) -> Some( RecordFieldNode(mkSynLongIdent creationAide fieldName, stn "=" mEq, mkExpr creationAide expr, m) ) @@ -1144,7 +1106,7 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr = _, pat, e1, - SynExpr.YieldOrReturn((true, _), e2, _), + SynExpr.YieldOrReturn((true, _), e2, _, _), StartRange 3 (mFor, _)) -> ExprForEachNode( stn "for" mFor, @@ -1183,7 +1145,6 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr = |> Expr.Computation | SynExpr.LetOrUse _ - | SynExpr.LetOrUseBang _ | SynExpr.Sequential _ -> ExprCompExprBodyNode(collectComputationExpressionStatements creationAide e id, exprRange) |> Expr.CompExprBody @@ -1278,7 +1239,7 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr = ExprNamedComputationNode( mkExpr creationAide expr, stn "{" mOpen, - Expr.Ident(stn "" Range.Zero), + Expr.Ident(stn "" Range.range0), stn "}" mClose, m ) @@ -1758,14 +1719,14 @@ let mkPat (creationAide: CreationAide) (p: SynPat) = let pairs = nps - |> List.choose (fun (ident, eq, pat) -> + |> List.choose (fun (NamePatPairField(fieldName = fieldName; equalsRange = eq; pat = pat)) -> eq |> Option.map (fun eq -> - NamePatPair( - mkIdent ident, + NamePatPairNode( + mkSynLongIdent creationAide fieldName, stn "=" eq, mkPat creationAide pat, - unionRanges ident.idRange pat.Range + unionRanges fieldName.Range pat.Range ))) PatNamePatPairsNode( @@ -1804,16 +1765,10 @@ let mkPat (creationAide: CreationAide) (p: SynPat) = | SynPat.Record(fields, StartEndRange 1 (o, _, c)) -> let fields = fields - |> List.map (fun ((lid, ident), eq, pat) -> - let prefix = if lid.IsEmpty then None else Some(mkLongIdent lid) - - let range = - match prefix with - | None -> unionRanges ident.idRange pat.Range - | Some prefix -> unionRanges prefix.Range pat.Range - - let eqNode = stn "=" (Option.defaultValue Range.Zero eq) - PatRecordField(prefix, mkIdent ident, eqNode, mkPat creationAide pat, range)) + |> List.map (fun (NamePatPairField(fieldName = fieldName; equalsRange = eq; pat = pat) as np) -> + let range = np.Range // TODO: might be wrong unionRanges prefix.Range pat.Range + let eqNode = stn "=" (Option.defaultValue Range.range0 eq) + NamePatPairNode(mkSynLongIdent creationAide fieldName, eqNode, mkPat creationAide pat, range)) PatRecordNode(stn "{" o, fields, stn "}" c, patternRange) |> Pattern.Record | SynPat.Const(c, r) -> mkConstant creationAide c r |> Pattern.Const @@ -2401,9 +2356,12 @@ let mkSynLeadingKeyword (lk: SynLeadingKeyword) = match lk with | SynLeadingKeyword.Let letRange -> mtn [ "let", letRange ] + | SynLeadingKeyword.LetBang letBangRange -> mtn [ "let!", letBangRange ] | SynLeadingKeyword.LetRec(letRange, recRange) -> mtn [ "let", letRange; "rec", recRange ] | SynLeadingKeyword.And andRange -> mtn [ "and", andRange ] + | SynLeadingKeyword.AndBang andBangRange -> mtn [ "and!", andBangRange ] | SynLeadingKeyword.Use useRange -> mtn [ "use", useRange ] + | SynLeadingKeyword.UseBang useBangRange -> mtn [ "use!", useBangRange ] | SynLeadingKeyword.UseRec(useRange, recRange) -> mtn [ "use", useRange; "rec", recRange ] | SynLeadingKeyword.Extern externRange -> mtn [ "extern", externRange ] | SynLeadingKeyword.Member memberRange -> mtn [ "member", memberRange ] @@ -2809,8 +2767,8 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) = let memberDefinitionRange = md.Range match md with - | SynMemberDefn.ImplicitInherit(t, e, _, StartRange 7 (mInherit, _)) -> - mkInheritConstructor creationAide t e mInherit memberDefinitionRange + | SynMemberDefn.ImplicitInherit(t, e, _, _, trivia) -> + mkInheritConstructor creationAide t e trivia.InheritKeyword memberDefinitionRange |> MemberDefn.ImplicitInherit // Transforms: `member this.Y with get() = "meh"` into `member this.Y = "meh"` @@ -2870,9 +2828,16 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) = ) |> MemberDefn.ExplicitCtor | SynMemberDefn.Member(memberDefn, _) -> mkBinding creationAide memberDefn |> MemberDefn.Member - | SynMemberDefn.Inherit(baseType, _, StartRange 7 (mInherit, _)) -> - MemberDefnInheritNode(stn "inherit" mInherit, mkType creationAide baseType, memberDefinitionRange) - |> MemberDefn.Inherit + | SynMemberDefn.Inherit(baseTypeOpt, _, _isInline, trivia) -> + match baseTypeOpt with + | Some baseType -> + MemberDefnInheritNode( + stn "inherit" trivia.InheritKeyword, + mkType creationAide baseType, + memberDefinitionRange + ) + |> MemberDefn.Inherit + | None -> failwith "successful parse shouldn't have any unfinished inherit" | SynMemberDefn.ValField(f, _) -> mkSynField creationAide f |> MemberDefn.ValField | SynMemberDefn.LetBindings( bindings = [ SynBinding(trivia = { LeadingKeyword = SynLeadingKeyword.Extern _ }) as binding ]) -> @@ -3217,7 +3182,7 @@ let mkModuleOrNamespace | SynModuleOrNamespaceLeadingKeyword.Namespace mNamespace -> match kind with | SynModuleOrNamespaceKind.GlobalNamespace -> - Some(MultipleTextsNode([ stn "namespace" mNamespace; stn "global" Range.Zero ], mNamespace)) + Some(MultipleTextsNode([ stn "namespace" mNamespace; stn "global" Range.range0 ], mNamespace)) | _ -> Some(MultipleTextsNode([ stn "namespace" mNamespace ], mNamespace)) | SynModuleOrNamespaceLeadingKeyword.None -> None @@ -3542,7 +3507,7 @@ let mkModuleOrNamespaceSig | SynModuleOrNamespaceLeadingKeyword.Namespace mNamespace -> match kind with | SynModuleOrNamespaceKind.GlobalNamespace -> - Some(MultipleTextsNode([ stn "namespace" mNamespace; stn "global" Range.Zero ], mNamespace)) + Some(MultipleTextsNode([ stn "namespace" mNamespace; stn "global" Range.range0 ], mNamespace)) | _ -> Some(MultipleTextsNode([ stn "namespace" mNamespace ], mNamespace)) | SynModuleOrNamespaceLeadingKeyword.None -> None @@ -3598,25 +3563,28 @@ let mkSigFile let mds = List.map (mkModuleOrNamespaceSig creationAide) contents Oak(phds, mds, m) -let includeTrivia - (baseRange: range) - (comments: CommentTrivia list) - (conditionDirectives: ConditionalDirectiveTrivia list) - : range = +let includeTrivia (baseRange: range) (trivia: ParsedInputTrivia) : range = let ranges = [ yield! List.map (function | CommentTrivia.LineComment m | CommentTrivia.BlockComment m -> m) - comments + trivia.CodeComments yield! List.map (function | ConditionalDirectiveTrivia.If(range = range) | ConditionalDirectiveTrivia.Else(range = range) | ConditionalDirectiveTrivia.EndIf(range = range) -> range) - conditionDirectives ] + trivia.ConditionalDirectives + + yield! + List.map + (function + | WarnDirectiveTrivia.Nowarn(range) + | WarnDirectiveTrivia.Warnon(range) -> range) + trivia.WarnDirectives ] (baseRange, ranges) ||> List.fold (fun acc triviaRange -> @@ -3631,7 +3599,7 @@ let mkSynModuleOrNamespaceFullRange (mn: SynModuleOrNamespace) = match mn with | SynModuleOrNamespace(kind = SynModuleOrNamespaceKind.AnonModule; decls = decls) -> match List.tryHead decls, List.tryLast decls with - | None, None -> Range.Zero + | None, None -> RangeHelpers.absoluteZeroRange | Some d, None | None, Some d -> d.Range | Some s, Some e -> unionRanges s.Range e.Range @@ -3641,7 +3609,7 @@ let mkSynModuleOrNamespaceSigFullRange (mn: SynModuleOrNamespaceSig) = match mn with | SynModuleOrNamespaceSig(kind = SynModuleOrNamespaceKind.AnonModule; decls = decls) -> match List.tryHead decls, List.tryLast decls with - | None, None -> Range.Zero + | None, None -> RangeHelpers.absoluteZeroRange | Some d, None | None, Some d -> d.Range | Some s, Some e -> unionRanges s.Range e.Range @@ -3657,18 +3625,18 @@ let mkFullTreeRange ast = | [] -> match modules with | m :: _ -> mkSynModuleOrNamespaceFullRange m - | _ -> Range.Zero + | _ -> RangeHelpers.absoluteZeroRange let endPos = match List.tryLast modules with | None -> match List.tryLast directives with - | None -> Range.Zero + | None -> RangeHelpers.absoluteZeroRange | Some(ParsedHashDirective(range = r)) -> r | Some lastModule -> mkSynModuleOrNamespaceFullRange lastModule let astRange = unionRanges startPos endPos - includeTrivia astRange trivia.CodeComments trivia.ConditionalDirectives + includeTrivia astRange trivia | ParsedInput.SigFile(ParsedSigFileInput(hashDirectives = directives; contents = modules; trivia = trivia)) -> let startPos = @@ -3677,18 +3645,18 @@ let mkFullTreeRange ast = | [] -> match modules with | m :: _ -> mkSynModuleOrNamespaceSigFullRange m - | _ -> Range.Zero + | _ -> RangeHelpers.absoluteZeroRange let endPos = match List.tryLast modules with | None -> match List.tryLast directives with - | None -> Range.Zero + | None -> RangeHelpers.absoluteZeroRange | Some(ParsedHashDirective(range = r)) -> r | Some lastModule -> mkSynModuleOrNamespaceSigFullRange lastModule let astRange = unionRanges startPos endPos - includeTrivia astRange trivia.CodeComments trivia.ConditionalDirectives + includeTrivia astRange trivia let mkOak (sourceText: ISourceText option) (ast: ParsedInput) = let creationAide = { SourceText = sourceText } diff --git a/src/Fantomas.Core/CodePrinter.fs b/src/Fantomas.Core/CodePrinter.fs index 71b9ee65a5..dd54fb589a 100644 --- a/src/Fantomas.Core/CodePrinter.fs +++ b/src/Fantomas.Core/CodePrinter.fs @@ -644,34 +644,12 @@ let genExpr (e: Expr) = let genStatements = node.Statements |> List.map (function - | ComputationExpressionStatement.LetOrUseStatement node -> + | ComputationExpressionStatement.BindingStatement node -> let expr = genBinding node.Binding +> optSingle (fun inNode -> sepSpace +> genSingleTextNode inNode) node.In |> genNode node - ColMultilineItem(expr, sepNlnUnlessContentBefore node) - | ComputationExpressionStatement.LetOrUseBangStatement node -> - let expr = - genSingleTextNode node.LeadingKeyword - +> sepSpace - +> genPat node.Pattern - +> sepSpace - +> genSingleTextNode node.Equals - +> sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidthUnlessStroustrup genExpr node.Expression - |> genNode node - - ColMultilineItem(expr, sepNlnUnlessContentBefore node) - | ComputationExpressionStatement.AndBangStatement node -> - let expr = - genSingleTextNode node.LeadingKeyword - +> sepSpace - +> genPat node.Pattern - +> sepSpace - +> genSingleTextNode node.Equals - +> sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidthUnlessStroustrup genExpr node.Expression - |> genNode node - ColMultilineItem(expr, sepNlnUnlessContentBefore node) | ComputationExpressionStatement.OtherStatement e -> ColMultilineItem(genExpr e, sepNlnUnlessContentBefore (Expr.Node e))) @@ -679,7 +657,7 @@ let genExpr (e: Expr) = |> genNode node match node.Statements with - | [ ComputationExpressionStatement.LetOrUseStatement letOrUseNode + | [ ComputationExpressionStatement.BindingStatement letOrUseNode ComputationExpressionStatement.OtherStatement inExpr ] when letOrUseNode.In.IsSome -> let short = (genBinding letOrUseNode.Binding @@ -1049,9 +1027,9 @@ let genExpr (e: Expr) = let parenExpr = mkExprParenNode node.OpeningParen - (Expr.Null(SingleTextNode("", Fantomas.FCS.Text.Range.Zero))) + (Expr.Null(SingleTextNode("", Fantomas.FCS.Text.Range.range0))) node.ClosingParen - Fantomas.FCS.Text.Range.Zero + Fantomas.FCS.Text.Range.range0 sepSpaceBeforeParenInFuncInvocation node.FunctionName parenExpr | _ -> sepSpace @@ -1892,16 +1870,16 @@ let genTupleExpr (node: ExprTupleNode) = | IsLambdaOrIfThenElse e -> let parenNode = mkExprParenNode - (SingleTextNode("(", Fantomas.FCS.Text.Range.Zero)) + (SingleTextNode("(", Fantomas.FCS.Text.Range.range0)) e - (SingleTextNode(")", Fantomas.FCS.Text.Range.Zero)) - Fantomas.FCS.Text.Range.Zero + (SingleTextNode(")", Fantomas.FCS.Text.Range.range0)) + Fantomas.FCS.Text.Range.range0 ExprInfixAppNode( exprInfixAppNode.LeftHandSide, exprInfixAppNode.Operator, parenNode, - Fantomas.FCS.Text.range.Zero + Fantomas.FCS.Text.Range.range0 ) |> Expr.InfixApp | _ -> expr @@ -2240,7 +2218,7 @@ let genExprInMultilineInfixExpr (e: Expr) = node.Statements |> List.mapWithLast (function - | ComputationExpressionStatement.LetOrUseStatement _ -> true + | ComputationExpressionStatement.BindingStatement _ -> true | _ -> false) (function | ComputationExpressionStatement.OtherStatement _ -> true @@ -2255,7 +2233,7 @@ let genExprInMultilineInfixExpr (e: Expr) = ComputationExpressionStatement.Node (fun ces -> match ces with - | ComputationExpressionStatement.LetOrUseStatement letOrUseNode -> + | ComputationExpressionStatement.BindingStatement letOrUseNode -> let genIn = match letOrUseNode.In with | None -> !-"in" @@ -2626,6 +2604,14 @@ let genTuplePat (node: PatTupleNode) = atCurrentColumn (expressionFitsOnRestOfLine short (atCurrentColumn (genTuplePatLong node))) |> genNode node +let genNamePatPair (node: NamePatPairNode) = + genIdentListNode node.FieldName + +> sepSpace + +> genSingleTextNode node.Equals + +> sepSpace + +> genPat node.Pattern + |> genNode node + let genPat (p: Pattern) = match p with | Pattern.OptionalVal n -> genSingleTextNode n @@ -2654,18 +2640,11 @@ let genPat (p: Pattern) = | Pattern.As node | Pattern.ListCons node -> genPatLeftMiddleRight node | Pattern.NamePatPairs node -> - let genPatWithIdent (node: NamePatPair) = - genSingleTextNode node.Ident - +> sepSpace - +> genSingleTextNode node.Equals - +> sepSpace - +> genPat node.Pattern - |> genNode node let pats = expressionFitsOnRestOfLine - (atCurrentColumn (col sepSemi node.Pairs genPatWithIdent)) - (atCurrentColumn (col sepNln node.Pairs genPatWithIdent)) + (atCurrentColumn (col sepSemi node.Pairs genNamePatPair)) + (atCurrentColumn (col sepNln node.Pairs genNamePatPair)) genIdentListNode node.Identifier +> optSingle genTyparDecls node.TyparDecls @@ -2732,14 +2711,14 @@ let genPat (p: Pattern) = let smallRecordExpr = genSingleTextNode node.OpeningNode +> addSpaceIfSpaceAroundDelimiter - +> col sepSemi node.Fields genPatRecordFieldName + +> col sepSemi node.Fields genNamePatPair +> addSpaceIfSpaceAroundDelimiter +> genSingleTextNode node.ClosingNode let multilineRecordExpr = genSingleTextNode node.OpeningNode +> addSpaceIfSpaceAroundDelimiter - +> atCurrentColumn (col sepNln node.Fields genPatRecordFieldName) + +> atCurrentColumn (col sepNln node.Fields genNamePatPair) +> addSpaceIfSpaceAroundDelimiter +> genSingleTextNode node.ClosingNode @@ -2747,7 +2726,7 @@ let genPat (p: Pattern) = genSingleTextNode node.OpeningNode +> indent +> sepNln - +> atCurrentColumn (col sepNln node.Fields genPatRecordFieldName) + +> atCurrentColumn (col sepNln node.Fields genNamePatPair) +> unindent +> sepNln +> genSingleTextNode node.ClosingNode @@ -2790,23 +2769,6 @@ let genPatInClause (pat: Pattern) = genPatMultiline pat -let genPatRecordFieldName (node: PatRecordField) = - match node.Prefix with - | None -> - genSingleTextNode node.FieldName - +> sepSpace - +> genSingleTextNode node.Equals - +> sepSpace - +> genPat node.Pattern - | Some prefix -> - genIdentListNode prefix - +> sepDot - +> genSingleTextNode node.FieldName - +> sepSpace - +> genSingleTextNode node.Equals - +> sepSpace - +> genPat node.Pattern - let genReturnTypeBinding (node: BindingReturnInfoNode option) = match node with | None -> sepNone @@ -2831,7 +2793,7 @@ let genBinding (b: BindingNode) (ctx: Context) : Context = let isRecursiveLetOrUseFunction = match b.LeadingKeyword.Content with - | [ singleText ] -> singleText.Text = "and" + | [ singleText ] -> singleText.Text = "and" || singleText.Text = "and!" | _ -> false let binding = diff --git a/src/Fantomas.Core/RangeHelpers.fs b/src/Fantomas.Core/RangeHelpers.fs index 16f3863cd6..bacfae40bc 100644 --- a/src/Fantomas.Core/RangeHelpers.fs +++ b/src/Fantomas.Core/RangeHelpers.fs @@ -27,6 +27,9 @@ module RangeHelpers = startRange, endRange + let absoluteZeroRange = + Range.mkRange Range.range0.FileName (Position.mkPos 0 0) (Position.mkPos 0 0) + module RangePatterns = let (|StartEndRange|) (size: int) (range: range) = let o, c = RangeHelpers.mkStartEndRange size range diff --git a/src/Fantomas.Core/RangeHelpers.fsi b/src/Fantomas.Core/RangeHelpers.fsi index 36033b7534..7e156375e7 100644 --- a/src/Fantomas.Core/RangeHelpers.fsi +++ b/src/Fantomas.Core/RangeHelpers.fsi @@ -8,6 +8,9 @@ module RangeHelpers = val rangeContainsRange: a: Range -> b: Range -> bool val rangeEq: (range -> range -> bool) val isAdjacentTo: r1: Range -> r2: Range -> bool + /// Range.range0 starts at line 1, column 0 + /// This range starts at line 0, column 0 + val absoluteZeroRange: Range module RangePatterns = val (|StartEndRange|): size: int -> range: range -> range * range * range diff --git a/src/Fantomas.Core/Selection.fs b/src/Fantomas.Core/Selection.fs index 66d4ad3400..25f68136a8 100644 --- a/src/Fantomas.Core/Selection.fs +++ b/src/Fantomas.Core/Selection.fs @@ -95,7 +95,7 @@ let mkExtractableOakFromModule (md: ModuleDecl) (t: System.Type) = TreeForSelection.RequiresExtraction(Oak([], [ ModuleOrNamespaceNode(None, [ md ], m) ], m), t) let dummyUnit: Expr = - UnitNode(SingleTextNode("(", Range.Zero), SingleTextNode(")", Range.Zero), Range.Zero) + UnitNode(SingleTextNode("(", Range.range0), SingleTextNode(")", Range.range0), Range.range0) |> Constant.Unit |> Expr.Constant diff --git a/src/Fantomas.Core/SyntaxOak.fs b/src/Fantomas.Core/SyntaxOak.fs index c15dc6f0da..d0c41d7d9d 100644 --- a/src/Fantomas.Core/SyntaxOak.fs +++ b/src/Fantomas.Core/SyntaxOak.fs @@ -1,6 +1,7 @@ module rec Fantomas.Core.SyntaxOak open System.Collections.Generic +open System.Text open Fantomas.FCS.Text type TriviaContent = @@ -15,6 +16,18 @@ type TriviaNode(content: TriviaContent, range: range) = member val Content = content member val Range = range + override x.ToString() = + let rangeStr = $"range: %A{x.Range}" + + match x.Content with + | CommentOnSingleLine s -> $"CommentOnSingleLine(%s{rangeStr}, \"%s{s}\")" + | LineCommentAfterSourceCode s -> $"LineCommentAfterSourceCode(%s{rangeStr}, \"%s{s}\")" + | BlockComment(s, before, after) -> + $"BlockComment(%s{rangeStr}, \"%s{s}\", newlineBefore: %b{before}, newlineAfter: %b{after})" + | Newline -> $"Newline(%s{rangeStr})" + | Directive s -> $"Directive(%s{rangeStr}, \"%s{s}\")" + | Cursor -> $"Cursor(%s{rangeStr})" + [] type Node = abstract ContentBefore: TriviaNode seq @@ -63,6 +76,47 @@ type NodeBase(range: range) = member _.AddCursor cursor = potentialCursor <- Some cursor member _.TryGetCursor = potentialCursor + member private x.AppendToStringWithIndent(sb: StringBuilder, depth: int) = + let indent = String.replicate depth " " + let contentIndent = String.replicate (depth + 1) " " + + sb.Append(indent).Append(x.GetType().Name).Append("(").Append(x.Range) |> ignore + + let hasContentBefore = not (Seq.isEmpty x.ContentBefore) + let hasChildren = not (Array.isEmpty x.Children) + let hasContentAfter = not (Seq.isEmpty x.ContentAfter) + let hasContent = hasContentBefore || hasChildren || hasContentAfter + + if hasContent then + sb.AppendLine() |> ignore + + if hasContentBefore then + for tn in x.ContentBefore do + sb.Append(contentIndent).Append(tn.ToString()).AppendLine() |> ignore + + if hasChildren then + for n in x.Children do + match n with + | :? NodeBase as nb -> + nb.AppendToStringWithIndent(sb, depth + 1) + sb.AppendLine() |> ignore + | _ -> sb.Append(contentIndent).Append(n.ToString()).AppendLine() |> ignore + + if hasContentAfter then + for tn in x.ContentAfter do + sb.Append(contentIndent).Append(tn.ToString()).AppendLine() |> ignore + + sb.Append(indent).Append(")") |> ignore + else + sb.Append(")") |> ignore + + member private x.ToStringWithIndent(depth: int) = + let sb = StringBuilder() + x.AppendToStringWithIndent(sb, depth) + sb.ToString() + + override x.ToString() = x.ToStringWithIndent(0) + interface Node with member x.ContentBefore = x.ContentBefore member x.HasContentBefore = x.HasContentBefore @@ -91,7 +145,7 @@ let nodeRange (n: Node) = n.Range let combineRanges (ranges: range seq) = if Seq.isEmpty ranges then - Range.Zero + Range.range0 else Seq.reduce Range.unionRanges ranges @@ -111,7 +165,7 @@ type IdentListNode(content: IdentifierOrDot list, range) = inherit NodeBase(range) member val IsEmpty = content.IsEmpty member val Content = content - static member Empty = IdentListNode(List.empty, Range.Zero) + static member Empty = IdentListNode(List.empty, Range.range0) override x.Children = x.Content @@ -477,10 +531,10 @@ type PatNamedNode(accessibility: SingleTextNode option, name: SingleTextNode, ra member val Name = name member val Accessibility = accessibility -type NamePatPair(ident: SingleTextNode, equals: SingleTextNode, pat: Pattern, range) = +type NamePatPairNode(fieldName: IdentListNode, equals: SingleTextNode, pat: Pattern, range) = inherit NodeBase(range) - override val Children: Node array = [| yield ident; yield equals; yield Pattern.Node pat |] - member val Ident = ident + override val Children: Node array = [| yield fieldName; yield equals; yield Pattern.Node pat |] + member val FieldName = fieldName member val Equals = equals member val Pattern = pat @@ -489,7 +543,7 @@ type PatNamePatPairsNode identifier: IdentListNode, typarDecls: TyparDecls option, openingParen: SingleTextNode, - pairs: NamePatPair list, + pairs: NamePatPairNode list, closingParen: SingleTextNode, range ) = @@ -564,18 +618,7 @@ type PatArrayOrListNode(openToken: SingleTextNode, pats: Pattern list, closeToke member val Patterns = pats member val CloseToken = closeToken -type PatRecordField - (prefix: IdentListNode option, fieldName: SingleTextNode, equals: SingleTextNode, pat: Pattern, range) = - inherit NodeBase(range) - - override val Children: Node array = [| yield! noa prefix; yield fieldName; yield equals; yield Pattern.Node pat |] - - member val Prefix = prefix - member val FieldName = fieldName - member val Equals = equals - member val Pattern = pat - -type PatRecordNode(openingNode: SingleTextNode, fields: PatRecordField list, closingNode: SingleTextNode, range) = +type PatRecordNode(openingNode: SingleTextNode, fields: NamePatPairNode list, closingNode: SingleTextNode, range) = inherit NodeBase(range) override val Children: Node array = [| yield openingNode; yield! nodes fields; yield closingNode |] @@ -1016,32 +1059,14 @@ type ExprLetOrUseBangNode(leadingKeyword: SingleTextNode, pat: Pattern, equals: member val Equals = equals member val Expression = expr -type ExprAndBang(leadingKeyword: SingleTextNode, pat: Pattern, equals: SingleTextNode, expr: Expr, range) = - inherit NodeBase(range) - - override val Children: Node array = - [| yield leadingKeyword - yield Pattern.Node pat - yield equals - yield Expr.Node expr |] - - member val LeadingKeyword = leadingKeyword - member val Pattern = pat - member val Equals = equals - member val Expression = expr - [] type ComputationExpressionStatement = - | LetOrUseStatement of ExprLetOrUseNode - | LetOrUseBangStatement of ExprLetOrUseBangNode - | AndBangStatement of ExprAndBang + | BindingStatement of ExprLetOrUseNode | OtherStatement of Expr static member Node(ces: ComputationExpressionStatement) : Node = match ces with - | LetOrUseStatement n -> n - | LetOrUseBangStatement n -> n - | AndBangStatement n -> n + | BindingStatement n -> n | OtherStatement o -> Expr.Node o type ExprCompExprBodyNode(statements: ComputationExpressionStatement list, range) = diff --git a/src/Fantomas.Core/Trivia.fs b/src/Fantomas.Core/Trivia.fs index 8ea4141fed..eb1faafbd4 100644 --- a/src/Fantomas.Core/Trivia.fs +++ b/src/Fantomas.Core/Trivia.fs @@ -136,15 +136,21 @@ type ConditionalDirectiveTrivia with | ConditionalDirectiveTrivia.Else m | ConditionalDirectiveTrivia.EndIf m -> m -let internal collectTriviaFromDirectives +// type WarnDirectiveTrivia with + +// member x.Range = +// match x with +// | WarnDirectiveTrivia.Nowarn m +// | WarnDirectiveTrivia.Warnon m -> m + +let internal collectTriviaFromDirectiveRanges (source: ISourceText) - (directives: ConditionalDirectiveTrivia list) + (directiveRanges: range list) (codeRange: range) : TriviaNode list = - directives - |> List.filter (fun cdt -> RangeHelpers.rangeContainsRange codeRange cdt.Range) - |> List.map (fun cdt -> - let m = cdt.Range + directiveRanges + |> List.filter (RangeHelpers.rangeContainsRange codeRange) + |> List.map (fun m -> let text = (source.GetSubTextFromRange m).TrimEnd() let content = Directive text TriviaNode(content, m)) @@ -182,7 +188,6 @@ let rec visitLastChildNode (node: Node) : Node = | :? ExprLambdaNode | :? ExprLetOrUseNode | :? ExprLetOrUseBangNode - | :? ExprAndBang | :? BindingNode | :? TypeDefnEnumNode | :? TypeDefnUnionNode @@ -312,27 +317,27 @@ let addToTree (tree: Oak) (trivia: TriviaNode seq) = let enrichTree (config: FormatConfig) (sourceText: ISourceText) (ast: ParsedInput) (tree: Oak) : Oak = let fullTreeRange = tree.Range - let directives, codeComments = + let parsedTrivia = match ast with - | ParsedInput.ImplFile(ParsedImplFileInput( - trivia = { ConditionalDirectives = directives - CodeComments = codeComments })) -> directives, codeComments - | ParsedInput.SigFile(ParsedSigFileInput( - trivia = { ConditionalDirectives = directives - CodeComments = codeComments })) -> directives, codeComments + | ParsedInput.ImplFile(ParsedImplFileInput(trivia = t)) + | ParsedInput.SigFile(ParsedSigFileInput(trivia = t)) -> t let trivia = let newlines = - collectTriviaFromBlankLines config sourceText tree codeComments fullTreeRange + collectTriviaFromBlankLines config sourceText tree parsedTrivia.CodeComments fullTreeRange let comments = - match ast with - | ParsedInput.ImplFile(ParsedImplFileInput(trivia = trivia)) -> - collectTriviaFromCodeComments sourceText trivia.CodeComments fullTreeRange - | ParsedInput.SigFile(ParsedSigFileInput(trivia = trivia)) -> - collectTriviaFromCodeComments sourceText trivia.CodeComments fullTreeRange + collectTriviaFromCodeComments sourceText parsedTrivia.CodeComments fullTreeRange + + let directiveRanges = + (parsedTrivia.ConditionalDirectives |> List.map _.Range) + @ (parsedTrivia.WarnDirectives + |> List.map (function + | WarnDirectiveTrivia.Nowarn(m) + | WarnDirectiveTrivia.Warnon(m) -> m)) - let directives = collectTriviaFromDirectives sourceText directives fullTreeRange + let directives = + collectTriviaFromDirectiveRanges sourceText directiveRanges fullTreeRange [| yield! comments; yield! newlines; yield! directives |] |> Array.sortBy (fun n -> n.Range.Start.Line, n.Range.Start.Column) diff --git a/src/Fantomas.Core/packages.lock.json b/src/Fantomas.Core/packages.lock.json index 2d733dafbc..76ad1fb086 100644 --- a/src/Fantomas.Core/packages.lock.json +++ b/src/Fantomas.Core/packages.lock.json @@ -16,9 +16,9 @@ }, "FSharp.Core": { "type": "Direct", - "requested": "[8.0.100, )", - "resolved": "8.0.100", - "contentHash": "ZOVZ/o+jI3ormTZOa28Wh0tSRoyle1f7lKFcUN61sPiXI7eDZu8eSveFybgTeyIEyW0ujjp31cp7GOglDgsNEg==" + "requested": "[9.0.300, )", + "resolved": "9.0.300", + "contentHash": "TVt2J7RCE1KCS2IaONF+p8/KIZ1eHNbW+7qmKF6hGoD4tXl+o07ja1mPtFjMqRa5uHMFaTrGTPn/m945WnDLiQ==" }, "G-Research.FSharp.Analyzers": { "type": "Direct", @@ -121,7 +121,7 @@ "fantomas.fcs": { "type": "Project", "dependencies": { - "FSharp.Core": "[8.0.100, )", + "FSharp.Core": "[9.0.300, )", "System.Collections.Immutable": "[8.0.0, )", "System.Diagnostics.DiagnosticSource": "[8.0.1, )", "System.Memory": "[4.6.0, )", diff --git a/src/Fantomas.FCS/Fantomas.FCS.fsproj b/src/Fantomas.FCS/Fantomas.FCS.fsproj index dc2b8f3d4a..dbc05bc235 100644 --- a/src/Fantomas.FCS/Fantomas.FCS.fsproj +++ b/src/Fantomas.FCS/Fantomas.FCS.fsproj @@ -33,6 +33,12 @@ Utilities\Activity.fs + + Utilities\Caches.fsi + + + Utilities\Caches.fs + Utilities\sformat.fsi @@ -220,11 +226,11 @@ SyntaxTree\pplex.fsl - --module Fantomas.FCS.PPParser --open Fantomas.FCS --open Fantomas.FCS.Syntax --open Fantomas.FCS.ParseHelpers --internal --lexlib Internal.Utilities.Text.Lexing --parslib Internal.Utilities.Text.Parsing --buffer-type-argument char + --module Fantomas.FCS.PPParser --open Fantomas.FCS --open Fantomas.FCS.Syntax --open Fantomas.FCS.ParseHelpers --open Fantomas.FCS.LexerStore --internal --lexlib Internal.Utilities.Text.Lexing --parslib Internal.Utilities.Text.Parsing --buffer-type-argument char SyntaxTree\pppars.fsy - --module Fantomas.FCS.Lexer --open Fantomas.FCS.Lexhelp --open Internal.Utilities.Text.Lexing --open Fantomas.FCS.Parser --open Fantomas.FCS.Text --open Fantomas.FCS.ParseHelpers --internal --unicode --lexlib Internal.Utilities.Text.Lexing + --module Fantomas.FCS.Lexer --open Fantomas.FCS.Lexhelp --open Internal.Utilities.Text.Lexing --open Fantomas.FCS.Parser --open Fantomas.FCS.Text --open Fantomas.FCS.ParseHelpers --open Fantomas.FCS.LexerStore --internal --unicode --lexlib Internal.Utilities.Text.Lexing SyntaxTree\lex.fsl @@ -273,6 +279,18 @@ SyntaxTree\SyntaxTreeOps.fs + + SyntaxTree\WarnScopes.fsi + + + SyntaxTree\WarnScopes.fs + + + SyntaxTree\LexerStore.fsi + + + SyntaxTree\LexerStore.fs + SyntaxTree\ParseHelpers.fsi diff --git a/src/Fantomas.FCS/Parse.fs b/src/Fantomas.FCS/Parse.fs index e95dcea013..f12385f1ae 100644 --- a/src/Fantomas.FCS/Parse.fs +++ b/src/Fantomas.FCS/Parse.fs @@ -11,6 +11,7 @@ open Fantomas.FCS open Fantomas.FCS.AbstractIL.IL open Fantomas.FCS.DiagnosticsLogger open Fantomas.FCS.Features +open Fantomas.FCS.LexerStore open Fantomas.FCS.Lexhelp open Fantomas.FCS.Text open Fantomas.FCS.Text.Position @@ -153,27 +154,16 @@ let QualFileNameOfImpls filename specs = | [ SynModuleOrNamespace(kind = kind; range = m) ] when not kind.IsModule -> QualFileNameOfFilename m filename | _ -> QualFileNameOfFilename (mkRange filename pos0 pos0) filename -let GetScopedPragmasForInput input = - match input with - | ParsedInput.SigFile(ParsedSigFileInput(scopedPragmas = pragmas)) -> pragmas - | ParsedInput.ImplFile(ParsedImplFileInput(scopedPragmas = pragmas)) -> pragmas +let collectCodeComments (lexbuf: UnicodeLexing.Lexbuf) = + let tripleSlashComments = XmlDocStore.ReportInvalidXmlDocPositions lexbuf -let collectCodeComments (lexbuf: UnicodeLexing.Lexbuf) (tripleSlashComments: range list) = - [ yield! LexbufCommentStore.GetComments(lexbuf) - yield! (List.map CommentTrivia.LineComment tripleSlashComments) ] + [ yield! CommentStore.GetComments(lexbuf) + yield! List.map CommentTrivia.LineComment tripleSlashComments ] |> List.sortBy (function | CommentTrivia.LineComment r | CommentTrivia.BlockComment r -> r.StartLine, r.StartColumn) -let PostParseModuleImpls - ( - defaultNamespace, - filename, - isLastCompiland, - ParsedImplFile(hashDirectives, impls), - lexbuf: UnicodeLexing.Lexbuf, - tripleSlashComments: range list - ) = +let PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, ParsedImplFile(hashDirectives, impls), lexbuf) = match impls |> List.rev @@ -191,23 +181,13 @@ let PostParseModuleImpls let qualName = QualFileNameOfImpls filename impls let isScript = IsScript filename - let scopedPragmas = [] - let conditionalDirectives = LexbufIfdefStore.GetTrivia(lexbuf) - let codeComments = collectCodeComments lexbuf tripleSlashComments + let trivia = + { ConditionalDirectives = IfdefStore.GetTrivia(lexbuf) + WarnDirectives = WarnScopes.getDirectiveTrivia (lexbuf) + CodeComments = collectCodeComments lexbuf } ParsedInput.ImplFile( - ParsedImplFileInput( - filename, - isScript, - qualName, - scopedPragmas, - hashDirectives, - impls, - isLastCompiland, - { ConditionalDirectives = conditionalDirectives - CodeComments = codeComments }, - Set.empty - ) + ParsedImplFileInput(filename, isScript, qualName, hashDirectives, impls, isLastCompiland, trivia, Set.empty) ) let PostParseModuleSpec (_i, defaultNamespace, _isLastCompiland, filename, intf) = @@ -273,14 +253,8 @@ let PostParseModuleSpec (_i, defaultNamespace, _isLastCompiland, filename, intf) SynModuleOrNamespaceSig(lid, isRecursive, kind, decls, xmlDoc, attributes, None, range, trivia) let PostParseModuleSpecs - ( - defaultNamespace, - filename, - isLastCompiland, - ParsedSigFile(hashDirectives, specs), - lexbuf: UnicodeLexing.Lexbuf, - tripleSlashComments: range list - ) = + (defaultNamespace, filename, isLastCompiland, ParsedSigFile(hashDirectives, specs), lexbuf: UnicodeLexing.Lexbuf) + = match specs |> List.rev @@ -296,23 +270,13 @@ let PostParseModuleSpecs |> List.mapi (fun i x -> PostParseModuleSpec(i, defaultNamespace, isLastCompiland, filename, x)) let qualName = QualFileNameOfSpecs filename specs - let scopedPragmas = [] - - let conditionalDirectives = LexbufIfdefStore.GetTrivia(lexbuf) - let codeComments = collectCodeComments lexbuf tripleSlashComments - - ParsedInput.SigFile( - ParsedSigFileInput( - filename, - qualName, - scopedPragmas, - hashDirectives, - specs, - { ConditionalDirectives = conditionalDirectives - CodeComments = codeComments }, - Set.empty - ) - ) + + let trivia = + { ConditionalDirectives = IfdefStore.GetTrivia(lexbuf) + WarnDirectives = WarnScopes.getDirectiveTrivia (lexbuf) + CodeComments = collectCodeComments lexbuf } + + ParsedInput.SigFile(ParsedSigFileInput(filename, qualName, hashDirectives, specs, trivia, Set.empty)) let ParseInput ( @@ -337,38 +301,24 @@ let ParseInput use _ = UseDiagnosticsLogger delayLogger use _ = UseBuildPhase BuildPhase.Parse - let mutable scopedPragmas = [] - try - let input = - if mlCompatSuffixes |> List.exists (FileSystemUtils.checkSuffix lower) then - if lexbuf.SupportsFeature LanguageFeature.MLCompatRevisions then - errorR (Error(FSComp.SR.buildInvalidSourceFileExtensionML filename, rangeStartup)) - else - mlCompatWarning (FSComp.SR.buildCompilingExtensionIsForML ()) rangeStartup - - // Call the appropriate parser - for signature files or implementation files - if FSharpImplFileSuffixes |> List.exists (FileSystemUtils.checkSuffix lower) then - let impl = Parser.implementationFile lexer lexbuf - - let tripleSlashComments = - LexbufLocalXmlDocStore.ReportInvalidXmlDocPositions(lexbuf) - - PostParseModuleImpls(defaultNamespace, filename, isLastCompiland, impl, lexbuf, tripleSlashComments) - elif FSharpSigFileSuffixes |> List.exists (FileSystemUtils.checkSuffix lower) then - let intfs = Parser.signatureFile lexer lexbuf - - let tripleSlashComments = - LexbufLocalXmlDocStore.ReportInvalidXmlDocPositions(lexbuf) - - PostParseModuleSpecs(defaultNamespace, filename, isLastCompiland, intfs, lexbuf, tripleSlashComments) - else if lexbuf.SupportsFeature LanguageFeature.MLCompatRevisions then - error (Error(FSComp.SR.buildInvalidSourceFileExtensionUpdated filename, rangeStartup)) + if mlCompatSuffixes |> List.exists (FileSystemUtils.checkSuffix lower) then + if lexbuf.SupportsFeature LanguageFeature.MLCompatRevisions then + errorR (Error(FSComp.SR.buildInvalidSourceFileExtensionML filename, rangeStartup)) else - error (Error(FSComp.SR.buildInvalidSourceFileExtension filename, rangeStartup)) - - scopedPragmas <- GetScopedPragmasForInput input - input + mlCompatWarning (FSComp.SR.buildCompilingExtensionIsForML ()) rangeStartup + + // Call the appropriate parser - for signature files or implementation files + if FSharpImplFileSuffixes |> List.exists (FileSystemUtils.checkSuffix lower) then + let impl = Parser.implementationFile lexer lexbuf + PostParseModuleImpls(defaultNamespace, filename, isLastCompiland, impl, lexbuf) + elif FSharpSigFileSuffixes |> List.exists (FileSystemUtils.checkSuffix lower) then + let intfs = Parser.signatureFile lexer lexbuf + PostParseModuleSpecs(defaultNamespace, filename, isLastCompiland, intfs, lexbuf) + else if lexbuf.SupportsFeature LanguageFeature.MLCompatRevisions then + error (Error(FSComp.SR.buildInvalidSourceFileExtensionUpdated filename, rangeStartup)) + else + error (Error(FSComp.SR.buildInvalidSourceFileExtension filename, rangeStartup)) finally // OK, now commit the errors, since the ScopedPragmas will (hopefully) have been scraped let filteringErrorLogger = errorLogger // TODO: does this matter? //GetErrorLoggerFilteringByScopedPragmas(false, scopedPragmas, diagnosticOptions, errorLogger) @@ -379,16 +329,7 @@ let EmptyParsedInput (filename, isLastCompiland) = if FSharpSigFileSuffixes |> List.exists (FileSystemUtils.checkSuffix lower) then ParsedInput.SigFile( - ParsedSigFileInput( - filename, - QualFileNameOfImpls filename [], - [], - [], - [], - { ConditionalDirectives = [] - CodeComments = [] }, - Set.empty - ) + ParsedSigFileInput(filename, QualFileNameOfImpls filename [], [], [], ParsedInputTrivia.Empty, Set.empty) ) else ParsedInput.ImplFile( @@ -398,10 +339,8 @@ let EmptyParsedInput (filename, isLastCompiland) = QualFileNameOfImpls filename [], [], [], - [], isLastCompiland, - { ConditionalDirectives = [] - CodeComments = [] }, + ParsedInputTrivia.Empty, Set.empty ) ) diff --git a/src/Fantomas.FCS/packages.lock.json b/src/Fantomas.FCS/packages.lock.json index 2e46fd10c8..cb7006a63b 100644 --- a/src/Fantomas.FCS/packages.lock.json +++ b/src/Fantomas.FCS/packages.lock.json @@ -16,9 +16,9 @@ }, "FSharp.Core": { "type": "Direct", - "requested": "[8.0.100, )", - "resolved": "8.0.100", - "contentHash": "ZOVZ/o+jI3ormTZOa28Wh0tSRoyle1f7lKFcUN61sPiXI7eDZu8eSveFybgTeyIEyW0ujjp31cp7GOglDgsNEg==" + "requested": "[9.0.300, )", + "resolved": "9.0.300", + "contentHash": "TVt2J7RCE1KCS2IaONF+p8/KIZ1eHNbW+7qmKF6hGoD4tXl+o07ja1mPtFjMqRa5uHMFaTrGTPn/m945WnDLiQ==" }, "FsLexYacc": { "type": "Direct", diff --git a/src/Fantomas.Tests/Fantomas.Tests.fsproj b/src/Fantomas.Tests/Fantomas.Tests.fsproj index 8243c389c8..502ee6f1a0 100644 --- a/src/Fantomas.Tests/Fantomas.Tests.fsproj +++ b/src/Fantomas.Tests/Fantomas.Tests.fsproj @@ -1,7 +1,7 @@  - net8.0 + net10.0 false false FS0988 diff --git a/src/Fantomas.Tests/packages.lock.json b/src/Fantomas.Tests/packages.lock.json index 1786c3260a..f168991f53 100644 --- a/src/Fantomas.Tests/packages.lock.json +++ b/src/Fantomas.Tests/packages.lock.json @@ -1,7 +1,7 @@ { "version": 2, "dependencies": { - "net8.0": { + "net10.0": { "FsCheck": { "type": "Direct", "requested": "[2.16.5, )", @@ -13,9 +13,9 @@ }, "FSharp.Core": { "type": "Direct", - "requested": "[8.0.100, )", - "resolved": "8.0.100", - "contentHash": "ZOVZ/o+jI3ormTZOa28Wh0tSRoyle1f7lKFcUN61sPiXI7eDZu8eSveFybgTeyIEyW0ujjp31cp7GOglDgsNEg==" + "requested": "[9.0.300, )", + "resolved": "9.0.300", + "contentHash": "TVt2J7RCE1KCS2IaONF+p8/KIZ1eHNbW+7qmKF6hGoD4tXl+o07ja1mPtFjMqRa5uHMFaTrGTPn/m945WnDLiQ==" }, "FsUnit": { "type": "Direct", @@ -102,23 +102,10 @@ "resolved": "17.6.3", "contentHash": "N0ZIanl1QCgvUumEL1laasU0a7sOE5ZwLZVTn0pAePnfhq8P7SvTjF8Axq+CnavuQkmdQpGNXQ1efZtu5kDFbA==" }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "TMBuzAHpTenGbGgk0SMTwyEkyijY/Eae4ZGsFNYJvAr/LDn1ku3Etp3FPxChmDp5HHF3kzJuoaa08N0xjqAJfQ==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.3", - "contentHash": "3Wrmi0kJDzClwAC+iBdUBpEKmEle8FQNsCs77fkiOIw/9oYA07bL1EZNX0kQ2OMN3xpwvl0vAtOCYY3ndDNlhQ==" - }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", "resolved": "17.12.0", - "contentHash": "TDqkTKLfQuAaPcEb3pDDWnh7b3SyZF+/W9OZvWFp6eJCIiiYFdSB6taE2I6tWrFw5ywhzOb6sreoGJTI6m3rSQ==", - "dependencies": { - "System.Reflection.Metadata": "1.6.0" - } + "contentHash": "TDqkTKLfQuAaPcEb3pDDWnh7b3SyZF+/W9OZvWFp6eJCIiiYFdSB6taE2I6tWrFw5ywhzOb6sreoGJTI6m3rSQ==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", @@ -154,8 +141,7 @@ "contentHash": "r4G7uHHfoo8LCilPOdtf2C+Q5ymHOAXtciT4ZtB2xRlAvv4gPkWBYNAijFblStv3+uidp81j5DP11jMZl4BfJw==", "dependencies": { "Microsoft.VisualStudio.Threading": "17.10.48", - "Microsoft.VisualStudio.Validation": "17.8.8", - "System.IO.Pipelines": "8.0.0" + "Microsoft.VisualStudio.Validation": "17.8.8" } }, "System.Configuration.ConfigurationManager": { @@ -166,16 +152,6 @@ "System.Security.Cryptography.ProtectedData": "4.4.0" } }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" - }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", "resolved": "4.4.0", @@ -207,7 +183,7 @@ "type": "Project", "dependencies": { "Argu": "[6.2.4, )", - "FSharp.Core": "[8.0.100, )", + "FSharp.Core": "[9.0.300, )", "Fantomas.Client": "[1.0.0, )", "Fantomas.Core": "[1.0.0, )", "Ignore": "[0.2.1, )", @@ -224,7 +200,7 @@ "fantomas.client": { "type": "Project", "dependencies": { - "FSharp.Core": "[8.0.100, )", + "FSharp.Core": "[9.0.300, )", "SemanticVersioning": "[2.0.2, )", "StreamJsonRpc": "[2.20.20, )" } @@ -232,18 +208,14 @@ "fantomas.core": { "type": "Project", "dependencies": { - "FSharp.Core": "[8.0.100, )", + "FSharp.Core": "[9.0.300, )", "Fantomas.FCS": "[1.0.0, )" } }, "fantomas.fcs": { "type": "Project", "dependencies": { - "FSharp.Core": "[8.0.100, )", - "System.Collections.Immutable": "[8.0.0, )", - "System.Diagnostics.DiagnosticSource": "[8.0.1, )", - "System.Memory": "[4.6.0, )", - "System.Runtime": "[4.3.1, )" + "FSharp.Core": "[9.0.300, )" } }, "Argu": { @@ -321,22 +293,9 @@ "Microsoft.VisualStudio.Threading.Analyzers": "17.10.48", "Microsoft.VisualStudio.Validation": "17.8.8", "Nerdbank.Streams": "2.11.74", - "Newtonsoft.Json": "13.0.1", - "System.IO.Pipelines": "8.0.0" + "Newtonsoft.Json": "13.0.1" } }, - "System.Collections.Immutable": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.Diagnostics.DiagnosticSource": { - "type": "CentralTransitive", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "vaoWjvkG1aenR2XdjaVivlCV9fADfgyhW5bZtXT23qaEea0lWiUljdQuze4E31vKM7ZWJaSUsbYIKE3rnzfZUg==" - }, "System.IO.Abstractions": { "type": "CentralTransitive", "requested": "[21.1.3, )", @@ -347,22 +306,6 @@ "TestableIO.System.IO.Abstractions.Wrappers": "21.1.3" } }, - "System.Memory": { - "type": "CentralTransitive", - "requested": "[4.6.0, )", - "resolved": "4.6.0", - "contentHash": "OEkbBQoklHngJ8UD8ez2AERSk2g+/qpAaSWWCBFbpH727HxDq5ydVkuncBaKcKfwRqXGWx64dS6G1SUScMsitg==" - }, - "System.Runtime": { - "type": "CentralTransitive", - "requested": "[4.3.1, )", - "resolved": "4.3.1", - "contentHash": "abhfv1dTK6NXOmu4bgHIONxHyEqFjW8HwXPmpY9gmll+ix9UNo4XDcmzJn6oLooftxNssVHdJC1pGT9jkSynQg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.1", - "Microsoft.NETCore.Targets": "1.1.3" - } - }, "Thoth.Json.Net": { "type": "CentralTransitive", "requested": "[12.0.0, )", diff --git a/src/Fantomas/Fantomas.fsproj b/src/Fantomas/Fantomas.fsproj index 08a87ac2bd..cb1f9b3788 100644 --- a/src/Fantomas/Fantomas.fsproj +++ b/src/Fantomas/Fantomas.fsproj @@ -1,7 +1,7 @@ Exe - net8.0 + net10.0 en diff --git a/src/Fantomas/packages.lock.json b/src/Fantomas/packages.lock.json index 3ccde9971a..581ee2db52 100644 --- a/src/Fantomas/packages.lock.json +++ b/src/Fantomas/packages.lock.json @@ -1,7 +1,7 @@ { "version": 2, "dependencies": { - "net8.0": { + "net10.0": { "Argu": { "type": "Direct", "requested": "[6.2.4, )", @@ -32,9 +32,9 @@ }, "FSharp.Core": { "type": "Direct", - "requested": "[8.0.100, )", - "resolved": "8.0.100", - "contentHash": "ZOVZ/o+jI3ormTZOa28Wh0tSRoyle1f7lKFcUN61sPiXI7eDZu8eSveFybgTeyIEyW0ujjp31cp7GOglDgsNEg==" + "requested": "[9.0.300, )", + "resolved": "9.0.300", + "contentHash": "TVt2J7RCE1KCS2IaONF+p8/KIZ1eHNbW+7qmKF6hGoD4tXl+o07ja1mPtFjMqRa5uHMFaTrGTPn/m945WnDLiQ==" }, "G-Research.FSharp.Analyzers": { "type": "Direct", @@ -101,8 +101,7 @@ "Microsoft.VisualStudio.Threading.Analyzers": "17.10.48", "Microsoft.VisualStudio.Validation": "17.8.8", "Nerdbank.Streams": "2.11.74", - "Newtonsoft.Json": "13.0.1", - "System.IO.Pipelines": "8.0.0" + "Newtonsoft.Json": "13.0.1" } }, "System.IO.Abstractions": { @@ -158,16 +157,6 @@ "resolved": "17.6.3", "contentHash": "N0ZIanl1QCgvUumEL1laasU0a7sOE5ZwLZVTn0pAePnfhq8P7SvTjF8Axq+CnavuQkmdQpGNXQ1efZtu5kDFbA==" }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "TMBuzAHpTenGbGgk0SMTwyEkyijY/Eae4ZGsFNYJvAr/LDn1ku3Etp3FPxChmDp5HHF3kzJuoaa08N0xjqAJfQ==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.3", - "contentHash": "3Wrmi0kJDzClwAC+iBdUBpEKmEle8FQNsCs77fkiOIw/9oYA07bL1EZNX0kQ2OMN3xpwvl0vAtOCYY3ndDNlhQ==" - }, "Microsoft.SourceLink.AzureRepos.Git": { "type": "Transitive", "resolved": "1.1.1", @@ -234,8 +223,7 @@ "contentHash": "r4G7uHHfoo8LCilPOdtf2C+Q5ymHOAXtciT4ZtB2xRlAvv4gPkWBYNAijFblStv3+uidp81j5DP11jMZl4BfJw==", "dependencies": { "Microsoft.VisualStudio.Threading": "17.10.48", - "Microsoft.VisualStudio.Validation": "17.8.8", - "System.IO.Pipelines": "8.0.0" + "Microsoft.VisualStudio.Validation": "17.8.8" } }, "System.Configuration.ConfigurationManager": { @@ -246,11 +234,6 @@ "System.Security.Cryptography.ProtectedData": "4.4.0" } }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" - }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", "resolved": "4.4.0", @@ -272,7 +255,7 @@ "fantomas.client": { "type": "Project", "dependencies": { - "FSharp.Core": "[8.0.100, )", + "FSharp.Core": "[9.0.300, )", "SemanticVersioning": "[2.0.2, )", "StreamJsonRpc": "[2.20.20, )" } @@ -280,18 +263,14 @@ "fantomas.core": { "type": "Project", "dependencies": { - "FSharp.Core": "[8.0.100, )", + "FSharp.Core": "[9.0.300, )", "Fantomas.FCS": "[1.0.0, )" } }, "fantomas.fcs": { "type": "Project", "dependencies": { - "FSharp.Core": "[8.0.100, )", - "System.Collections.Immutable": "[8.0.0, )", - "System.Diagnostics.DiagnosticSource": "[8.0.1, )", - "System.Memory": "[4.6.0, )", - "System.Runtime": "[4.3.1, )" + "FSharp.Core": "[9.0.300, )" } }, "Newtonsoft.Json": { @@ -305,34 +284,6 @@ "requested": "[2.0.2, )", "resolved": "2.0.2", "contentHash": "4EQgYdNZ92SyaO7YFk6olVnebF5V+jrHyMUjvPq89tLeMo8NSfgDF+6Zwq/lgh9j/0yfQp9Lkm0ZA0rUATCZFA==" - }, - "System.Collections.Immutable": { - "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.Diagnostics.DiagnosticSource": { - "type": "CentralTransitive", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "vaoWjvkG1aenR2XdjaVivlCV9fADfgyhW5bZtXT23qaEea0lWiUljdQuze4E31vKM7ZWJaSUsbYIKE3rnzfZUg==" - }, - "System.Memory": { - "type": "CentralTransitive", - "requested": "[4.6.0, )", - "resolved": "4.6.0", - "contentHash": "OEkbBQoklHngJ8UD8ez2AERSk2g+/qpAaSWWCBFbpH727HxDq5ydVkuncBaKcKfwRqXGWx64dS6G1SUScMsitg==" - }, - "System.Runtime": { - "type": "CentralTransitive", - "requested": "[4.3.1, )", - "resolved": "4.3.1", - "contentHash": "abhfv1dTK6NXOmu4bgHIONxHyEqFjW8HwXPmpY9gmll+ix9UNo4XDcmzJn6oLooftxNssVHdJC1pGT9jkSynQg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.1", - "Microsoft.NETCore.Targets": "1.1.3" - } } } }