diff --git a/src/Compiler/Facilities/AsyncMemoize.fs b/src/Compiler/Facilities/AsyncMemoize.fs index d6ae83ada6e..7e6bed533e9 100644 --- a/src/Compiler/Facilities/AsyncMemoize.fs +++ b/src/Compiler/Facilities/AsyncMemoize.fs @@ -551,6 +551,8 @@ type internal AsyncMemoize<'TKey, 'TVersion, 'TValue when 'TKey: equality and 'T member this.OnEvent = this.Event.Add + member this.Count = cache.Count + member _.Locked = lock.Semaphore.CurrentCount < 1 member _.Running = diff --git a/src/Compiler/Facilities/AsyncMemoize.fsi b/src/Compiler/Facilities/AsyncMemoize.fsi index 1cce68cf999..9c317749464 100644 --- a/src/Compiler/Facilities/AsyncMemoize.fsi +++ b/src/Compiler/Facilities/AsyncMemoize.fsi @@ -75,6 +75,8 @@ type internal AsyncMemoize<'TKey, 'TVersion, 'TValue when 'TKey: equality and 'T member OnEvent: ((JobEvent * (string * 'TKey * 'TVersion) -> unit) -> unit) + member Count: int + /// A drop-in replacement for AsyncMemoize that disables caching and just runs the computation every time. type internal AsyncMemoizeDisabled<'TKey, 'TVersion, 'TValue when 'TKey: equality and 'TVersion: equality> = diff --git a/src/Compiler/Service/TransparentCompiler.fs b/src/Compiler/Service/TransparentCompiler.fs index f13b7be6d69..953c7c5dd6e 100644 --- a/src/Compiler/Service/TransparentCompiler.fs +++ b/src/Compiler/Service/TransparentCompiler.fs @@ -2151,19 +2151,27 @@ type internal TransparentCompiler optionsStamp: int64 option, userOpName: string ) : Async = - backgroundCompiler.GetProjectOptionsFromScript( - fileName, - sourceText, - previewEnabled, - loadedTimeStamp, - otherFlags, - useFsiAuxLib, - useSdkRefs, - sdkDirOverride, - assumeDotNetFramework, - optionsStamp, - userOpName - ) + async { + let bc = this :> IBackgroundCompiler + + let! snapshot, diagnostics = + bc.GetProjectSnapshotFromScript( + fileName, + SourceTextNew.ofISourceText sourceText, + previewEnabled, + loadedTimeStamp, + otherFlags, + useFsiAuxLib, + useSdkRefs, + sdkDirOverride, + assumeDotNetFramework, + optionsStamp, + userOpName + ) + + let projectOptions = snapshot.ToOptions() + return projectOptions, diagnostics + } member this.GetProjectSnapshotFromScript ( diff --git a/src/Compiler/Utilities/LruCache.fs b/src/Compiler/Utilities/LruCache.fs index 7b06292c2e2..62abc1d829c 100644 --- a/src/Compiler/Utilities/LruCache.fs +++ b/src/Compiler/Utilities/LruCache.fs @@ -277,3 +277,5 @@ type internal LruCache<'TKey, 'TVersion, 'TValue when 'TKey: equality and 'TVers match w.TryGetTarget() with | true, value -> Some(label, version, value) | _ -> None) + + member this.Count = Seq.length (this.GetValues()) diff --git a/src/Compiler/Utilities/LruCache.fsi b/src/Compiler/Utilities/LruCache.fsi index eb2880047d7..d4d4d5ea83f 100644 --- a/src/Compiler/Utilities/LruCache.fsi +++ b/src/Compiler/Utilities/LruCache.fsi @@ -38,6 +38,9 @@ type internal LruCache<'TKey, 'TVersion, 'TValue when 'TKey: equality and 'TVers member GetValues: unit -> (string * 'TVersion * 'TValue) seq + /// Gets the number of items in the cache + member Count: int + member Remove: key: 'TKey -> unit member Remove: key: 'TKey * version: 'TVersion -> unit diff --git a/tests/FSharp.Compiler.ComponentTests/FSharpChecker/TransparentCompiler.fs b/tests/FSharp.Compiler.ComponentTests/FSharpChecker/TransparentCompiler.fs index 7e78cda1704..476adb99c5d 100644 --- a/tests/FSharp.Compiler.ComponentTests/FSharpChecker/TransparentCompiler.fs +++ b/tests/FSharp.Compiler.ComponentTests/FSharpChecker/TransparentCompiler.fs @@ -1011,3 +1011,13 @@ printfn "Hello from F#" ProjectWorkflowBuilder(project, useTransparentCompiler = useTransparentCompiler) { checkFile "As 01" expectTwoWarnings } + +[] +let ``Transparent Compiler ScriptClosure cache is populated after GetProjectOptionsFromScript`` () = + async { + let transparentChecker = FSharpChecker.Create(useTransparentCompiler = true) + let scriptName = Path.Combine(__SOURCE_DIRECTORY__, "script.fsx") + let content = SourceTextNew.ofString "" + let! _ = transparentChecker.GetProjectOptionsFromScript(scriptName, content) + Assert.Equal(1, transparentChecker.Caches.ScriptClosure.Count) + }