未验证 提交 fdba9745 编写于 作者: J Jakub Majocha 提交者: GitHub

Cache parsing results in incremental build (#14852)

上级 65780aef
---
title: IncrementalBuilder caches
category: Language Service Internals
categoryindex: 300
index: 1300
---
# IncrementalBuilder SyntaxTree cache
Incremental builder keeps in a cache at most one `ParsedInput` for each file it parses.
This behavior can be toggled with `useSyntaxTreeCache` parameter.
Memory impact of this feature can be in range of tens of MB for larger solutions. This can be inspected in memory profilng tools by searching for `ParsedInput` instances.
When partial checking is enabled, implementation files backed by signature will not be parsed or cached, as expected.
......@@ -269,7 +269,8 @@ type internal IncrementalBuilder =
parallelReferenceResolution: ParallelReferenceResolution *
captureIdentifiersWhenParsing: bool *
getSource: (string -> ISourceText option) option *
useChangeNotifications: bool ->
useChangeNotifications: bool *
useSyntaxTreeCache: bool ->
NodeCode<IncrementalBuilder option * FSharpDiagnostic[]>
/// Generalized Incremental Builder. This is exposed only for unit testing purposes.
......
......@@ -195,7 +195,8 @@ type BackgroundCompiler
parallelReferenceResolution,
captureIdentifiersWhenParsing,
getSource: (string -> ISourceText option) option,
useChangeNotifications
useChangeNotifications,
useSyntaxTreeCache
) as self =
let beforeFileChecked = Event<string * FSharpProjectOptions>()
......@@ -329,7 +330,8 @@ type BackgroundCompiler
parallelReferenceResolution,
captureIdentifiersWhenParsing,
getSource,
useChangeNotifications
useChangeNotifications,
useSyntaxTreeCache
)
match builderOpt with
......@@ -636,9 +638,6 @@ type BackgroundCompiler
) =
node {
if useChangeNotifications then
do! builder.NotifyFileChanged(fileName, DateTime.UtcNow)
match! bc.GetCachedCheckFileResult(builder, fileName, sourceText, options) with
| Some (_, results) -> return FSharpCheckFileAnswer.Succeeded results
| _ ->
......@@ -1263,7 +1262,8 @@ type FSharpChecker
parallelReferenceResolution,
captureIdentifiersWhenParsing,
getSource,
useChangeNotifications
useChangeNotifications,
useSyntaxTreeCache
) =
let backgroundCompiler =
......@@ -1280,7 +1280,8 @@ type FSharpChecker
parallelReferenceResolution,
captureIdentifiersWhenParsing,
getSource,
useChangeNotifications
useChangeNotifications,
useSyntaxTreeCache
)
static let globalInstance = lazy FSharpChecker.Create()
......@@ -1324,7 +1325,8 @@ type FSharpChecker
?enablePartialTypeChecking,
?parallelReferenceResolution: bool,
?captureIdentifiersWhenParsing: bool,
?documentSource: DocumentSource
?documentSource: DocumentSource,
?useSyntaxTreeCache: bool
) =
use _ = Activity.startNoTags "FSharpChecker.Create"
......@@ -1352,6 +1354,8 @@ type FSharpChecker
| Some (DocumentSource.Custom _) -> true
| _ -> false
let useSyntaxTreeCache = defaultArg useSyntaxTreeCache true
if keepAssemblyContents && enablePartialTypeChecking then
invalidArg "enablePartialTypeChecking" "'keepAssemblyContents' and 'enablePartialTypeChecking' cannot be both enabled."
......@@ -1372,7 +1376,8 @@ type FSharpChecker
(match documentSource with
| Some (DocumentSource.Custom f) -> Some f
| _ -> None),
useChangeNotifications
useChangeNotifications,
useSyntaxTreeCache
)
member _.ReferenceResolver = legacyReferenceResolver
......
......@@ -41,6 +41,7 @@ type public FSharpChecker =
/// <param name="parallelReferenceResolution">Indicates whether to resolve references in parallel.</param>
/// <param name="captureIdentifiersWhenParsing">When set to true we create a set of all identifiers for each parsed file which can be used to speed up finding references.</param>
/// <param name="documentSource">Default: FileSystem. You can use Custom source to provide a function that will return the source for a given file path instead of reading it from the file system. Note that with this option the FSharpChecker will also not monitor the file system for file changes. It will expect to be notified of changes via the NotifyFileChanged method.</param>
/// <param name="useSyntaxTreeCache">Default: true. Indicates whether to keep parsing results in a cache.</param>
static member Create:
?projectCacheSize: int *
?keepAssemblyContents: bool *
......@@ -53,7 +54,8 @@ type public FSharpChecker =
?enablePartialTypeChecking: bool *
?parallelReferenceResolution: bool *
?captureIdentifiersWhenParsing: bool *
[<Experimental "This parameter is experimental and likely to be removed in the future.">] ?documentSource: DocumentSource ->
[<Experimental "This parameter is experimental and likely to be removed in the future.">] ?documentSource: DocumentSource *
[<Experimental "This parameter is experimental and likely to be removed in the future.">] ?useSyntaxTreeCache: bool ->
FSharpChecker
/// <summary>
......@@ -383,7 +385,6 @@ type public FSharpChecker =
member ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients: unit -> unit
/// Notify the checker that given file has changed. This needs to be used when checker is created with documentSource = Custom.
/// Although it is not mandatory when the changed file is the next thing requested to be checked.
[<Experimental "This FCS API is experimental and likely to be removed in the future.">]
member NotifyFileChanged: fileName: string * options: FSharpProjectOptions * ?userOpName: string -> Async<unit>
......
......@@ -10,6 +10,8 @@ open System.Text
[<RequireQualifiedAccess>]
module internal Activity =
let FscSourceName = "fsc"
module Tags =
let fileName = "fileName"
let project = "project"
......@@ -40,7 +42,10 @@ module internal Activity =
outputDllFile
|]
let private activitySourceName = "fsc"
module Events =
let cacheHit = "cacheHit"
let private activitySourceName = FscSourceName
let private profiledSourceName = "fsc_with_env_stats"
type System.Diagnostics.Activity with
......@@ -75,6 +80,10 @@ module internal Activity =
let startNoTags (name: string) : IDisposable = activitySource.StartActivity(name)
let addEvent name =
if Activity.Current <> null && Activity.Current.Source = activitySource then
Activity.Current.AddEvent(ActivityEvent(name)) |> ignore
module Profiling =
module Tags =
......
......@@ -9,6 +9,8 @@ open System
[<RequireQualifiedAccess>]
module internal Activity =
val FscSourceName: string
module Tags =
val fileName: string
val qualifiedNameOfFile: string
......@@ -17,10 +19,15 @@ module internal Activity =
val length: string
val cache: string
module Events =
val cacheHit: string
val startNoTags: name: string -> IDisposable
val start: name: string -> tags: (string * string) seq -> IDisposable
val addEvent: name: string -> unit
module Profiling =
val startAndMeasureEnvironmentStats: name: string -> IDisposable
val addConsoleListener: unit -> IDisposable
......
......@@ -2,6 +2,7 @@
open System
open System.IO
open System.Diagnostics
open Xunit
......@@ -10,6 +11,22 @@ open FSharp.Test.ProjectGeneration.Internal
open FSharp.Compiler.Text
open FSharp.Compiler.CodeAnalysis
module FcsDiagnostics = FSharp.Compiler.Diagnostics.Activity
let expectCacheHits n =
let events = ResizeArray()
let listener =
new ActivityListener(
ShouldListenTo = (fun s -> s.Name = FcsDiagnostics.FscSourceName),
Sample = (fun _ -> ActivitySamplingResult.AllData),
ActivityStopped = (fun a -> events.AddRange a.Events)
)
ActivitySource.AddActivityListener listener
{ new IDisposable with
member this.Dispose() =
listener.Dispose()
Assert.Equal(n, events |> Seq.filter (fun e -> e.Name = FcsDiagnostics.Events.cacheHit) |> Seq.length) }
let makeTestProject () =
SyntheticProject.Create(
sourceFile "First" [],
......@@ -132,3 +149,62 @@ let ``Using getSource and notifications instead of filesystem`` () =
checkFile middle expectSignatureChanged
checkFile last expectSignatureChanged
}
[<Fact>]
let ``Using getSource and notifications instead of filesystem with parse caching`` () =
let size = 20
let project =
{ SyntheticProject.Create() with
SourceFiles = [
sourceFile $"File%03d{0}" []
for i in 1..size do
sourceFile $"File%03d{i}" [$"File%03d{i-1}"]
]
}
let first = "File001"
let middle = $"File%03d{size / 2}"
let last = $"File%03d{size}"
use _ = expectCacheHits 28
ProjectWorkflowBuilder(project, useGetSource = true, useChangeNotifications = true, useSyntaxTreeCache = true) {
updateFile first updatePublicSurface
checkFile first expectSignatureChanged
checkFile last expectSignatureChanged
updateFile middle updatePublicSurface
checkFile last expectSignatureChanged
addFileAbove middle (sourceFile "addedFile" [first])
updateFile middle (addDependency "addedFile")
checkFile middle expectSignatureChanged
checkFile last expectSignatureChanged
}
[<Fact>]
let ``Edit file, check it, then check dependent file with parse caching`` () =
use _ = expectCacheHits 1
ProjectWorkflowBuilder(makeTestProject(), useSyntaxTreeCache = true) {
updateFile "First" breakDependentFiles
checkFile "First" expectSignatureChanged
saveFile "First"
checkFile "Second" expectErrors
}
[<Fact>]
let ``Edit file, don't check it, check dependent file with parse caching `` () =
use _ = expectCacheHits 1
ProjectWorkflowBuilder(makeTestProject(), useSyntaxTreeCache = true) {
updateFile "First" breakDependentFiles
saveFile "First"
checkFile "Second" expectErrors
}
[<Fact>]
let ``Parse cache not used when not enabled`` () =
use _ = expectCacheHits 0
ProjectWorkflowBuilder(makeTestProject(), useSyntaxTreeCache = false) {
updateFile "First" breakDependentFiles
saveFile "First"
checkFile "Second" expectErrors
}
\ No newline at end of file
......@@ -2031,7 +2031,7 @@ FSharp.Compiler.CodeAnalysis.FSharpCheckProjectResults: FSharp.Compiler.Symbols.
FSharp.Compiler.CodeAnalysis.FSharpCheckProjectResults: System.String ToString()
FSharp.Compiler.CodeAnalysis.FSharpCheckProjectResults: System.String[] DependencyFiles
FSharp.Compiler.CodeAnalysis.FSharpCheckProjectResults: System.String[] get_DependencyFiles()
FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker Create(Microsoft.FSharp.Core.FSharpOption`1[System.Int32], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.LegacyReferenceResolver], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpFunc`2[System.Tuple`2[System.String,System.DateTime],Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`3[System.Object,System.IntPtr,System.Int32]]]], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.DocumentSource])
FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker Create(Microsoft.FSharp.Core.FSharpOption`1[System.Int32], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.LegacyReferenceResolver], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpFunc`2[System.Tuple`2[System.String,System.DateTime],Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`3[System.Object,System.IntPtr,System.Int32]]]], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.DocumentSource], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean])
FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker Instance
FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker get_Instance()
FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpProjectOptions GetProjectOptionsFromCommandLineArgs(System.String, System.String[], Microsoft.FSharp.Core.FSharpOption`1[System.DateTime], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean])
......@@ -2031,7 +2031,7 @@ FSharp.Compiler.CodeAnalysis.FSharpCheckProjectResults: FSharp.Compiler.Symbols.
FSharp.Compiler.CodeAnalysis.FSharpCheckProjectResults: System.String ToString()
FSharp.Compiler.CodeAnalysis.FSharpCheckProjectResults: System.String[] DependencyFiles
FSharp.Compiler.CodeAnalysis.FSharpCheckProjectResults: System.String[] get_DependencyFiles()
FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker Create(Microsoft.FSharp.Core.FSharpOption`1[System.Int32], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.LegacyReferenceResolver], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpFunc`2[System.Tuple`2[System.String,System.DateTime],Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`3[System.Object,System.IntPtr,System.Int32]]]], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.DocumentSource])
FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker Create(Microsoft.FSharp.Core.FSharpOption`1[System.Int32], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.LegacyReferenceResolver], Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpFunc`2[System.Tuple`2[System.String,System.DateTime],Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`3[System.Object,System.IntPtr,System.Int32]]]], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.CodeAnalysis.DocumentSource], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean])
FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker Instance
FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpChecker get_Instance()
FSharp.Compiler.CodeAnalysis.FSharpChecker: FSharp.Compiler.CodeAnalysis.FSharpProjectOptions GetProjectOptionsFromCommandLineArgs(System.String, System.String[], Microsoft.FSharp.Core.FSharpOption`1[System.DateTime], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean], Microsoft.FSharp.Core.FSharpOption`1[System.Boolean])
......@@ -502,7 +502,8 @@ type ProjectWorkflowBuilder
?initialContext,
?checker: FSharpChecker,
?useGetSource,
?useChangeNotifications
?useChangeNotifications,
?useSyntaxTreeCache
) =
let useGetSource = defaultArg useGetSource false
......@@ -533,7 +534,8 @@ type ProjectWorkflowBuilder
enableBackgroundItemKeyStoreAndSemanticClassification = true,
enablePartialTypeChecking = true,
captureIdentifiersWhenParsing = true,
documentSource = (if useGetSource then DocumentSource.Custom getSource else DocumentSource.FileSystem)
documentSource = (if useGetSource then DocumentSource.Custom getSource else DocumentSource.FileSystem),
useSyntaxTreeCache = defaultArg useSyntaxTreeCache false
))
let mapProjectAsync f workflow =
......
......@@ -207,7 +207,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</value>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</value>
</data>
<data name="6012" xml:space="preserve">
<value>Advanced</value>
......
......@@ -122,6 +122,9 @@ type internal FSharpWorkspaceServiceFactory
let enableLiveBuffers =
getOption (fun options -> options.Advanced.IsLiveBuffersEnabled) false
let useSyntaxTreeCache =
getOption (fun options -> options.LanguageServicePerformance.UseSyntaxTreeCache) LanguageServicePerformanceOptions.Default.UseSyntaxTreeCache
let checker =
FSharpChecker.Create(
projectCacheSize = 5000, // We do not care how big the cache is. VS will actually tell FCS to clear caches, so this is fine.
......@@ -133,7 +136,8 @@ type internal FSharpWorkspaceServiceFactory
enablePartialTypeChecking = true,
parallelReferenceResolution = enableParallelReferenceResolution,
captureIdentifiersWhenParsing = true,
documentSource = (if enableLiveBuffers then DocumentSource.Custom getSource else DocumentSource.FileSystem))
documentSource = (if enableLiveBuffers then DocumentSource.Custom getSource else DocumentSource.FileSystem),
useSyntaxTreeCache = useSyntaxTreeCache)
if enableLiveBuffers then
workspace.WorkspaceChanged.Add(fun args ->
......
......@@ -64,13 +64,15 @@ type LanguageServicePerformanceOptions =
AllowStaleCompletionResults: bool
TimeUntilStaleCompletion: int
EnableParallelReferenceResolution: bool
EnableFastFindReferences: bool }
EnableFastFindReferences: bool
UseSyntaxTreeCache: bool }
static member Default =
{ EnableInMemoryCrossProjectReferences = true
AllowStaleCompletionResults = true
TimeUntilStaleCompletion = 2000 // In ms, so this is 2 seconds
EnableParallelReferenceResolution = false
EnableFastFindReferences = FSharpExperimentalFeaturesEnabledAutomatically }
EnableFastFindReferences = FSharpExperimentalFeaturesEnabledAutomatically
UseSyntaxTreeCache = FSharpExperimentalFeaturesEnabledAutomatically }
[<CLIMutable>]
type AdvancedOptions =
......
......@@ -159,7 +159,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</source>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</source>
<target state="new">F# Project and Caching Performance Options;
Enable in-memory cross project references;
IntelliSense Performance Options;
......@@ -168,7 +168,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</target>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</target>
<note />
</trans-unit>
<trans-unit id="PrefixValueNameWithUnderscore">
......
......@@ -159,7 +159,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</source>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</source>
<target state="new">F# Project and Caching Performance Options;
Enable in-memory cross project references;
IntelliSense Performance Options;
......@@ -168,7 +168,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</target>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</target>
<note />
</trans-unit>
<trans-unit id="PrefixValueNameWithUnderscore">
......
......@@ -159,7 +159,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</source>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</source>
<target state="new">F# Project and Caching Performance Options;
Enable in-memory cross project references;
IntelliSense Performance Options;
......@@ -168,7 +168,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</target>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</target>
<note />
</trans-unit>
<trans-unit id="PrefixValueNameWithUnderscore">
......
......@@ -159,7 +159,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</source>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</source>
<target state="new">F# Project and Caching Performance Options;
Enable in-memory cross project references;
IntelliSense Performance Options;
......@@ -168,7 +168,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</target>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</target>
<note />
</trans-unit>
<trans-unit id="PrefixValueNameWithUnderscore">
......
......@@ -159,7 +159,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</source>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</source>
<target state="new">F# Project and Caching Performance Options;
Enable in-memory cross project references;
IntelliSense Performance Options;
......@@ -168,7 +168,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</target>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</target>
<note />
</trans-unit>
<trans-unit id="PrefixValueNameWithUnderscore">
......
......@@ -159,7 +159,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</source>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</source>
<target state="new">F# Project and Caching Performance Options;
Enable in-memory cross project references;
IntelliSense Performance Options;
......@@ -168,7 +168,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</target>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</target>
<note />
</trans-unit>
<trans-unit id="PrefixValueNameWithUnderscore">
......
......@@ -159,7 +159,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</source>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</source>
<target state="new">F# Project and Caching Performance Options;
Enable in-memory cross project references;
IntelliSense Performance Options;
......@@ -168,7 +168,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</target>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</target>
<note />
</trans-unit>
<trans-unit id="PrefixValueNameWithUnderscore">
......
......@@ -159,7 +159,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</source>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</source>
<target state="new">F# Project and Caching Performance Options;
Enable in-memory cross project references;
IntelliSense Performance Options;
......@@ -168,7 +168,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</target>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</target>
<note />
</trans-unit>
<trans-unit id="PrefixValueNameWithUnderscore">
......
......@@ -159,7 +159,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</source>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</source>
<target state="new">F# Project and Caching Performance Options;
Enable in-memory cross project references;
IntelliSense Performance Options;
......@@ -168,7 +168,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</target>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</target>
<note />
</trans-unit>
<trans-unit id="PrefixValueNameWithUnderscore">
......
......@@ -159,7 +159,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</source>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</source>
<target state="new">F# Project and Caching Performance Options;
Enable in-memory cross project references;
IntelliSense Performance Options;
......@@ -168,7 +168,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</target>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</target>
<note />
</trans-unit>
<trans-unit id="PrefixValueNameWithUnderscore">
......
......@@ -159,7 +159,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</source>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</source>
<target state="new">F# Project and Caching Performance Options;
Enable in-memory cross project references;
IntelliSense Performance Options;
......@@ -168,7 +168,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</target>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</target>
<note />
</trans-unit>
<trans-unit id="PrefixValueNameWithUnderscore">
......
......@@ -159,7 +159,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</source>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</source>
<target state="new">F# Project and Caching Performance Options;
Enable in-memory cross project references;
IntelliSense Performance Options;
......@@ -168,7 +168,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</target>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</target>
<note />
</trans-unit>
<trans-unit id="PrefixValueNameWithUnderscore">
......
......@@ -159,7 +159,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</source>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</source>
<target state="new">F# Project and Caching Performance Options;
Enable in-memory cross project references;
IntelliSense Performance Options;
......@@ -168,7 +168,7 @@ Time until stale results are used (in milliseconds);
Parallelization (requires restart);
Enable parallel type checking with signature files;
Enable parallel reference resolution;
Enable fast find references &amp; rename (experimental)</target>
Enable fast find references &amp; rename (experimental);Cache parsing results (experimental)</target>
<note />
</trans-unit>
<trans-unit id="PrefixValueNameWithUnderscore">
......
......@@ -23,6 +23,9 @@
IsChecked="{Binding EnableInMemoryCrossProjectReferences}"
Content="{x:Static local:Strings.Enable_in_memory_cross_project_references}"
ToolTip="{x:Static local:Strings.Tooltip_in_memory_cross_project_references}"/>
<CheckBox x:Name="enableSyntaxTreeCache"
IsChecked="{Binding UseSyntaxTreeCache}"
Content="{x:Static local:Strings.Use_syntax_tree_cache}" />
</StackPanel>
</GroupBox>
<GroupBox Header="{x:Static local:Strings.IntelliSense_Performance}">
......
......@@ -446,5 +446,14 @@ public class Strings {
return ResourceManager.GetString("Unused_opens_code_fix", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Cache parsing results (experimental).
/// </summary>
public static string Use_syntax_tree_cache {
get {
return ResourceManager.GetString("Use_syntax_tree_cache", resourceCulture);
}
}
}
}
......@@ -246,4 +246,7 @@
<data name="LiveBuffers" xml:space="preserve">
<value>Live Buffers (experimental)</value>
</data>
<data name="Use_syntax_tree_cache" xml:space="preserve">
<value>Cache parsing results (experimental)</value>
</data>
</root>
\ No newline at end of file
......@@ -217,6 +217,11 @@
<target state="translated">Navrhovat názvy pro nerozpoznané identifikátory</target>
<note />
</trans-unit>
<trans-unit id="Use_syntax_tree_cache">
<source>Cache parsing results (experimental)</source>
<target state="new">Cache parsing results (experimental)</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -217,6 +217,11 @@
<target state="translated">Namen für nicht aufgelöste Bezeichner vorschlagen</target>
<note />
</trans-unit>
<trans-unit id="Use_syntax_tree_cache">
<source>Cache parsing results (experimental)</source>
<target state="new">Cache parsing results (experimental)</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -217,6 +217,11 @@
<target state="translated">Sugerir nombres para los identificadores no resueltos</target>
<note />
</trans-unit>
<trans-unit id="Use_syntax_tree_cache">
<source>Cache parsing results (experimental)</source>
<target state="new">Cache parsing results (experimental)</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -217,6 +217,11 @@
<target state="translated">Suggérer des noms pour les identificateurs non résolus</target>
<note />
</trans-unit>
<trans-unit id="Use_syntax_tree_cache">
<source>Cache parsing results (experimental)</source>
<target state="new">Cache parsing results (experimental)</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -217,6 +217,11 @@
<target state="translated">Suggerisci nomi per gli identificatori non risolti</target>
<note />
</trans-unit>
<trans-unit id="Use_syntax_tree_cache">
<source>Cache parsing results (experimental)</source>
<target state="new">Cache parsing results (experimental)</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -217,6 +217,11 @@
<target state="translated">未解決の識別子の名前を提案します</target>
<note />
</trans-unit>
<trans-unit id="Use_syntax_tree_cache">
<source>Cache parsing results (experimental)</source>
<target state="new">Cache parsing results (experimental)</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -217,6 +217,11 @@
<target state="translated">확인되지 않은 식별자의 이름 제안</target>
<note />
</trans-unit>
<trans-unit id="Use_syntax_tree_cache">
<source>Cache parsing results (experimental)</source>
<target state="new">Cache parsing results (experimental)</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -217,6 +217,11 @@
<target state="translated">Sugeruj nazwy w przypadku nierozpoznanych identyfikatorów</target>
<note />
</trans-unit>
<trans-unit id="Use_syntax_tree_cache">
<source>Cache parsing results (experimental)</source>
<target state="new">Cache parsing results (experimental)</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -217,6 +217,11 @@
<target state="translated">Sugerir nomes para identificadores não resolvidos</target>
<note />
</trans-unit>
<trans-unit id="Use_syntax_tree_cache">
<source>Cache parsing results (experimental)</source>
<target state="new">Cache parsing results (experimental)</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -217,6 +217,11 @@
<target state="translated">Предлагать имена для неразрешенных идентификаторов</target>
<note />
</trans-unit>
<trans-unit id="Use_syntax_tree_cache">
<source>Cache parsing results (experimental)</source>
<target state="new">Cache parsing results (experimental)</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -217,6 +217,11 @@
<target state="translated">Çözümlenmemiş tanımlayıcılar için ad öner</target>
<note />
</trans-unit>
<trans-unit id="Use_syntax_tree_cache">
<source>Cache parsing results (experimental)</source>
<target state="new">Cache parsing results (experimental)</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -217,6 +217,11 @@
<target state="translated">为未解析标识符建议名称</target>
<note />
</trans-unit>
<trans-unit id="Use_syntax_tree_cache">
<source>Cache parsing results (experimental)</source>
<target state="new">Cache parsing results (experimental)</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
......@@ -217,6 +217,11 @@
<target state="translated">為未解析的識別碼建議名稱</target>
<note />
</trans-unit>
<trans-unit id="Use_syntax_tree_cache">
<source>Cache parsing results (experimental)</source>
<target state="new">Cache parsing results (experimental)</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册