Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a version of TryGetRecentCheckResultsForFile with project snapshot #16720

Merged
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
a684cf7
First stab at adding a version of TryGetRecentCheckResultsForFile tha…
dawedawe Feb 15, 2024
d7c9258
use version type without defaultof<_> = null
dawedawe Feb 16, 2024
cdcff87
take sourcetext out of project snapshot, kind of forces us to an asyn…
dawedawe Feb 16, 2024
0672b64
format
dawedawe Feb 16, 2024
0a13fa5
- reuse ParseAndCheckFileInProject cache for TryGetRecentCheckResults…
dawedawe Feb 17, 2024
fa6cfd4
format
dawedawe Feb 17, 2024
37c2d74
merge main
dawedawe Feb 17, 2024
d98542e
cleanup
dawedawe Feb 17, 2024
516ab7c
use a new LruCache member GetAll to get rid of the dummy version
dawedawe Feb 19, 2024
9d735a4
cleanup
dawedawe Feb 19, 2024
c089ed4
Merge branch 'main' into add_trygetrecentcheckresultsforfile_with_sna…
dawedawe Feb 19, 2024
a5687aa
Merge branch 'main' into add_trygetrecentcheckresultsforfile_with_sna…
dawedawe Feb 19, 2024
7d6a643
Update src/Compiler/Service/TransparentCompiler.fs
dawedawe Feb 19, 2024
c7cc1b2
unify key creation
dawedawe Feb 19, 2024
52bd57a
just use ProjectSnapShot.FileKey
dawedawe Feb 19, 2024
60a2a83
to have it on record, push a version with "f.Version |> Md5Hasher.toS…
dawedawe Feb 20, 2024
aadb0be
use FileKeyWithExtraFileSnapshotVersion for the ParseAndCheckFileInPr…
dawedawe Feb 20, 2024
c85b5f0
replace FileSnapShot after edit in Test
dawedawe Feb 21, 2024
1d29a2d
add CustomOperation tryGetRecentCheckResults for tests
dawedawe Feb 21, 2024
3e18bf8
Merge branch 'main' into add_trygetrecentcheckresultsforfile_with_sna…
dawedawe Feb 21, 2024
846e07a
- Make API non-async and don't return hash
dawedawe Feb 21, 2024
fa3844f
better fix for commandLineOptions order
dawedawe Feb 21, 2024
ec88310
Update src/Compiler/Service/FSharpProjectSnapshot.fs
dawedawe Feb 21, 2024
96c43b2
Update tests/FSharp.Compiler.ComponentTests/FSharpChecker/Transparent…
dawedawe Feb 21, 2024
fafa846
Update tests/FSharp.Compiler.ComponentTests/FSharpChecker/Transparent…
dawedawe Feb 21, 2024
c4e8ccf
fix version predicate
dawedawe Feb 21, 2024
acb7bf2
let LruCache.GetAll(key: 'TKey) return a seq instead of a list
dawedawe Feb 22, 2024
9f6e7fa
compare signatures in CustomOperation tryGetRecentCheckResults to tig…
dawedawe Feb 23, 2024
0dcdfc3
Merge branch 'main' into add_trygetrecentcheckresultsforfile_with_sna…
dawedawe Feb 23, 2024
c72df2b
kick the CI
dawedawe Feb 23, 2024
23e1704
Revert "kick the CI"
dawedawe Feb 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/Compiler/Facilities/AsyncMemoize.fs
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,15 @@ type internal AsyncMemoize<'TKey, 'TVersion, 'TValue when 'TKey: equality and 'T

}

member _.TryGet(key: 'TKey, predicate: 'TVersion -> bool) : 'TValue option =
let versionsAndJobs = cache.GetAll(key)

versionsAndJobs
|> Seq.tryPick (fun (version, job) ->
match predicate version, job with
| true, Completed(completed, _) -> Some completed
| _ -> None)

member _.Clear() = cache.Clear()

member _.Clear predicate = cache.Clear predicate
Expand Down
2 changes: 2 additions & 0 deletions src/Compiler/Facilities/AsyncMemoize.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ type internal AsyncMemoize<'TKey, 'TVersion, 'TValue when 'TKey: equality and 'T

member Get': key: 'TKey * computation: NodeCode<'TValue> -> NodeCode<'TValue>

member TryGet: key: 'TKey * predicate: ('TVersion -> bool) -> 'TValue option

member Event: IEvent<JobEvent * (string * 'TKey * 'TVersion)>

member OnEvent: ((JobEvent * (string * 'TKey * 'TVersion) -> unit) -> unit)
Expand Down
22 changes: 22 additions & 0 deletions src/Compiler/Service/BackgroundCompiler.fs
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,10 @@ type internal IBackgroundCompiler =
fileName: string * options: FSharpProjectOptions * sourceText: ISourceText option * userOpName: string ->
(FSharpParseFileResults * FSharpCheckFileResults * SourceTextHash) option

abstract member TryGetRecentCheckResultsForFile:
fileName: string * projectSnapshot: FSharpProjectSnapshot * userOpName: string ->
(FSharpParseFileResults * FSharpCheckFileResults) option

abstract member BeforeBackgroundFileCheck: IEvent<string * FSharpProjectOptions>

abstract member FileChecked: IEvent<string * FSharpProjectOptions>
Expand Down Expand Up @@ -1160,6 +1164,16 @@ type internal BackgroundCompiler
| None -> None
| None -> None

member _.TryGetRecentCheckResultsForFile(fileName: string, projectSnapshot: FSharpProjectSnapshot, userOpName: string) =
projectSnapshot.ProjectSnapshot.SourceFiles
|> List.tryFind (fun f -> f.FileName = fileName)
|> Option.bind (fun (f: FSharpFileSnapshot) ->
let options = projectSnapshot.ToOptions()
let sourceText = f.GetSource() |> Async.AwaitTask |> Async.RunSynchronously

self.TryGetRecentCheckResultsForFile(fileName, options, Some sourceText, userOpName)
|> Option.map (fun (parseFileResults, checkFileResults, _hash) -> (parseFileResults, checkFileResults)))

/// Parse and typecheck the whole project (the implementation, called recursively as project graph is evaluated)
member private _.ParseAndCheckProjectImpl(options, userOpName) =
node {
Expand Down Expand Up @@ -1684,3 +1698,11 @@ type internal BackgroundCompiler
userOpName: string
) : (FSharpParseFileResults * FSharpCheckFileResults * SourceTextHash) option =
self.TryGetRecentCheckResultsForFile(fileName, options, sourceText, userOpName)

member _.TryGetRecentCheckResultsForFile
(
fileName: string,
projectSnapshot: FSharpProjectSnapshot,
userOpName: string
) : (FSharpParseFileResults * FSharpCheckFileResults) option =
self.TryGetRecentCheckResultsForFile(fileName, projectSnapshot, userOpName)
4 changes: 4 additions & 0 deletions src/Compiler/Service/BackgroundCompiler.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,10 @@ type internal IBackgroundCompiler =
fileName: string * options: FSharpProjectOptions * sourceText: ISourceText option * userOpName: string ->
(FSharpParseFileResults * FSharpCheckFileResults * SourceTextHash) option

abstract TryGetRecentCheckResultsForFile:
fileName: string * projectSnapshot: FSharpProjectSnapshot * userOpName: string ->
(FSharpParseFileResults * FSharpCheckFileResults) option

abstract BeforeBackgroundFileCheck: IEvent<string * FSharpProjectOptions>

abstract FileChecked: IEvent<string * FSharpProjectOptions>
Expand Down
10 changes: 8 additions & 2 deletions src/Compiler/Service/FSharpProjectSnapshot.fs
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,12 @@ type internal ProjectSnapshotBase<'T when 'T :> IFileSnapshot>(projectCore: Proj
member this.FileKey(fileName: string) = this.UpTo(fileName).LastFileKey
member this.FileKey(index: FileIndex) = this.UpTo(index).LastFileKey

member this.FileKeyWithExtraFileSnapshotVersion(fileName: string) =
let fileKey = this.FileKey fileName
let fileSnapshot = this.SourceFiles |> Seq.find (fun f -> f.FileName = fileName)

fileKey.WithExtraVersion(fileSnapshot.Version |> Md5Hasher.toString)

/// Project snapshot with filenames and versions given as initial input
and internal ProjectSnapshot = ProjectSnapshotBase<FSharpFileSnapshot>

Expand Down Expand Up @@ -394,10 +400,10 @@ and internal ProjectCore
let commandLineOptions =
lazy
(seq {
yield! OtherOptions

for r in ReferencesOnDisk do
$"-r:{r.Path}"

yield! OtherOptions
}
|> Seq.toList)

Expand Down
36 changes: 33 additions & 3 deletions src/Compiler/Service/TransparentCompiler.fs
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ type internal CompilerCaches(sizeFactor: int) =
this.AssemblyData.Clear(shouldClear)
this.SemanticClassification.Clear(snd >> shouldClear)
this.ItemKeyStore.Clear(snd >> shouldClear)
this.ScriptClosure.Clear(snd >> shouldClear) // Todo check if correct predicate
this.ScriptClosure.Clear(snd >> shouldClear)

type internal TransparentCompiler
(
Expand Down Expand Up @@ -1444,9 +1444,8 @@ type internal TransparentCompiler

let ComputeParseAndCheckFileInProject (fileName: string) (projectSnapshot: ProjectSnapshot) =
caches.ParseAndCheckFileInProject.Get(
projectSnapshot.FileKey fileName,
projectSnapshot.FileKeyWithExtraFileSnapshotVersion fileName,
node {

use _ =
Activity.start "ComputeParseAndCheckFileInProject" [| Activity.Tags.fileName, fileName |> Path.GetFileName |]

Expand Down Expand Up @@ -1575,6 +1574,29 @@ type internal TransparentCompiler
}
)

let TryGetRecentCheckResultsForFile
(
fileName: string,
projectSnapshot: FSharpProjectSnapshot,
userOpName: string
) : (FSharpParseFileResults * FSharpCheckFileResults) option =
ignore userOpName

let cacheKey =
projectSnapshot.ProjectSnapshot.FileKeyWithExtraFileSnapshotVersion fileName

let version = cacheKey.GetVersion()

let parseFileResultsAndcheckFileAnswer =
caches.ParseAndCheckFileInProject.TryGet(
cacheKey.GetKey(),
(fun (_fullVersion, fileContentVersion) -> fileContentVersion = (snd version))
)

match parseFileResultsAndcheckFileAnswer with
| Some(parseFileResults, FSharpCheckFileAnswer.Succeeded checkFileResults) -> Some(parseFileResults, checkFileResults)
| _ -> None

let ComputeProjectExtras (bootstrapInfo: BootstrapInfo) (projectSnapshot: ProjectSnapshotWithSources) =
caches.ProjectExtras.Get(
projectSnapshot.SignatureKey,
Expand Down Expand Up @@ -2207,3 +2229,11 @@ type internal TransparentCompiler
userOpName: string
) : (FSharpParseFileResults * FSharpCheckFileResults * SourceTextHash) option =
backgroundCompiler.TryGetRecentCheckResultsForFile(fileName, options, sourceText, userOpName)

member this.TryGetRecentCheckResultsForFile
(
fileName: string,
projectSnapshot: FSharpProjectSnapshot,
userOpName: string
) : (FSharpParseFileResults * FSharpCheckFileResults) option =
TryGetRecentCheckResultsForFile(fileName, projectSnapshot, userOpName)
2 changes: 1 addition & 1 deletion src/Compiler/Service/TransparentCompiler.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ type internal CompilerCaches =
member ParseAndCheckAllFilesInProject: AsyncMemoizeDisabled<obj, obj, obj>

member ParseAndCheckFileInProject:
AsyncMemoize<(string * (string * string)), string, (FSharpParseFileResults * FSharpCheckFileAnswer)>
AsyncMemoize<(string * (string * string)), string * string, (FSharpParseFileResults * FSharpCheckFileAnswer)>

member ParseAndCheckProject: AsyncMemoize<(string * string), string, FSharpCheckProjectResults>

Expand Down
4 changes: 4 additions & 0 deletions src/Compiler/Service/service.fs
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,10 @@ type FSharpChecker
let userOpName = defaultArg userOpName "Unknown"
backgroundCompiler.TryGetRecentCheckResultsForFile(fileName, options, sourceText, userOpName)

member _.TryGetRecentCheckResultsForFile(fileName: string, projectSnapshot: FSharpProjectSnapshot, ?userOpName: string) =
let userOpName = defaultArg userOpName "Unknown"
backgroundCompiler.TryGetRecentCheckResultsForFile(fileName, projectSnapshot, userOpName)

member _.Compile(argv: string[], ?userOpName: string) =
let _userOpName = defaultArg userOpName "Unknown"
use _ = Activity.start "FSharpChecker.Compile" [| Activity.Tags.userOpName, _userOpName |]
Expand Down
5 changes: 5 additions & 0 deletions src/Compiler/Service/service.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,11 @@ type public FSharpChecker =
fileName: string * options: FSharpProjectOptions * ?sourceText: ISourceText * ?userOpName: string ->
(FSharpParseFileResults * FSharpCheckFileResults (* hash *) * int64) option

[<Experimental("This FCS API is experimental and subject to change.")>]
member TryGetRecentCheckResultsForFile:
fileName: string * projectSnapshot: FSharpProjectSnapshot * ?userOpName: string ->
(FSharpParseFileResults * FSharpCheckFileResults) option

/// This function is called when the entire environment is known to have changed for reasons not encoded in the ProjectOptions of any project/compilation.
member InvalidateAll: unit -> unit

Expand Down
11 changes: 8 additions & 3 deletions src/Compiler/Utilities/LruCache.fs
Original file line number Diff line number Diff line change
Expand Up @@ -198,14 +198,19 @@ type internal LruCache<'TKey, 'TVersion, 'TValue when 'TKey: equality and 'TVers

/// Returns an option of a value for given key and version, and also a list of all other versions for given key
member this.GetAll(key, version) =
this.TryGet(key, version),
let others = this.GetAll(key) |> List.filter (fun (ver, _val) -> ver <> version)
this.TryGet(key, version), others

/// Returns a list of version * value pairs for a given key. The strongly held value is first in the list.
member _.GetAll(key: 'TKey) : ('TVersion * 'TValue) list =
match dictionary.TryGetValue key with
| false, _ -> []
| true, versionDict ->
versionDict.Values
|> Seq.map (fun node -> node.Value)
|> Seq.filter (p24 >> ((<>) version))
|> Seq.map (_.Value)
|> Seq.sortBy (function
| _, _, _, Strong _ -> 0
| _ -> 1)
|> Seq.choose (function
| _, ver, _, Strong v -> Some(ver, v)
| _, ver, _, Weak r ->
Expand Down
3 changes: 3 additions & 0 deletions src/Compiler/Utilities/LruCache.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ type internal LruCache<'TKey, 'TVersion, 'TValue when 'TKey: equality and 'TVers
/// Returns an option of a value for given key and version, and also a list of all other versions for given key
member GetAll: key: 'TKey * version: 'TVersion -> 'TValue option * ('TVersion * 'TValue) list

/// Returns a list of version * value pairs for a given key. The strongly held value is first in the list.
member GetAll: key: 'TKey -> ('TVersion * 'TValue) list

member GetValues: unit -> (string * 'TVersion * 'TValue) seq

member Remove: key: 'TKey -> unit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
open System.Collections.Concurrent
open System.Diagnostics
open FSharp.Compiler.CodeAnalysis
open FSharp.Compiler.Text
open Internal.Utilities.Collections
open FSharp.Compiler.CodeAnalysis.TransparentCompiler
open Internal.Utilities.Library.Extras
Expand Down Expand Up @@ -894,4 +895,50 @@ let ``LoadClosure for script is recomputed after changes`` () =
|> Seq.map (fun (k, g) -> k, g |> Seq.map fst |> Seq.toList)
|> Map

Assert.Equal<JobEvent list>([Weakened; Requested; Started; Finished; Weakened; Requested; Started; Finished], closureComputations["FileFirst.fs"])
Assert.Equal<JobEvent list>([Weakened; Requested; Started; Finished; Weakened; Requested; Started; Finished], closureComputations["FileFirst.fs"])

[<Fact>]
let ``TryGetRecentCheckResultsForFile returns None before first call to ParseAndCheckFileInProject`` () =
let project = SyntheticProject.Create(
sourceFile "First" [])

ProjectWorkflowBuilder(project) {
clearCache
tryGetRecentCheckResults "First" expectNone
} |> ignore

[<Fact>]
let ``TryGetRecentCheckResultsForFile returns result after first call to ParseAndCheckFileInProject`` () =
let project = SyntheticProject.Create(
sourceFile "First" [] )

ProjectWorkflowBuilder(project) {
tryGetRecentCheckResults "First" expectSome
} |> ignore

[<Fact>]
let ``TryGetRecentCheckResultsForFile returns no result after edit`` () =
let project = SyntheticProject.Create(
sourceFile "First" [])

ProjectWorkflowBuilder(project) {
tryGetRecentCheckResults "First" expectSome
updateFile "First" updateInternal
tryGetRecentCheckResults "First" expectNone
checkFile "First" expectOk
tryGetRecentCheckResults "First" expectSome
} |> ignore

[<Fact>]
let ``TryGetRecentCheckResultsForFile returns result after edit of other file`` () =
let project = SyntheticProject.Create(
sourceFile "First" [],
sourceFile "Second" ["First"])

ProjectWorkflowBuilder(project) {
tryGetRecentCheckResults "First" expectSome
tryGetRecentCheckResults "Second" expectSome
updateFile "First" updateInternal
tryGetRecentCheckResults "First" expectNone
tryGetRecentCheckResults "Second" expectSome // file didn't change so we still want to get the recent result
} |> ignore
Original file line number Diff line number Diff line change
Expand Up @@ -2078,6 +2078,7 @@ FSharp.Compiler.CodeAnalysis.FSharpChecker: Microsoft.FSharp.Control.IEvent`2[Mi
FSharp.Compiler.CodeAnalysis.FSharpChecker: Microsoft.FSharp.Control.IEvent`2[Microsoft.FSharp.Control.FSharpHandler`1[System.Tuple`2[System.String,FSharp.Compiler.CodeAnalysis.FSharpProjectOptions]],System.Tuple`2[System.String,FSharp.Compiler.CodeAnalysis.FSharpProjectOptions]] get_BeforeBackgroundFileCheck()
FSharp.Compiler.CodeAnalysis.FSharpChecker: Microsoft.FSharp.Control.IEvent`2[Microsoft.FSharp.Control.FSharpHandler`1[System.Tuple`2[System.String,FSharp.Compiler.CodeAnalysis.FSharpProjectOptions]],System.Tuple`2[System.String,FSharp.Compiler.CodeAnalysis.FSharpProjectOptions]] get_FileChecked()
FSharp.Compiler.CodeAnalysis.FSharpChecker: Microsoft.FSharp.Control.IEvent`2[Microsoft.FSharp.Control.FSharpHandler`1[System.Tuple`2[System.String,FSharp.Compiler.CodeAnalysis.FSharpProjectOptions]],System.Tuple`2[System.String,FSharp.Compiler.CodeAnalysis.FSharpProjectOptions]] get_FileParsed()
FSharp.Compiler.CodeAnalysis.FSharpChecker: Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[FSharp.Compiler.CodeAnalysis.FSharpParseFileResults,FSharp.Compiler.CodeAnalysis.FSharpCheckFileResults]] TryGetRecentCheckResultsForFile(System.String, FSharpProjectSnapshot, Microsoft.FSharp.Core.FSharpOption`1[System.String])
FSharp.Compiler.CodeAnalysis.FSharpChecker: Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`3[FSharp.Compiler.CodeAnalysis.FSharpParseFileResults,FSharp.Compiler.CodeAnalysis.FSharpCheckFileResults,System.Int64]] TryGetRecentCheckResultsForFile(System.String, FSharp.Compiler.CodeAnalysis.FSharpProjectOptions, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.ISourceText], Microsoft.FSharp.Core.FSharpOption`1[System.String])
FSharp.Compiler.CodeAnalysis.FSharpChecker: System.Tuple`2[FSharp.Compiler.CodeAnalysis.FSharpParsingOptions,Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Diagnostics.FSharpDiagnostic]] GetParsingOptionsFromCommandLineArgs(Microsoft.FSharp.Collections.FSharpList`1[System.String], Microsoft.FSharp.Collections.FSharpList`1[System.String], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean])
FSharp.Compiler.CodeAnalysis.FSharpChecker: System.Tuple`2[FSharp.Compiler.CodeAnalysis.FSharpParsingOptions,Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Diagnostics.FSharpDiagnostic]] GetParsingOptionsFromCommandLineArgs(Microsoft.FSharp.Collections.FSharpList`1[System.String], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2078,6 +2078,7 @@ FSharp.Compiler.CodeAnalysis.FSharpChecker: Microsoft.FSharp.Control.IEvent`2[Mi
FSharp.Compiler.CodeAnalysis.FSharpChecker: Microsoft.FSharp.Control.IEvent`2[Microsoft.FSharp.Control.FSharpHandler`1[System.Tuple`2[System.String,FSharp.Compiler.CodeAnalysis.FSharpProjectOptions]],System.Tuple`2[System.String,FSharp.Compiler.CodeAnalysis.FSharpProjectOptions]] get_BeforeBackgroundFileCheck()
FSharp.Compiler.CodeAnalysis.FSharpChecker: Microsoft.FSharp.Control.IEvent`2[Microsoft.FSharp.Control.FSharpHandler`1[System.Tuple`2[System.String,FSharp.Compiler.CodeAnalysis.FSharpProjectOptions]],System.Tuple`2[System.String,FSharp.Compiler.CodeAnalysis.FSharpProjectOptions]] get_FileChecked()
FSharp.Compiler.CodeAnalysis.FSharpChecker: Microsoft.FSharp.Control.IEvent`2[Microsoft.FSharp.Control.FSharpHandler`1[System.Tuple`2[System.String,FSharp.Compiler.CodeAnalysis.FSharpProjectOptions]],System.Tuple`2[System.String,FSharp.Compiler.CodeAnalysis.FSharpProjectOptions]] get_FileParsed()
FSharp.Compiler.CodeAnalysis.FSharpChecker: Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[FSharp.Compiler.CodeAnalysis.FSharpParseFileResults,FSharp.Compiler.CodeAnalysis.FSharpCheckFileResults]] TryGetRecentCheckResultsForFile(System.String, FSharpProjectSnapshot, Microsoft.FSharp.Core.FSharpOption`1[System.String])
FSharp.Compiler.CodeAnalysis.FSharpChecker: Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`3[FSharp.Compiler.CodeAnalysis.FSharpParseFileResults,FSharp.Compiler.CodeAnalysis.FSharpCheckFileResults,System.Int64]] TryGetRecentCheckResultsForFile(System.String, FSharp.Compiler.CodeAnalysis.FSharpProjectOptions, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.ISourceText], Microsoft.FSharp.Core.FSharpOption`1[System.String])
FSharp.Compiler.CodeAnalysis.FSharpChecker: System.Tuple`2[FSharp.Compiler.CodeAnalysis.FSharpParsingOptions,Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Diagnostics.FSharpDiagnostic]] GetParsingOptionsFromCommandLineArgs(Microsoft.FSharp.Collections.FSharpList`1[System.String], Microsoft.FSharp.Collections.FSharpList`1[System.String], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean])
FSharp.Compiler.CodeAnalysis.FSharpChecker: System.Tuple`2[FSharp.Compiler.CodeAnalysis.FSharpParsingOptions,Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Diagnostics.FSharpDiagnostic]] GetParsingOptionsFromCommandLineArgs(Microsoft.FSharp.Collections.FSharpList`1[System.String], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean])
Expand Down
Loading
Loading