Skip to content
This repository was archived by the owner on Dec 23, 2024. It is now read-only.

Commit c8e1302

Browse files
vasily-kirichenkoKevinRansom
authored andcommitted
Project cache size option (dotnet#3330)
* add option to disable in-memory cross-project references * fix build * add "Language Service Performance" option page * (wip) add "Project Check Cache Size" option * pass Settings.LanguageServicePerformance.ProjectCheckCacheSize to FSharpChecker.Create * address the code review * rename property page, validate project check cache size
1 parent 69500fa commit c8e1302

File tree

4 files changed

+33
-5
lines changed

4 files changed

+33
-5
lines changed

Common/Constants.fs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,7 @@ module internal Guids =
6868
[<Literal>]
6969
/// "9A66EB6A-DE52-4169-BC26-36FBD4312FD7"
7070
let codeFixesOptionPageIdString = "9A66EB6A-DE52-4169-BC26-36FBD4312FD7"
71+
72+
[<Literal>]
73+
/// "8FDA964A-263D-4B4E-9560-29897535217C"
74+
let languageServicePerformanceOptionPageIdString = "8FDA964A-263D-4B4E-9560-29897535217C"

FSharp.Editor.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,9 @@
174174
<data name="6010" xml:space="preserve">
175175
<value>Code Fixes</value>
176176
</data>
177+
<data name="6011" xml:space="preserve">
178+
<value>Performance</value>
179+
</data>
177180
<data name="TheValueIsUnused" xml:space="preserve">
178181
<value>The value is unused</value>
179182
</data>

LanguageService/LanguageService.fs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ open Microsoft.CodeAnalysis.Completion
2222
open Microsoft.CodeAnalysis.Options
2323
open Microsoft.VisualStudio
2424
open Microsoft.VisualStudio.Editor
25-
open Microsoft.VisualStudio.Text
2625
open Microsoft.VisualStudio.TextManager.Interop
2726
open Microsoft.VisualStudio.LanguageServices.Implementation.LanguageService
2827
open Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem
@@ -46,7 +45,12 @@ type internal FSharpCheckerProvider
4645

4746
let checker =
4847
lazy
49-
let checker = FSharpChecker.Create(projectCacheSize = 200, keepAllBackgroundResolutions = false (* , MaxMemory = 2300 *), legacyReferenceResolver=Microsoft.FSharp.Compiler.MSBuildReferenceResolver.Resolver)
48+
let checker =
49+
FSharpChecker.Create(
50+
projectCacheSize = Settings.LanguageServicePerformance.ProjectCheckCacheSize,
51+
keepAllBackgroundResolutions = false,
52+
(* , MaxMemory = 2300 *)
53+
legacyReferenceResolver=Microsoft.FSharp.Compiler.MSBuildReferenceResolver.Resolver)
5054

5155
// This is one half of the bridge between the F# background builder and the Roslyn analysis engine.
5256
// When the F# background builder refreshes the background semantic build context for a file,
@@ -126,18 +130,18 @@ type internal ProjectInfoManager
126130
// compiled and #r will refer to files on disk
127131
let referencedProjectFileNames = [| |]
128132
let site = ProjectSitesAndFiles.CreateProjectSiteForScript(fileName, referencedProjectFileNames, options)
129-
return ProjectSitesAndFiles.GetProjectOptionsForProjectSite(tryGetOptionsForReferencedProject,site,fileName,options.ExtraProjectInfo,serviceProvider, true)
133+
return ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject,site,fileName,options.ExtraProjectInfo,serviceProvider, true)
130134
else
131135
let site = ProjectSitesAndFiles.ProjectSiteOfSingleFile(fileName)
132-
return ProjectSitesAndFiles.GetProjectOptionsForProjectSite(tryGetOptionsForReferencedProject,site,fileName,extraProjectInfo,serviceProvider, true)
136+
return ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject,site,fileName,extraProjectInfo,serviceProvider, true)
133137
}
134138

135139
/// Update the info for a project in the project table
136140
member this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId: ProjectId, site: IProjectSite, workspace: Workspace, userOpName) =
137141
this.AddOrUpdateProject(projectId, (fun isRefresh ->
138142
let extraProjectInfo = Some(box workspace)
139143
let tryGetOptionsForReferencedProject f = f |> tryGetOrCreateProjectId |> Option.bind this.TryGetOptionsForProject
140-
let referencedProjects, options = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(tryGetOptionsForReferencedProject, site, site.ProjectFileName(), extraProjectInfo, serviceProvider, true)
144+
let referencedProjects, options = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, site.ProjectFileName(), extraProjectInfo, serviceProvider, true)
141145
let referencedProjectIds = referencedProjects |> Array.choose tryGetOrCreateProjectId
142146
checkerProvider.Checker.InvalidateConfiguration(options, startBackgroundCompileIfAlreadySeen = not isRefresh, userOpName= userOpName + ".UpdateProjectInfo")
143147
referencedProjectIds, options))
@@ -231,6 +235,7 @@ type
231235
[<ProvideLanguageEditorOptionPage(typeof<OptionsUI.IntelliSenseOptionPage>, "F#", null, "IntelliSense", "6008")>]
232236
[<ProvideLanguageEditorOptionPage(typeof<OptionsUI.QuickInfoOptionPage>, "F#", null, "QuickInfo", "6009")>]
233237
[<ProvideLanguageEditorOptionPage(typeof<OptionsUI.CodeFixesOptionPage>, "F#", null, "Code Fixes", "6010")>]
238+
[<ProvideLanguageEditorOptionPage(typeof<OptionsUI.LanguageServicePerformanceOptionPage>, "F#", null, "Performance", "6011")>]
234239
[<ProvideLanguageService(languageService = typeof<FSharpLanguageService>,
235240
strLanguageName = FSharpConstants.FSharpLanguageName,
236241
languageResourceID = 100,

Options/EditorOptions.fs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ type CodeFixesOptions =
3636
AlwaysPlaceOpensAtTopLevel: bool
3737
UnusedOpens: bool }
3838

39+
[<CLIMutable>]
40+
type LanguageServicePerformanceOptions =
41+
{ EnableInMemoryCrossProjectReferences: bool
42+
ProjectCheckCacheSize: int }
43+
3944
[<Export(typeof<ISettings>)>]
4045
type internal Settings [<ImportingConstructor>](store: SettingsStore) =
4146
do // Initialize default settings
@@ -56,11 +61,16 @@ type internal Settings [<ImportingConstructor>](store: SettingsStore) =
5661
AlwaysPlaceOpensAtTopLevel = false
5762
UnusedOpens = true }
5863

64+
store.RegisterDefault
65+
{ EnableInMemoryCrossProjectReferences = true
66+
ProjectCheckCacheSize = 200 }
67+
5968
interface ISettings
6069

6170
static member IntelliSense : IntelliSenseOptions = getSettings()
6271
static member QuickInfo : QuickInfoOptions = getSettings()
6372
static member CodeFixes : CodeFixesOptions = getSettings()
73+
static member LanguageServicePerformance : LanguageServicePerformanceOptions = getSettings()
6474

6575
module internal OptionsUI =
6676

@@ -89,3 +99,9 @@ module internal OptionsUI =
8999
inherit AbstractOptionPage<CodeFixesOptions>()
90100
override this.CreateView() =
91101
upcast CodeFixesOptionControl()
102+
103+
[<Guid(Guids.languageServicePerformanceOptionPageIdString)>]
104+
type internal LanguageServicePerformanceOptionPage() =
105+
inherit AbstractOptionPage<LanguageServicePerformanceOptions>()
106+
override this.CreateView() =
107+
upcast LanguageServicePerformanceOptionControl()

0 commit comments

Comments
 (0)