Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

add option to disable in-memory cross-project references #3328

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -126,18 +126,18 @@ 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
member this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId: ProjectId, site: IProjectSite, workspace: Workspace, userOpName) =
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))
Expand Down
6 changes: 4 additions & 2 deletions vsintegration/src/FSharp.Editor/Options/EditorOptions.fs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ module DefaultTuning =
// CLIMutable to make the record work also as a view model
[<CLIMutable>]
type IntelliSenseOptions =
{ ShowAfterCharIsTyped: bool
{ EnableInMemoryCrossProjectReferences: bool
ShowAfterCharIsTyped: bool
ShowAfterCharIsDeleted: bool
ShowAllSymbols : bool }

Expand All @@ -41,7 +42,8 @@ type internal Settings [<ImportingConstructor>](store: SettingsStore) =
do // Initialize default settings

store.RegisterDefault
{ ShowAfterCharIsTyped = true
{ EnableInMemoryCrossProjectReferences = true
ShowAfterCharIsTyped = true
ShowAfterCharIsDeleted = true
ShowAllSymbols = true }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
16 changes: 9 additions & 7 deletions vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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 -> ()
Expand All @@ -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()
Expand Down Expand Up @@ -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) =
Expand Down
60 changes: 33 additions & 27 deletions vsintegration/src/FSharp.UIResources/IntelliSenseOptionControl.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -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">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="OptionPageStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel>
<GroupBox Header="{x:Static local:Strings.Completion_Lists}">
<StackPanel>
<CheckBox x:Name="charTyped" IsChecked="{Binding ShowAfterCharIsTyped}"
Content="{x:Static local:Strings.Show_completion_list_after_a_character_is_typed}"/>
<StackPanel Margin="15 0 0 0">
<CheckBox x:Name="charDeleted" IsEnabled="{Binding IsChecked, ElementName=charTyped}" IsChecked="{Binding ShowAfterCharIsDeleted}"
Content="{x:Static local:Strings.Show_completion_list_after_a_character_is_deleted}"/>
</StackPanel>
<CheckBox x:Name="showAllSymbols" IsChecked="{Binding ShowAllSymbols}"
Content="{x:Static local:Strings.Show_all_symbols}"/>
</StackPanel>
</GroupBox>
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="OptionPageStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel>
<GroupBox Header="{x:Static local:Strings.Completion_Lists}">
<StackPanel>
<CheckBox x:Name="charTyped" IsChecked="{Binding ShowAfterCharIsTyped}"
Content="{x:Static local:Strings.Show_completion_list_after_a_character_is_typed}"/>
<StackPanel Margin="15 0 0 0">
<CheckBox x:Name="charDeleted" IsEnabled="{Binding IsChecked, ElementName=charTyped}" IsChecked="{Binding ShowAfterCharIsDeleted}"
Content="{x:Static local:Strings.Show_completion_list_after_a_character_is_deleted}"/>
</StackPanel>
</ScrollViewer>
</Grid>
<CheckBox x:Name="showAllSymbols" IsChecked="{Binding ShowAllSymbols}"
Content="{x:Static local:Strings.Show_all_symbols}"/>
</StackPanel>
</GroupBox>
<GroupBox Header="{x:Static local:Strings.Language_Service_Performance}">
<StackPanel>
<CheckBox x:Name="enableInMemoryCrossProjectReferences" IsChecked="{Binding EnableInMemoryCrossProjectReferences}"
Content="{x:Static local:Strings.Enable_in_memory_cross_project_references}"/>
</StackPanel>
</GroupBox>
</StackPanel>
</ScrollViewer>
</Grid>
</UserControl>
18 changes: 18 additions & 0 deletions vsintegration/src/FSharp.UIResources/Strings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions vsintegration/src/FSharp.UIResources/Strings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,9 @@
<data name="Completion_Lists" xml:space="preserve">
<value>Completion Lists</value>
</data>
<data name="Language_Service_Performance" xml:space="preserve">
<value>Language Service Performance</value>
</data>
<data name="Dash_underline" xml:space="preserve">
<value>D_ash underline</value>
</data>
Expand All @@ -144,6 +147,9 @@
<data name="Show_completion_list_after_a_character_is_typed" xml:space="preserve">
<value>_Show completion list after a character is typed</value>
</data>
<data name="Enable_in_memory_cross_project_references" xml:space="preserve">
<value>_Enable in-memory cross project references</value>
</data>
<data name="Show_navigation_links_as" xml:space="preserve">
<value>S_how navigation links as</value>
</data>
Expand Down
6 changes: 4 additions & 2 deletions vsintegration/tests/Salsa/FSharpLanguageServiceTestable.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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) =
Expand Down Expand Up @@ -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) =
Expand Down
2 changes: 1 addition & 1 deletion vsintegration/tests/unittests/CompletionProviderTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ let VerifyNoCompletionList(fileContents: string, marker: string) =

[<OneTimeSetUp>]
let usingDefaultSettings() =
SettingsPersistence.setSettings { ShowAfterCharIsTyped = true; ShowAfterCharIsDeleted = false; ShowAllSymbols = true }
SettingsPersistence.setSettings { EnableInMemoryCrossProjectReferences=true; ShowAfterCharIsTyped = true; ShowAfterCharIsDeleted = false; ShowAllSymbols = true }

[<Test>]
let ShouldTriggerCompletionAtCorrectMarkers() =
Expand Down