Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit8677bd9

Browse files
vasily-kirichenkobrettfo
authored andcommitted
Project cache size option (#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 parent97dbc91 commit8677bd9

14 files changed

+227
-42
lines changed

‎vsintegration/src/FSharp.Editor/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
letcodeFixesOptionPageIdString="9A66EB6A-DE52-4169-BC26-36FBD4312FD7"
71+
72+
[<Literal>]
73+
/// "8FDA964A-263D-4B4E-9560-29897535217C"
74+
letlanguageServicePerformanceOptionPageIdString="8FDA964A-263D-4B4E-9560-29897535217C"

‎vsintegration/src/FSharp.Editor/FSharp.Editor.resx‎

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

‎vsintegration/src/FSharp.Editor/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
openMicrosoft.CodeAnalysis.Options
2323
openMicrosoft.VisualStudio
2424
openMicrosoft.VisualStudio.Editor
25-
openMicrosoft.VisualStudio.Text
2625
openMicrosoft.VisualStudio.TextManager.Interop
2726
openMicrosoft.VisualStudio.LanguageServices.Implementation.LanguageService
2827
openMicrosoft.VisualStudio.LanguageServices.Implementation.ProjectSystem
@@ -46,7 +45,12 @@ type internal FSharpCheckerProvider
4645

4746
letchecker=
4847
lazy
49-
letchecker= FSharpChecker.Create(projectCacheSize=200, keepAllBackgroundResolutions=false(* , MaxMemory = 2300*), legacyReferenceResolver=Microsoft.FSharp.Compiler.MSBuildReferenceResolver.Resolver)
48+
letchecker=
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
letreferencedProjectFileNames=[||]
128132
letsite= 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
letsite= 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
memberthis.UpdateProjectInfo(tryGetOrCreateProjectId,projectId:ProjectId,site:IProjectSite,workspace:Workspace,userOpName)=
137141
this.AddOrUpdateProject(projectId,(fun isRefresh->
138142
letextraProjectInfo= Some(box workspace)
139143
lettryGetOptionsForReferencedProject f= f|> tryGetOrCreateProjectId|> Option.bind this.TryGetOptionsForProject
140-
letreferencedProjects,options= ProjectSitesAndFiles.GetProjectOptionsForProjectSite(tryGetOptionsForReferencedProject, site, site.ProjectFileName(), extraProjectInfo, serviceProvider,true)
144+
letreferencedProjects,options= ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences,tryGetOptionsForReferencedProject, site, site.ProjectFileName(), extraProjectInfo, serviceProvider,true)
141145
letreferencedProjectIds= 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,

‎vsintegration/src/FSharp.Editor/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+
typeLanguageServicePerformanceOptions=
41+
{ EnableInMemoryCrossProjectReferences:bool
42+
ProjectCheckCacheSize:int}
43+
3944
[<Export(typeof<ISettings>)>]
4045
typeinternalSettings[<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 memberIntelliSense:IntelliSenseOptions= getSettings()
6271
static memberQuickInfo:QuickInfoOptions= getSettings()
6372
static memberCodeFixes:CodeFixesOptions= getSettings()
73+
static memberLanguageServicePerformance:LanguageServicePerformanceOptions= getSettings()
6474

6575
moduleinternalOptionsUI=
6676

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

‎vsintegration/src/FSharp.LanguageService/BackgroundRequests.fs‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ type internal FSharpLanguageServiceBackgroundRequests
8383
// This portion is executed on the UI thread.
8484
letrdt= getServiceProvider().RunningDocumentTable
8585
letprojectSite= getProjectSitesAndFiles().FindOwningProject(rdt,fileName)
86-
let_,checkOptions= ProjectSitesAndFiles.GetProjectOptionsForProjectSite((fun _-> None), projectSite, fileName, None, getServiceProvider(),false)
86+
letenableInMemoryCrossProjectReferences=true
87+
let_,checkOptions= ProjectSitesAndFiles.GetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences,(fun _-> None), projectSite, fileName, None, getServiceProvider(),false)
8788
letprojectFileName= projectSite.ProjectFileName()
8889
letdata=
8990
{ ProjectSite= projectSite

‎vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs‎

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ type internal ProjectSitesAndFiles() =
123123
| None->()
124124
}
125125

126-
static let recreferencedProjectsOf(tryGetOptionsForReferencedProject,projectSite:IProjectSite,extraProjectInfo,serviceProvider:System.IServiceProvider,useUniqueStamp)=
126+
static let recreferencedProjectsOf(enableInMemoryCrossProjectReferences,tryGetOptionsForReferencedProject,projectSite:IProjectSite,extraProjectInfo,serviceProvider:System.IServiceProvider,useUniqueStamp)=
127127
[|for(p,ps)in referencedProvideProjectSites(projectSite, serviceProvider)do
128128
match fullOutputAssemblyPath pwith
129129
| None->()
@@ -132,14 +132,16 @@ type internal ProjectSitesAndFiles() =
132132
// Lookup may not succeed if the project has not been established yet
133133
// In this case we go and compute the options recursively.
134134
match tryGetOptionsForReferencedProject p.FileNamewith
135-
| None-> getProjectOptionsForProjectSite(tryGetOptionsForReferencedProject, ps.GetProjectSite(), p.FileName, extraProjectInfo, serviceProvider, useUniqueStamp)|> snd
135+
| None-> getProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences,tryGetOptionsForReferencedProject, ps.GetProjectSite(), p.FileName, extraProjectInfo, serviceProvider, useUniqueStamp)|> snd
136136
| Some options-> options
137137
yield(p.FileName,(path, referencedProjectOptions))|]
138138

139-
andgetProjectOptionsForProjectSite(tryGetOptionsForReferencedProject,projectSite:IProjectSite,fileName,extraProjectInfo,serviceProvider,useUniqueStamp)=
139+
andgetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences,tryGetOptionsForReferencedProject,projectSite:IProjectSite,fileName,extraProjectInfo,serviceProvider,useUniqueStamp)=
140140
letreferencedProjectFileNames,referencedProjectOptions=
141-
referencedProjectsOf(tryGetOptionsForReferencedProject, projectSite, extraProjectInfo, serviceProvider, useUniqueStamp)
142-
|> Array.unzip
141+
if enableInMemoryCrossProjectReferencesthen
142+
referencedProjectsOf(enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSite, extraProjectInfo, serviceProvider, useUniqueStamp)
143+
|> Array.unzip
144+
else[||],[||]
143145

144146
letoptions=
145147
{ProjectFileName= projectSite.ProjectFileName()
@@ -238,11 +240,11 @@ type internal ProjectSitesAndFiles() =
238240
|> Seq.toArray
239241

240242
/// Create project options for this project site.
241-
static memberGetProjectOptionsForProjectSite(tryGetOptionsForReferencedProject,projectSite:IProjectSite,filename,extraProjectInfo,serviceProvider:System.IServiceProvider,useUniqueStamp)=
243+
static memberGetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences,tryGetOptionsForReferencedProject,projectSite:IProjectSite,filename,extraProjectInfo,serviceProvider:System.IServiceProvider,useUniqueStamp)=
242244
match projectSitewith
243245
|:? IHaveCheckOptionsas hco-> hco.OriginalCheckOptions()
244246
|_->
245-
getProjectOptionsForProjectSite(tryGetOptionsForReferencedProject, projectSite, filename, extraProjectInfo, serviceProvider, useUniqueStamp)
247+
getProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences,tryGetOptionsForReferencedProject, projectSite, filename, extraProjectInfo, serviceProvider, useUniqueStamp)
246248

247249
/// Create project site for these project options
248250
static memberCreateProjectSiteForScript(filename,referencedProjectFileNames,checkOptions)=

‎vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@
5555
<CompileInclude="CodeFixesOptionControl.xaml.cs">
5656
<DependentUpon>CodeFixesOptionControl.xaml</DependentUpon>
5757
</Compile>
58+
<CompileInclude="IntergerCheckValidationRule.cs" />
59+
<CompileInclude="LanguageServicePerformanceOptionControl.xaml.cs">
60+
<DependentUpon>LanguageServicePerformanceOptionControl.xaml</DependentUpon>
61+
</Compile>
5862
<CompileInclude="IntelliSenseOptionControl.xaml.cs">
5963
<DependentUpon>IntelliSenseOptionControl.xaml</DependentUpon>
6064
</Compile>
@@ -78,6 +82,10 @@
7882
<Generator>MSBuild:Compile</Generator>
7983
<SubType>Designer</SubType>
8084
</Page>
85+
<PageInclude="LanguageServicePerformanceOptionControl.xaml">
86+
<Generator>MSBuild:Compile</Generator>
87+
<SubType>Designer</SubType>
88+
</Page>
8189
<PageInclude="IntelliSenseOptionControl.xaml">
8290
<SubType>Designer</SubType>
8391
<Generator>MSBuild:Compile</Generator>
@@ -95,6 +103,7 @@
95103
<EmbeddedResourceInclude="Strings.resx">
96104
<Generator>PublicResXFileCodeGenerator</Generator>
97105
<LastGenOutput>Strings.Designer.cs</LastGenOutput>
106+
<SubType>Designer</SubType>
98107
</EmbeddedResource>
99108
</ItemGroup>
100109
<ImportProject="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

‎vsintegration/src/FSharp.UIResources/IntelliSenseOptionControl.xaml‎

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,34 @@
22
x:ClassModifier="internal"
33
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
44
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5-
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6-
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
77
xmlns:local="clr-namespace:Microsoft.VisualStudio.FSharp.UIResources"
8-
mc:Ignorable="d"
8+
mc:Ignorable="d"
99
d:DesignHeight="300"d:DesignWidth="400">
10-
<UserControl.Resources>
11-
<ResourceDictionary>
12-
<ResourceDictionary.MergedDictionaries>
13-
<ResourceDictionarySource="OptionPageStyle.xaml"/>
14-
</ResourceDictionary.MergedDictionaries>
15-
</ResourceDictionary>
16-
</UserControl.Resources>
17-
<Grid>
18-
<ScrollViewerVerticalScrollBarVisibility="Auto">
19-
<StackPanel>
20-
<GroupBoxHeader="{x:Static local:Strings.Completion_Lists}">
21-
<StackPanel>
22-
<CheckBoxx:Name="charTyped"IsChecked="{Binding ShowAfterCharIsTyped}"
23-
Content="{x:Static local:Strings.Show_completion_list_after_a_character_is_typed}"/>
24-
<StackPanelMargin="15 0 0 0">
25-
<CheckBoxx:Name="charDeleted"IsEnabled="{Binding IsChecked, ElementName=charTyped}"IsChecked="{Binding ShowAfterCharIsDeleted}"
26-
Content="{x:Static local:Strings.Show_completion_list_after_a_character_is_deleted}"/>
27-
</StackPanel>
28-
<CheckBoxx:Name="showAllSymbols"IsChecked="{Binding ShowAllSymbols}"
29-
Content="{x:Static local:Strings.Show_all_symbols}"/>
30-
</StackPanel>
31-
</GroupBox>
10+
<UserControl.Resources>
11+
<ResourceDictionary>
12+
<ResourceDictionary.MergedDictionaries>
13+
<ResourceDictionarySource="OptionPageStyle.xaml"/>
14+
</ResourceDictionary.MergedDictionaries>
15+
</ResourceDictionary>
16+
</UserControl.Resources>
17+
<Grid>
18+
<ScrollViewerVerticalScrollBarVisibility="Auto">
19+
<StackPanel>
20+
<GroupBoxHeader="{x:Static local:Strings.Completion_Lists}">
21+
<StackPanel>
22+
<CheckBoxx:Name="charTyped"IsChecked="{Binding ShowAfterCharIsTyped}"
23+
Content="{x:Static local:Strings.Show_completion_list_after_a_character_is_typed}"/>
24+
<StackPanelMargin="15 0 0 0">
25+
<CheckBoxx:Name="charDeleted"IsEnabled="{Binding IsChecked, ElementName=charTyped}"IsChecked="{Binding ShowAfterCharIsDeleted}"
26+
Content="{x:Static local:Strings.Show_completion_list_after_a_character_is_deleted}"/>
3227
</StackPanel>
33-
</ScrollViewer>
34-
</Grid>
28+
<CheckBoxx:Name="showAllSymbols"IsChecked="{Binding ShowAllSymbols}"
29+
Content="{x:Static local:Strings.Show_all_symbols}"/>
30+
</StackPanel>
31+
</GroupBox>
32+
</StackPanel>
33+
</ScrollViewer>
34+
</Grid>
3535
</UserControl>
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
usingSystem.Globalization;
2+
usingSystem.Windows.Controls;
3+
4+
namespaceMicrosoft.VisualStudio.FSharp.UIResources
5+
{
6+
7+
publicclassIntegerRangeValidationRule:ValidationRule
8+
{
9+
publicIntegerRangeValidationRule()
10+
:base(ValidationStep.RawProposedValue,true)
11+
{
12+
}
13+
14+
publicintMin{get;set;}
15+
16+
publicintMax{get;set;}
17+
18+
publicoverrideValidationResultValidate(objectvalue,CultureInfocultureInfo)
19+
{
20+
if(valueisstringtext)
21+
{
22+
if(int.TryParse(text,outinti)&&
23+
i>=Min&&i<=Max)
24+
{
25+
returnValidationResult.ValidResult;
26+
}
27+
}
28+
29+
returnnewValidationResult(false,$"Expected a number between{Min} and{Max}");
30+
}
31+
}
32+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<UserControlx:Class="Microsoft.VisualStudio.FSharp.UIResources.LanguageServicePerformanceOptionControl"
2+
x:ClassModifier="internal"
3+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
7+
xmlns:local="clr-namespace:Microsoft.VisualStudio.FSharp.UIResources"
8+
mc:Ignorable="d"
9+
d:DesignHeight="300"d:DesignWidth="400">
10+
<UserControl.Resources>
11+
<ResourceDictionary>
12+
<ResourceDictionary.MergedDictionaries>
13+
<ResourceDictionarySource="OptionPageStyle.xaml"/>
14+
</ResourceDictionary.MergedDictionaries>
15+
</ResourceDictionary>
16+
</UserControl.Resources>
17+
<Grid>
18+
<ScrollViewerVerticalScrollBarVisibility="Auto">
19+
<StackPanel>
20+
<GroupBoxHeader="{x:Static local:Strings.Language_Service_Performance}">
21+
<StackPanel>
22+
<CheckBoxx:Name="enableInMemoryCrossProjectReferences"IsChecked="{Binding EnableInMemoryCrossProjectReferences}"
23+
Content="{x:Static local:Strings.Enable_in_memory_cross_project_references}"/>
24+
<Grid>
25+
<Grid.ColumnDefinitions>
26+
<ColumnDefinitionWidth="Auto"/>
27+
<ColumnDefinitionWidth="70" />
28+
</Grid.ColumnDefinitions>
29+
<Label Grid.Column="0"x:Name="projectCheckCacheSizeLabel"Content="{x:Static local:Strings.Project_check_cache_size}"/>
30+
<TextBox Grid.Column="1"
31+
HorizontalContentAlignment="Right"
32+
VerticalContentAlignment="Center">
33+
<TextBox.Text>
34+
<BindingPath="ProjectCheckCacheSize">
35+
<Binding.ValidationRules>
36+
<local:IntegerRangeValidationRuleMin="1"Max="1000" />
37+
</Binding.ValidationRules>
38+
</Binding>
39+
</TextBox.Text>
40+
</TextBox>
41+
</Grid>
42+
</StackPanel>
43+
</GroupBox>
44+
</StackPanel>
45+
</ScrollViewer>
46+
</Grid>
47+
</UserControl>

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp