From 81986a49dcf43372a083e37b37328d2b6b9cbcb9 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 13 Jul 2017 13:36:56 +0100 Subject: [PATCH 1/7] add option to disable in-memory cross-project references --- .../LanguageService/LanguageService.fs | 6 +- .../FSharp.Editor/Options/EditorOptions.fs | 6 +- .../BackgroundRequests.fs | 3 +- .../ProjectSitesAndFiles.fs | 16 ++--- .../IntelliSenseOptionControl.xaml | 60 ++++++++++--------- .../FSharp.UIResources/Strings.Designer.cs | 18 ++++++ .../src/FSharp.UIResources/Strings.resx | 6 ++ .../Salsa/FSharpLanguageServiceTestable.fs | 6 +- 8 files changed, 79 insertions(+), 42 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index dead969dd27..47ef037c255 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -126,10 +126,10 @@ type internal ProjectInfoManager // compiled and #r will refer to files on disk let referencedProjectFileNames = [| |] let site = ProjectSitesAndFiles.CreateProjectSiteForScript(fileName, referencedProjectFileNames, options) - return ProjectSitesAndFiles.GetProjectOptionsForProjectSite(tryGetOptionsForReferencedProject,site,fileName,options.ExtraProjectInfo,serviceProvider, true) + return ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.IntelliSense.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject,site,fileName,options.ExtraProjectInfo,serviceProvider, true) else let site = ProjectSitesAndFiles.ProjectSiteOfSingleFile(fileName) - return ProjectSitesAndFiles.GetProjectOptionsForProjectSite(tryGetOptionsForReferencedProject,site,fileName,extraProjectInfo,serviceProvider, true) + return ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.IntelliSense.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject,site,fileName,extraProjectInfo,serviceProvider, true) } /// Update the info for a project in the project table @@ -137,7 +137,7 @@ type internal ProjectInfoManager this.AddOrUpdateProject(projectId, (fun isRefresh -> let extraProjectInfo = Some(box workspace) let tryGetOptionsForReferencedProject f = f |> tryGetOrCreateProjectId |> Option.bind this.TryGetOptionsForProject - let referencedProjects, options = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(tryGetOptionsForReferencedProject, site, site.ProjectFileName(), extraProjectInfo, serviceProvider, true) + let referencedProjects, options = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.IntelliSense.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, site.ProjectFileName(), extraProjectInfo, serviceProvider, true) let referencedProjectIds = referencedProjects |> Array.choose tryGetOrCreateProjectId checkerProvider.Checker.InvalidateConfiguration(options, startBackgroundCompileIfAlreadySeen = not isRefresh, userOpName= userOpName + ".UpdateProjectInfo") referencedProjectIds, options)) diff --git a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs index 88270cc7df4..4034d2db8fe 100644 --- a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs +++ b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs @@ -18,7 +18,8 @@ module DefaultTuning = // CLIMutable to make the record work also as a view model [] type IntelliSenseOptions = - { ShowAfterCharIsTyped: bool + { EnableInMemoryCrossProjectReferences: bool + ShowAfterCharIsTyped: bool ShowAfterCharIsDeleted: bool ShowAllSymbols : bool } @@ -41,7 +42,8 @@ type internal Settings [](store: SettingsStore) = do // Initialize default settings store.RegisterDefault - { ShowAfterCharIsTyped = true + { EnableInMemoryCrossProjectReferences = true + ShowAfterCharIsTyped = true ShowAfterCharIsDeleted = true ShowAllSymbols = true } diff --git a/vsintegration/src/FSharp.LanguageService/BackgroundRequests.fs b/vsintegration/src/FSharp.LanguageService/BackgroundRequests.fs index dc85178fe4b..8d2cfce4b92 100644 --- a/vsintegration/src/FSharp.LanguageService/BackgroundRequests.fs +++ b/vsintegration/src/FSharp.LanguageService/BackgroundRequests.fs @@ -83,7 +83,8 @@ type internal FSharpLanguageServiceBackgroundRequests // This portion is executed on the UI thread. let rdt = getServiceProvider().RunningDocumentTable let projectSite = getProjectSitesAndFiles().FindOwningProject(rdt,fileName) - let _, checkOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite((fun _ -> None), projectSite, fileName, None, getServiceProvider(), false) + let enableInMemoryCrossProjectReferences = true + let _, checkOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, (fun _ -> None), projectSite, fileName, None, getServiceProvider(), false) let projectFileName = projectSite.ProjectFileName() let data = { ProjectSite = projectSite diff --git a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs index 370e577a5f1..8b9c8ad77d8 100644 --- a/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs +++ b/vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs @@ -123,7 +123,7 @@ type internal ProjectSitesAndFiles() = | None -> () } - static let rec referencedProjectsOf (tryGetOptionsForReferencedProject, projectSite:IProjectSite, extraProjectInfo, serviceProvider:System.IServiceProvider, useUniqueStamp) = + static let rec referencedProjectsOf (enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite:IProjectSite, extraProjectInfo, serviceProvider:System.IServiceProvider, useUniqueStamp) = [| for (p,ps) in referencedProvideProjectSites (projectSite, serviceProvider) do match fullOutputAssemblyPath p with | None -> () @@ -132,14 +132,16 @@ type internal ProjectSitesAndFiles() = // Lookup may not succeed if the project has not been established yet // In this case we go and compute the options recursively. match tryGetOptionsForReferencedProject p.FileName with - | None -> getProjectOptionsForProjectSite (tryGetOptionsForReferencedProject, ps.GetProjectSite(), p.FileName, extraProjectInfo, serviceProvider, useUniqueStamp) |> snd + | None -> getProjectOptionsForProjectSite (enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, ps.GetProjectSite(), p.FileName, extraProjectInfo, serviceProvider, useUniqueStamp) |> snd | Some options -> options yield (p.FileName, (path, referencedProjectOptions)) |] - and getProjectOptionsForProjectSite(tryGetOptionsForReferencedProject, projectSite:IProjectSite, fileName, extraProjectInfo, serviceProvider, useUniqueStamp) = + and getProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite:IProjectSite, fileName, extraProjectInfo, serviceProvider, useUniqueStamp) = let referencedProjectFileNames, referencedProjectOptions = - referencedProjectsOf(tryGetOptionsForReferencedProject, projectSite, extraProjectInfo, serviceProvider, useUniqueStamp) - |> Array.unzip + if enableInMemoryCrossProjectReferences then + referencedProjectsOf(enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite, extraProjectInfo, serviceProvider, useUniqueStamp) + |> Array.unzip + else [| |], [| |] let options = {ProjectFileName = projectSite.ProjectFileName() @@ -238,11 +240,11 @@ type internal ProjectSitesAndFiles() = |> Seq.toArray /// Create project options for this project site. - static member GetProjectOptionsForProjectSite(tryGetOptionsForReferencedProject, projectSite:IProjectSite,filename,extraProjectInfo,serviceProvider:System.IServiceProvider, useUniqueStamp) = + static member GetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite:IProjectSite,filename,extraProjectInfo,serviceProvider:System.IServiceProvider, useUniqueStamp) = match projectSite with | :? IHaveCheckOptions as hco -> hco.OriginalCheckOptions() | _ -> - getProjectOptionsForProjectSite(tryGetOptionsForReferencedProject, projectSite, filename, extraProjectInfo, serviceProvider, useUniqueStamp) + getProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite, filename, extraProjectInfo, serviceProvider, useUniqueStamp) /// Create project site for these project options static member CreateProjectSiteForScript (filename, referencedProjectFileNames, checkOptions) = diff --git a/vsintegration/src/FSharp.UIResources/IntelliSenseOptionControl.xaml b/vsintegration/src/FSharp.UIResources/IntelliSenseOptionControl.xaml index d6d1858b54b..ecf48295c27 100644 --- a/vsintegration/src/FSharp.UIResources/IntelliSenseOptionControl.xaml +++ b/vsintegration/src/FSharp.UIResources/IntelliSenseOptionControl.xaml @@ -2,34 +2,40 @@ x:ClassModifier="internal" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Microsoft.VisualStudio.FSharp.UIResources" - mc:Ignorable="d" + mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - + + + + + + + + + + + diff --git a/vsintegration/src/FSharp.UIResources/Strings.Designer.cs b/vsintegration/src/FSharp.UIResources/Strings.Designer.cs index 1526ee21a06..4213081ecd3 100644 --- a/vsintegration/src/FSharp.UIResources/Strings.Designer.cs +++ b/vsintegration/src/FSharp.UIResources/Strings.Designer.cs @@ -105,6 +105,24 @@ public static string Dot_underline { } } + /// + /// Looks up a localized string similar to _Enable in-memory cross project references. + /// + public static string Enable_in_memory_cross_project_references { + get { + return ResourceManager.GetString("Enable_in_memory_cross_project_references", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Language Service Performance. + /// + public static string Language_Service_Performance { + get { + return ResourceManager.GetString("Language_Service_Performance", resourceCulture); + } + } + /// /// Looks up a localized string similar to Navigation links. /// diff --git a/vsintegration/src/FSharp.UIResources/Strings.resx b/vsintegration/src/FSharp.UIResources/Strings.resx index 94860c1bf7e..c153f6bcafb 100644 --- a/vsintegration/src/FSharp.UIResources/Strings.resx +++ b/vsintegration/src/FSharp.UIResources/Strings.resx @@ -126,6 +126,9 @@ Completion Lists + + Language Service Performance + D_ash underline @@ -144,6 +147,9 @@ _Show completion list after a character is typed + + _Enable in-memory cross project references + S_how navigation links as diff --git a/vsintegration/tests/Salsa/FSharpLanguageServiceTestable.fs b/vsintegration/tests/Salsa/FSharpLanguageServiceTestable.fs index afafc5e835e..f0d61ee20fb 100644 --- a/vsintegration/tests/Salsa/FSharpLanguageServiceTestable.fs +++ b/vsintegration/tests/Salsa/FSharpLanguageServiceTestable.fs @@ -126,7 +126,8 @@ type internal FSharpLanguageServiceTestable() as this = /// Respond to project being cleaned/rebuilt (any live type providers in the project should be refreshed) member this.OnProjectCleaned(projectSite:IProjectSite) = - let _, checkOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite((fun _ -> None), projectSite, "" ,None, serviceProvider.Value, false) + let enableInMemoryCrossProjectReferences = true + let _, checkOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, (fun _ -> None), projectSite, "" ,None, serviceProvider.Value, false) this.FSharpChecker.NotifyProjectCleaned(checkOptions) |> Async.RunSynchronously member this.OnActiveViewChanged(textView) = @@ -167,8 +168,9 @@ type internal FSharpLanguageServiceTestable() as this = // For each change in dependency files, notify the language service of the change and propagate the update interface IDependencyFileChangeNotify with member this.DependencyFileCreated projectSite = + let enableInMemoryCrossProjectReferences = true // Invalidate the configuration if we notice any add for any DependencyFiles - let _, checkOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite((fun _ -> None), projectSite, "", None, this.ServiceProvider, false) + let _, checkOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences, (fun _ -> None), projectSite, "", None, this.ServiceProvider, false) this.FSharpChecker.InvalidateConfiguration(checkOptions) member this.DependencyFileChanged (filename) = From 8f84e81ab170e2590b0116be95eb4b4261a7ffaa Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 13 Jul 2017 14:05:31 +0100 Subject: [PATCH 2/7] fix build --- vsintegration/tests/unittests/CompletionProviderTests.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vsintegration/tests/unittests/CompletionProviderTests.fs b/vsintegration/tests/unittests/CompletionProviderTests.fs index 3c6263b6172..5690c0087c0 100644 --- a/vsintegration/tests/unittests/CompletionProviderTests.fs +++ b/vsintegration/tests/unittests/CompletionProviderTests.fs @@ -87,7 +87,7 @@ let VerifyNoCompletionList(fileContents: string, marker: string) = [] let usingDefaultSettings() = - SettingsPersistence.setSettings { ShowAfterCharIsTyped = true; ShowAfterCharIsDeleted = false; ShowAllSymbols = true } + SettingsPersistence.setSettings { EnableInMemoryCrossProjectReferences=true; ShowAfterCharIsTyped = true; ShowAfterCharIsDeleted = false; ShowAllSymbols = true } [] let ShouldTriggerCompletionAtCorrectMarkers() = From 2c741ba57631c735c6926981b5d7f5ac905adcf1 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Fri, 14 Jul 2017 10:59:28 +0300 Subject: [PATCH 3/7] add "Language Service Performance" option page --- .../src/FSharp.Editor/Common/Constants.fs | 4 +++ .../src/FSharp.Editor/FSharp.Editor.resx | 3 ++ .../LanguageService/LanguageService.fs | 7 +++-- .../FSharp.Editor/Options/EditorOptions.fs | 20 ++++++++++--- .../FSharp.UIResources.csproj | 7 +++++ .../IntelliSenseOptionControl.xaml | 8 +---- ...nguageServicePerformanceOptionControl.xaml | 29 +++++++++++++++++++ ...ageServicePerformanceOptionControl.xaml.cs | 28 ++++++++++++++++++ .../unittests/CompletionProviderTests.fs | 2 +- 9 files changed, 93 insertions(+), 15 deletions(-) create mode 100644 vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml create mode 100644 vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml.cs diff --git a/vsintegration/src/FSharp.Editor/Common/Constants.fs b/vsintegration/src/FSharp.Editor/Common/Constants.fs index 1e4e0edbfea..88238c467f2 100644 --- a/vsintegration/src/FSharp.Editor/Common/Constants.fs +++ b/vsintegration/src/FSharp.Editor/Common/Constants.fs @@ -68,3 +68,7 @@ module internal Guids = [] /// "9A66EB6A-DE52-4169-BC26-36FBD4312FD7" let codeFixesOptionPageIdString = "9A66EB6A-DE52-4169-BC26-36FBD4312FD7" + + [] + /// "8FDA964A-263D-4B4E-9560-29897535217C" + let languageServicePerformanceOptionPageIdString = "8FDA964A-263D-4B4E-9560-29897535217C" diff --git a/vsintegration/src/FSharp.Editor/FSharp.Editor.resx b/vsintegration/src/FSharp.Editor/FSharp.Editor.resx index f2c15c4ceae..acc92e00890 100644 --- a/vsintegration/src/FSharp.Editor/FSharp.Editor.resx +++ b/vsintegration/src/FSharp.Editor/FSharp.Editor.resx @@ -174,6 +174,9 @@ Code Fixes + + Language Service Performance + The value is unused diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index 47ef037c255..29067a68b1f 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -126,10 +126,10 @@ type internal ProjectInfoManager // compiled and #r will refer to files on disk let referencedProjectFileNames = [| |] let site = ProjectSitesAndFiles.CreateProjectSiteForScript(fileName, referencedProjectFileNames, options) - return ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.IntelliSense.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject,site,fileName,options.ExtraProjectInfo,serviceProvider, true) + return ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject,site,fileName,options.ExtraProjectInfo,serviceProvider, true) else let site = ProjectSitesAndFiles.ProjectSiteOfSingleFile(fileName) - return ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.IntelliSense.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject,site,fileName,extraProjectInfo,serviceProvider, true) + return ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject,site,fileName,extraProjectInfo,serviceProvider, true) } /// Update the info for a project in the project table @@ -137,7 +137,7 @@ type internal ProjectInfoManager this.AddOrUpdateProject(projectId, (fun isRefresh -> let extraProjectInfo = Some(box workspace) let tryGetOptionsForReferencedProject f = f |> tryGetOrCreateProjectId |> Option.bind this.TryGetOptionsForProject - let referencedProjects, options = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.IntelliSense.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, site.ProjectFileName(), extraProjectInfo, serviceProvider, true) + let referencedProjects, options = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, site.ProjectFileName(), extraProjectInfo, serviceProvider, true) let referencedProjectIds = referencedProjects |> Array.choose tryGetOrCreateProjectId checkerProvider.Checker.InvalidateConfiguration(options, startBackgroundCompileIfAlreadySeen = not isRefresh, userOpName= userOpName + ".UpdateProjectInfo") referencedProjectIds, options)) @@ -231,6 +231,7 @@ type [, "F#", null, "IntelliSense", "6008")>] [, "F#", null, "QuickInfo", "6009")>] [, "F#", null, "Code Fixes", "6010")>] + [, "F#", null, "Language Service Performance", "6011")>] [, strLanguageName = FSharpConstants.FSharpLanguageName, languageResourceID = 100, diff --git a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs index 4034d2db8fe..d15959e69b6 100644 --- a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs +++ b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs @@ -18,8 +18,7 @@ module DefaultTuning = // CLIMutable to make the record work also as a view model [] type IntelliSenseOptions = - { EnableInMemoryCrossProjectReferences: bool - ShowAfterCharIsTyped: bool + { ShowAfterCharIsTyped: bool ShowAfterCharIsDeleted: bool ShowAllSymbols : bool } @@ -37,13 +36,16 @@ type CodeFixesOptions = AlwaysPlaceOpensAtTopLevel: bool UnusedOpens: bool } +[] +type LanguageServicePerformanceOptions = + { EnableInMemoryCrossProjectReferences: bool } + [)>] type internal Settings [](store: SettingsStore) = do // Initialize default settings store.RegisterDefault - { EnableInMemoryCrossProjectReferences = true - ShowAfterCharIsTyped = true + { ShowAfterCharIsTyped = true ShowAfterCharIsDeleted = true ShowAllSymbols = true } @@ -58,11 +60,15 @@ type internal Settings [](store: SettingsStore) = AlwaysPlaceOpensAtTopLevel = false UnusedOpens = true } + store.RegisterDefault + { EnableInMemoryCrossProjectReferences = true } + interface ISettings static member IntelliSense : IntelliSenseOptions = getSettings() static member QuickInfo : QuickInfoOptions = getSettings() static member CodeFixes : CodeFixesOptions = getSettings() + static member LanguageServicePerformance : LanguageServicePerformanceOptions = getSettings() module internal OptionsUI = @@ -91,3 +97,9 @@ module internal OptionsUI = inherit AbstractOptionPage() override this.CreateView() = upcast CodeFixesOptionControl() + + [] + type internal LanguageServicePerformanceOptionPage() = + inherit AbstractOptionPage() + override this.CreateView() = + upcast LanguageServicePerformanceOptionControl() \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj b/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj index 2223c656c56..f515fadbc0b 100644 --- a/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj +++ b/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj @@ -55,6 +55,9 @@ CodeFixesOptionControl.xaml + + LanguageServicePerformanceOptionControl.xaml + IntelliSenseOptionControl.xaml @@ -78,6 +81,10 @@ MSBuild:Compile Designer + + MSBuild:Compile + Designer + Designer MSBuild:Compile diff --git a/vsintegration/src/FSharp.UIResources/IntelliSenseOptionControl.xaml b/vsintegration/src/FSharp.UIResources/IntelliSenseOptionControl.xaml index ecf48295c27..c214018dc08 100644 --- a/vsintegration/src/FSharp.UIResources/IntelliSenseOptionControl.xaml +++ b/vsintegration/src/FSharp.UIResources/IntelliSenseOptionControl.xaml @@ -29,13 +29,7 @@ Content="{x:Static local:Strings.Show_all_symbols}"/> - - - - - - + diff --git a/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml b/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml new file mode 100644 index 00000000000..2d3f5d4f0ba --- /dev/null +++ b/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml.cs b/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml.cs new file mode 100644 index 00000000000..f5e2be4e189 --- /dev/null +++ b/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Microsoft.VisualStudio.FSharp.UIResources +{ + /// + /// Interaction logic for LanguageServicePerformanceOptionControl.xaml + /// + internal partial class LanguageServicePerformanceOptionControl : UserControl + { + public LanguageServicePerformanceOptionControl() + { + InitializeComponent(); + } + } +} diff --git a/vsintegration/tests/unittests/CompletionProviderTests.fs b/vsintegration/tests/unittests/CompletionProviderTests.fs index 5690c0087c0..3c6263b6172 100644 --- a/vsintegration/tests/unittests/CompletionProviderTests.fs +++ b/vsintegration/tests/unittests/CompletionProviderTests.fs @@ -87,7 +87,7 @@ let VerifyNoCompletionList(fileContents: string, marker: string) = [] let usingDefaultSettings() = - SettingsPersistence.setSettings { EnableInMemoryCrossProjectReferences=true; ShowAfterCharIsTyped = true; ShowAfterCharIsDeleted = false; ShowAllSymbols = true } + SettingsPersistence.setSettings { ShowAfterCharIsTyped = true; ShowAfterCharIsDeleted = false; ShowAllSymbols = true } [] let ShouldTriggerCompletionAtCorrectMarkers() = From 3bd886f26a1859efcc635f768425a00e2ba3d8aa Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Fri, 14 Jul 2017 11:32:53 +0300 Subject: [PATCH 4/7] (wip) add "Project Check Cache Size" option --- .../FSharp.Editor/Options/EditorOptions.fs | 6 ++- ...nguageServicePerformanceOptionControl.xaml | 44 +++++++++++-------- .../FSharp.UIResources/Strings.Designer.cs | 9 ++++ .../src/FSharp.UIResources/Strings.resx | 3 ++ 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs index d15959e69b6..e87600c8d6c 100644 --- a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs +++ b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs @@ -38,7 +38,8 @@ type CodeFixesOptions = [] type LanguageServicePerformanceOptions = - { EnableInMemoryCrossProjectReferences: bool } + { EnableInMemoryCrossProjectReferences: bool + ProjectCheckCacheSize: int } [)>] type internal Settings [](store: SettingsStore) = @@ -61,7 +62,8 @@ type internal Settings [](store: SettingsStore) = UnusedOpens = true } store.RegisterDefault - { EnableInMemoryCrossProjectReferences = true } + { EnableInMemoryCrossProjectReferences = true + ProjectCheckCacheSize = 3 } interface ISettings diff --git a/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml b/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml index 2d3f5d4f0ba..173dc2b95de 100644 --- a/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml +++ b/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml @@ -7,23 +7,31 @@ xmlns:local="clr-namespace:Microsoft.VisualStudio.FSharp.UIResources" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> - - - - - - - - - - + + + + + + + + + + - - + - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/Strings.Designer.cs b/vsintegration/src/FSharp.UIResources/Strings.Designer.cs index 4213081ecd3..749fb73fdcb 100644 --- a/vsintegration/src/FSharp.UIResources/Strings.Designer.cs +++ b/vsintegration/src/FSharp.UIResources/Strings.Designer.cs @@ -132,6 +132,15 @@ public static string Navigation_links { } } + /// + /// Looks up a localized string similar to Project check cache size. + /// + public static string Project_check_cache_size { + get { + return ResourceManager.GetString("Project_check_cache_size", resourceCulture); + } + } + /// /// Looks up a localized string similar to Show s_ymbols in unopened namespaces. /// diff --git a/vsintegration/src/FSharp.UIResources/Strings.resx b/vsintegration/src/FSharp.UIResources/Strings.resx index c153f6bcafb..39a956ad2c4 100644 --- a/vsintegration/src/FSharp.UIResources/Strings.resx +++ b/vsintegration/src/FSharp.UIResources/Strings.resx @@ -150,6 +150,9 @@ _Enable in-memory cross project references + + Project check cache size + S_how navigation links as From 9aeb6677b1b0e2d8641c6cf3a5b5e2c7641dfc14 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Fri, 14 Jul 2017 12:00:51 +0300 Subject: [PATCH 5/7] pass Settings.LanguageServicePerformance.ProjectCheckCacheSize to FSharpChecker.Create --- .../src/FSharp.Editor/LanguageService/LanguageService.fs | 8 ++++++-- .../LanguageServicePerformanceOptionControl.xaml | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index 29067a68b1f..84bd004b06d 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -22,7 +22,6 @@ open Microsoft.CodeAnalysis.Completion open Microsoft.CodeAnalysis.Options open Microsoft.VisualStudio open Microsoft.VisualStudio.Editor -open Microsoft.VisualStudio.Text open Microsoft.VisualStudio.TextManager.Interop open Microsoft.VisualStudio.LanguageServices.Implementation.LanguageService open Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem @@ -46,7 +45,12 @@ type internal FSharpCheckerProvider let checker = lazy - let checker = FSharpChecker.Create(projectCacheSize = 200, keepAllBackgroundResolutions = false (* , MaxMemory = 2300 *), legacyReferenceResolver=Microsoft.FSharp.Compiler.MSBuildReferenceResolver.Resolver) + let checker = + FSharpChecker.Create( + projectCacheSize = Settings.LanguageServicePerformance.ProjectCheckCacheSize, + keepAllBackgroundResolutions = false, + (* , MaxMemory = 2300 *) + legacyReferenceResolver=Microsoft.FSharp.Compiler.MSBuildReferenceResolver.Resolver) // This is one half of the bridge between the F# background builder and the Roslyn analysis engine. // When the F# background builder refreshes the background semantic build context for a file, diff --git a/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml b/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml index 173dc2b95de..fefb1c797db 100644 --- a/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml +++ b/vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.xaml @@ -27,7 +27,7 @@