From b61c67155876a3db1324646c7a0c14ab19934a7e Mon Sep 17 00:00:00 2001 From: Andrii Chebukin Date: Sun, 6 Sep 2026 06:07:23 +0200 Subject: [PATCH 1/3] Let FromOptions take reference stamps from the host FSharpProjectSnapshot.FromOptions stats every -r: reference each time a snapshot is built from options; under the transparent compiler in Visual Studio that is every from-scratch snapshot after an options recompute. A host that already tracks the last-write times of its references can pass getReferenceStamp instead; the default stays FileSystem.GetLastWriteTimeShim. The callback is threaded through the recursive call for referenced F# projects. Co-Authored-By: Claude Fable 5.1 --- .../.FSharp.Compiler.Service/11.0.100.md | 1 + src/Compiler/Service/FSharpProjectSnapshot.fs | 10 +- .../FSharpChecker/ProjectSnapshot.fs | 155 +++++++----------- ...iler.Service.SurfaceArea.netstandard20.bsl | 2 +- 4 files changed, 65 insertions(+), 103 deletions(-) diff --git a/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md b/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md index f383908e195..0bf6afa9491 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md +++ b/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md @@ -209,6 +209,7 @@ * IL: fix the per-reader string cache sizing ([PR #20261](https://github.com/dotnet/fsharp/pull/20261)) * Name resolution: group C#-style extension members per `open` and extended type ([PR #20298](https://github.com/dotnet/fsharp/pull/20298)) * Symbols: add `FSharpDisplayContext.WithNullnessAnnotations` ([PR #20507](https://github.com/dotnet/fsharp/pull/20507)) +* `FSharpProjectSnapshot.FromOptions` takes an optional `getReferenceStamp: string -> DateTime`, so a host that already tracks the last-write times of on-disk references can supply them instead of having every `-r:` stat'd again each time a snapshot is built. ([PR #20459](https://github.com/dotnet/fsharp/pull/20459)) ### Improved diff --git a/src/Compiler/Service/FSharpProjectSnapshot.fs b/src/Compiler/Service/FSharpProjectSnapshot.fs index 02c368e7f46..19b61c1c423 100644 --- a/src/Compiler/Service/FSharpProjectSnapshot.fs +++ b/src/Compiler/Service/FSharpProjectSnapshot.fs @@ -647,8 +647,11 @@ and [] FSha ProjectSnapshotBase(projectConfig, referencedProjects, sourceFiles) |> FSharpProjectSnapshot - static member FromOptions(options: FSharpProjectOptions, getFileSnapshot, ?snapshotAccumulator) = + static member FromOptions + (options: FSharpProjectOptions, getFileSnapshot, ?snapshotAccumulator, ?getReferenceStamp: string -> DateTime) + = let snapshotAccumulator = defaultArg snapshotAccumulator (Dictionary()) + let getReferenceStamp = defaultArg getReferenceStamp FileSystem.GetLastWriteTimeShim async { @@ -665,7 +668,8 @@ and [] FSha |> Seq.map (function | FSharpReferencedProject.FSharpReference(outputName, options) -> async { - let! snapshot = FSharpProjectSnapshot.FromOptions(options, getFileSnapshot, snapshotAccumulator) + let! snapshot = + FSharpProjectSnapshot.FromOptions(options, getFileSnapshot, snapshotAccumulator, getReferenceStamp) return FSharpReferencedProjectSnapshot.FSharpReference(outputName, snapshot) } @@ -686,7 +690,7 @@ and [] FSha { Path = path - LastModified = FileSystem.GetLastWriteTimeShim(path) + LastModified = getReferenceStamp path }) ) diff --git a/tests/FSharp.Compiler.ComponentTests/FSharpChecker/ProjectSnapshot.fs b/tests/FSharp.Compiler.ComponentTests/FSharpChecker/ProjectSnapshot.fs index 90e28cc63ac..900b8aa04b0 100644 --- a/tests/FSharp.Compiler.ComponentTests/FSharpChecker/ProjectSnapshot.fs +++ b/tests/FSharp.Compiler.ComponentTests/FSharpChecker/ProjectSnapshot.fs @@ -1,104 +1,61 @@ module FSharpChecker.ProjectSnapshot -open Xunit open System +open System.IO +open System.Threading.Tasks +open FSharp.Compiler.CodeAnalysis open FSharp.Compiler.CodeAnalysis.ProjectSnapshot +open Xunit - -// TODO: restore tests - -//[] -//let WithoutImplFilesThatHaveSignatures () = - -// let snapshot = FSharpProjectSnapshot.Create( -// projectFileName = "Dummy.fsproj", -// projectId = None, -// sourceFiles = [ -// { FileName = "A.fsi"; Version = "1"; GetSource = Unchecked.defaultof<_> } -// { FileName = "A.fs"; Version = "1"; GetSource = Unchecked.defaultof<_> } -// { FileName = "B.fs"; Version = "1"; GetSource = Unchecked.defaultof<_> } -// { FileName = "C.fsi"; Version = "1"; GetSource = Unchecked.defaultof<_> } -// { FileName = "C.fs"; Version = "1"; GetSource = Unchecked.defaultof<_> } -// ], -// referencesOnDisk = [], -// otherOptions = [], -// referencedProjects = [], -// isIncompleteTypeCheckEnvironment = true, -// useScriptResolutionRules = false, -// loadTime = DateTime(1234, 5, 6), -// unresolvedReferences = None, -// originalLoadReferences = [], -// stamp = None -// ) - -// let result = snapshot.WithoutImplFilesThatHaveSignatures - -// let expected = [| "A.fsi"; "B.fs"; "C.fsi" |] - -// Assert.Equal(expected, result.SourceFileNames |> List.toArray) - -// Assert.Equal(result.FullVersion, snapshot.SignatureVersion) - -//[] -//let WithoutImplFilesThatHaveSignaturesExceptLastOne () = - -// let snapshot = FSharpProjectSnapshot.Create( -// projectFileName = "Dummy.fsproj", -// projectId = None, -// sourceFiles = [ -// { FileName = "A.fsi"; Version = "1"; GetSource = Unchecked.defaultof<_> } -// { FileName = "A.fs"; Version = "1"; GetSource = Unchecked.defaultof<_> } -// { FileName = "B.fs"; Version = "1"; GetSource = Unchecked.defaultof<_> } -// { FileName = "C.fsi"; Version = "1"; GetSource = Unchecked.defaultof<_> } -// { FileName = "C.fs"; Version = "1"; GetSource = Unchecked.defaultof<_> } -// ], -// referencesOnDisk = [], -// otherOptions = [], -// referencedProjects = [], -// isIncompleteTypeCheckEnvironment = true, -// useScriptResolutionRules = false, -// loadTime = DateTime(1234, 5, 6), -// unresolvedReferences = None, -// originalLoadReferences = [], -// stamp = None -// ) - -// let result = snapshot.WithoutImplFilesThatHaveSignaturesExceptLastOne - -// let expected = [| "A.fsi"; "B.fs"; "C.fsi"; "C.fs" |] - -// Assert.Equal(expected, result.SourceFileNames |> List.toArray) - -// Assert.Equal(result.FullVersion, snapshot.LastFileVersion) - - -//[] -//let WithoutImplFilesThatHaveSignaturesExceptLastOne_2 () = - -// let snapshot = FSharpProjectSnapshot.Create( -// projectFileName = "Dummy.fsproj", -// projectId = None, -// sourceFiles = [ -// { FileName = "A.fs"; Version = "1"; GetSource = Unchecked.defaultof<_> } -// { FileName = "B.fs"; Version = "1"; GetSource = Unchecked.defaultof<_> } -// { FileName = "C.fs"; Version = "1"; GetSource = Unchecked.defaultof<_> } -// ], -// referencesOnDisk = [], -// otherOptions = [], -// referencedProjects = [], -// isIncompleteTypeCheckEnvironment = true, -// useScriptResolutionRules = false, -// loadTime = DateTime(1234, 5, 6), -// unresolvedReferences = None, -// originalLoadReferences = [], -// stamp = None -// ) - -// let result = snapshot.WithoutImplFilesThatHaveSignaturesExceptLastOne - -// let expected = [| "A.fs"; "B.fs"; "C.fs" |] - -// Assert.Equal(expected, result.SourceFileNames |> List.toArray) - -// Assert.Equal(result.FullVersion, snapshot.LastFileVersion) - +#nowarn "57" + +let private projectOptions projectFileName references referencedProjects = + { + ProjectFileName = projectFileName + ProjectId = None + SourceFiles = [| Path.ChangeExtension(projectFileName, ".fs") |] + OtherOptions = [| for path in references -> $"-r:{path}" |] + ReferencedProjects = referencedProjects + IsIncompleteTypeCheckEnvironment = false + UseScriptResolutionRules = false + LoadTime = DateTime.UtcNow + UnresolvedReferences = None + OriginalLoadReferences = [] + Stamp = None + } + +let private emptySource _ path = + async { return FSharpFileSnapshot.CreateFromString(path, "") } + +[] +let ``FromOptions takes reference stamps from the host, including referenced projects`` () : Task = + task { + let stamps = + dict + [ + "MainRef.dll", DateTime(2026, 1, 1, 0, 0, 0, DateTimeKind.Utc) + "LibRef.dll", DateTime(2026, 2, 2, 0, 0, 0, DateTimeKind.Utc) + ] + + let lib = projectOptions "Lib.fsproj" [ "LibRef.dll" ] [||] + + let main = + projectOptions "Main.fsproj" [ "MainRef.dll" ] [| FSharpReferencedProject.FSharpReference("Lib.dll", lib) |] + + let! snapshot = FSharpProjectSnapshot.FromOptions(main, emptySource, getReferenceStamp = (fun path -> stamps[path])) + + let libSnapshot = + match snapshot.ReferencedProjects with + | [ FSharpReferencedProjectSnapshot.FSharpReference(_, lib) ] -> lib + | other -> failwith $"Expected one referenced project, got %A{other}" + + Assert.Equal( + [ { Path = "MainRef.dll"; LastModified = stamps["MainRef.dll"] } ], + snapshot.ReferencesOnDisk + ) + + Assert.Equal( + [ { Path = "LibRef.dll"; LastModified = stamps["LibRef.dll"] } ], + libSnapshot.ReferencesOnDisk + ) + } diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.bsl index bce0bc86e9b..8ce374cb556 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.bsl @@ -2505,7 +2505,7 @@ FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FS FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`3[FSharp.Compiler.Text.Range,System.String,System.String]] OriginalLoadReferences FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`3[FSharp.Compiler.Text.Range,System.String,System.String]] get_OriginalLoadReferences() FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Control.FSharpAsync`1[FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot] FromOptions(FSharp.Compiler.CodeAnalysis.FSharpProjectOptions, FSharp.Compiler.CodeAnalysis.DocumentSource) -FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Control.FSharpAsync`1[FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot] FromOptions(FSharp.Compiler.CodeAnalysis.FSharpProjectOptions, Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.CodeAnalysis.FSharpProjectOptions,Microsoft.FSharp.Core.FSharpFunc`2[System.String,Microsoft.FSharp.Control.FSharpAsync`1[FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpFileSnapshot]]], Microsoft.FSharp.Core.FSharpOption`1[System.Collections.Generic.Dictionary`2[FSharp.Compiler.CodeAnalysis.FSharpProjectOptions,FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot]]) +FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Control.FSharpAsync`1[FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot] FromOptions(FSharp.Compiler.CodeAnalysis.FSharpProjectOptions, Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.CodeAnalysis.FSharpProjectOptions,Microsoft.FSharp.Core.FSharpFunc`2[System.String,Microsoft.FSharp.Control.FSharpAsync`1[FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpFileSnapshot]]], Microsoft.FSharp.Core.FSharpOption`1[System.Collections.Generic.Dictionary`2[FSharp.Compiler.CodeAnalysis.FSharpProjectOptions,FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot]], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpFunc`2[System.String,System.DateTime]]) FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Control.FSharpAsync`1[FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot] FromOptions(FSharp.Compiler.CodeAnalysis.FSharpProjectOptions, System.String, Int32, FSharp.Compiler.Text.ISourceText, FSharp.Compiler.CodeAnalysis.DocumentSource) FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.FSharpUnresolvedReferencesSet] UnresolvedReferences FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.FSharpUnresolvedReferencesSet] get_UnresolvedReferences() From 4e630f6ae9f27ec44179bd0e86d3a133c4e971ce Mon Sep 17 00:00:00 2001 From: XperiAndri Date: Sat, 26 Sep 2026 13:47:25 +0200 Subject: [PATCH 2/3] Move the release note to the version in development `main` opened 11.0.200 for SDK 11.0.200; 11.0.100 has shipped. Co-Authored-By: Claude Opus 5 (1M context) --- docs/release-notes/.FSharp.Compiler.Service/11.0.100.md | 1 - docs/release-notes/.FSharp.Compiler.Service/11.0.200.md | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md b/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md index 0bf6afa9491..f383908e195 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md +++ b/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md @@ -209,7 +209,6 @@ * IL: fix the per-reader string cache sizing ([PR #20261](https://github.com/dotnet/fsharp/pull/20261)) * Name resolution: group C#-style extension members per `open` and extended type ([PR #20298](https://github.com/dotnet/fsharp/pull/20298)) * Symbols: add `FSharpDisplayContext.WithNullnessAnnotations` ([PR #20507](https://github.com/dotnet/fsharp/pull/20507)) -* `FSharpProjectSnapshot.FromOptions` takes an optional `getReferenceStamp: string -> DateTime`, so a host that already tracks the last-write times of on-disk references can supply them instead of having every `-r:` stat'd again each time a snapshot is built. ([PR #20459](https://github.com/dotnet/fsharp/pull/20459)) ### Improved diff --git a/docs/release-notes/.FSharp.Compiler.Service/11.0.200.md b/docs/release-notes/.FSharp.Compiler.Service/11.0.200.md index 6212188b65f..04aebd513b6 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/11.0.200.md +++ b/docs/release-notes/.FSharp.Compiler.Service/11.0.200.md @@ -1,5 +1,6 @@ ### Added +* `FSharpProjectSnapshot.FromOptions` takes an optional `getReferenceStamp: string -> DateTime`, so a host that already tracks the last-write times of on-disk references can supply them instead of having every `-r:` stat'd again each time a snapshot is built. ([PR #20459](https://github.com/dotnet/fsharp/pull/20459)) * F# Interactive gains a JSON-RPC server mode, `--fsi-server-jsonrpc:`, in which a host submits interactions over a named pipe and receives structured results — diagnostics with positions, escaping exceptions, the values each interaction bound, and the session's own process id — instead of recovering them by looking for a `SERVER-PROMPT>` marker in the output text. Program output continues to flow through the redirected console streams. The pipe admits only the user running the session; `--fsi-server-client-pid:` names the host process whose exit ends the session. `FsiEvaluationSession` exposes both options as `JsonRpcServerPipeName` and `JsonRpcClientProcessId`. The mode is part of the .NET fsi only. ([PR #20396](https://github.com/dotnet/fsharp/pull/20396)) ### Fixed From ab9604d250e2e45837f37223983d212e4fd266cf Mon Sep 17 00:00:00 2001 From: XperiAndri Date: Sat, 26 Sep 2026 14:22:23 +0200 Subject: [PATCH 3/3] Leave FromOptions as it was and name the host's entry point An optional parameter is part of the CLR signature, so adding one replaced `FromOptions` rather than extending it: an already-built consumer would have found no such method. The three overloads are back as they were, the work moved to a private implementation, and a host that tracks its references calls `FromOptionsWithReferenceStamps`. Co-Authored-By: Claude Opus 5 (1M context) --- src/Compiler/Service/FSharpProjectSnapshot.fs | 36 +++++++++++++++---- .../FSharpChecker/ProjectSnapshot.fs | 2 +- ...iler.Service.SurfaceArea.netstandard20.bsl | 3 +- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/Compiler/Service/FSharpProjectSnapshot.fs b/src/Compiler/Service/FSharpProjectSnapshot.fs index 19b61c1c423..483d3f070e0 100644 --- a/src/Compiler/Service/FSharpProjectSnapshot.fs +++ b/src/Compiler/Service/FSharpProjectSnapshot.fs @@ -647,12 +647,13 @@ and [] FSha ProjectSnapshotBase(projectConfig, referencedProjects, sourceFiles) |> FSharpProjectSnapshot - static member FromOptions - (options: FSharpProjectOptions, getFileSnapshot, ?snapshotAccumulator, ?getReferenceStamp: string -> DateTime) - = - let snapshotAccumulator = defaultArg snapshotAccumulator (Dictionary()) - let getReferenceStamp = defaultArg getReferenceStamp FileSystem.GetLastWriteTimeShim - + static member private SnapshotOfOptions + ( + options: FSharpProjectOptions, + getFileSnapshot, + snapshotAccumulator: Dictionary, + getReferenceStamp: string -> DateTime + ) = async { // TODO: check if options is a good key here @@ -669,7 +670,12 @@ and [] FSha | FSharpReferencedProject.FSharpReference(outputName, options) -> async { let! snapshot = - FSharpProjectSnapshot.FromOptions(options, getFileSnapshot, snapshotAccumulator, getReferenceStamp) + FSharpProjectSnapshot.SnapshotOfOptions( + options, + getFileSnapshot, + snapshotAccumulator, + getReferenceStamp + ) return FSharpReferencedProjectSnapshot.FSharpReference(outputName, snapshot) } @@ -716,6 +722,22 @@ and [] FSha return snapshotAccumulator[options] } + static member FromOptions(options: FSharpProjectOptions, getFileSnapshot, ?snapshotAccumulator) = + FSharpProjectSnapshot.SnapshotOfOptions( + options, + getFileSnapshot, + defaultArg snapshotAccumulator (Dictionary()), + FileSystem.GetLastWriteTimeShim + ) + + /// The snapshot `FromOptions` builds, with the last-modified time of every reference on disk answered by + /// the host rather than read from the file system: a host that already tracks those files - as an IDE + /// watching them does - knows the time without a call per reference per snapshot. + static member FromOptionsWithReferenceStamps + (options: FSharpProjectOptions, getFileSnapshot, getReferenceStamp: string -> DateTime, ?snapshotAccumulator) + = + FSharpProjectSnapshot.SnapshotOfOptions(options, getFileSnapshot, defaultArg snapshotAccumulator (Dictionary()), getReferenceStamp) + static member FromOptions(options: FSharpProjectOptions, documentSource: DocumentSource) = FSharpProjectSnapshot.FromOptions( options, diff --git a/tests/FSharp.Compiler.ComponentTests/FSharpChecker/ProjectSnapshot.fs b/tests/FSharp.Compiler.ComponentTests/FSharpChecker/ProjectSnapshot.fs index 900b8aa04b0..238fad2b3d6 100644 --- a/tests/FSharp.Compiler.ComponentTests/FSharpChecker/ProjectSnapshot.fs +++ b/tests/FSharp.Compiler.ComponentTests/FSharpChecker/ProjectSnapshot.fs @@ -42,7 +42,7 @@ let ``FromOptions takes reference stamps from the host, including referenced pro let main = projectOptions "Main.fsproj" [ "MainRef.dll" ] [| FSharpReferencedProject.FSharpReference("Lib.dll", lib) |] - let! snapshot = FSharpProjectSnapshot.FromOptions(main, emptySource, getReferenceStamp = (fun path -> stamps[path])) + let! snapshot = FSharpProjectSnapshot.FromOptionsWithReferenceStamps(main, emptySource, (fun path -> stamps[path])) let libSnapshot = match snapshot.ReferencedProjects with diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.bsl index 8ce374cb556..0b0c9f21b77 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.bsl @@ -2505,8 +2505,9 @@ FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FS FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`3[FSharp.Compiler.Text.Range,System.String,System.String]] OriginalLoadReferences FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`3[FSharp.Compiler.Text.Range,System.String,System.String]] get_OriginalLoadReferences() FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Control.FSharpAsync`1[FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot] FromOptions(FSharp.Compiler.CodeAnalysis.FSharpProjectOptions, FSharp.Compiler.CodeAnalysis.DocumentSource) -FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Control.FSharpAsync`1[FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot] FromOptions(FSharp.Compiler.CodeAnalysis.FSharpProjectOptions, Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.CodeAnalysis.FSharpProjectOptions,Microsoft.FSharp.Core.FSharpFunc`2[System.String,Microsoft.FSharp.Control.FSharpAsync`1[FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpFileSnapshot]]], Microsoft.FSharp.Core.FSharpOption`1[System.Collections.Generic.Dictionary`2[FSharp.Compiler.CodeAnalysis.FSharpProjectOptions,FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot]], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpFunc`2[System.String,System.DateTime]]) +FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Control.FSharpAsync`1[FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot] FromOptions(FSharp.Compiler.CodeAnalysis.FSharpProjectOptions, Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.CodeAnalysis.FSharpProjectOptions,Microsoft.FSharp.Core.FSharpFunc`2[System.String,Microsoft.FSharp.Control.FSharpAsync`1[FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpFileSnapshot]]], Microsoft.FSharp.Core.FSharpOption`1[System.Collections.Generic.Dictionary`2[FSharp.Compiler.CodeAnalysis.FSharpProjectOptions,FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot]]) FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Control.FSharpAsync`1[FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot] FromOptions(FSharp.Compiler.CodeAnalysis.FSharpProjectOptions, System.String, Int32, FSharp.Compiler.Text.ISourceText, FSharp.Compiler.CodeAnalysis.DocumentSource) +FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Control.FSharpAsync`1[FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot] FromOptionsWithReferenceStamps(FSharp.Compiler.CodeAnalysis.FSharpProjectOptions, Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.CodeAnalysis.FSharpProjectOptions,Microsoft.FSharp.Core.FSharpFunc`2[System.String,Microsoft.FSharp.Control.FSharpAsync`1[FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpFileSnapshot]]], Microsoft.FSharp.Core.FSharpFunc`2[System.String,System.DateTime], Microsoft.FSharp.Core.FSharpOption`1[System.Collections.Generic.Dictionary`2[FSharp.Compiler.CodeAnalysis.FSharpProjectOptions,FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot]]) FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.FSharpUnresolvedReferencesSet] UnresolvedReferences FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.FSharpUnresolvedReferencesSet] get_UnresolvedReferences() FSharp.Compiler.CodeAnalysis.ProjectSnapshot+FSharpProjectSnapshot: Microsoft.FSharp.Core.FSharpOption`1[System.Int64] Stamp