@@ -5,6 +5,8 @@ namespace Microsoft.VisualStudio.FSharp.Editor
55open System
66open System.Collections .Generic
77open System.Runtime .InteropServices
8+ open System.Linq
9+ open System.IO
810
911open Microsoft.FSharp .Compiler .SourceCodeServices
1012
@@ -15,7 +17,9 @@ open Microsoft.VisualStudio.LanguageServices
1517open Microsoft.VisualStudio .LanguageServices .Implementation .LanguageService
1618open Microsoft.VisualStudio .LanguageServices .Implementation .ProjectSystem
1719open Microsoft.VisualStudio .LanguageServices .Implementation .DebuggerIntelliSense
20+ open Microsoft.VisualStudio .LanguageServices .Implementation .TaskList
1821open Microsoft.VisualStudio .LanguageServices .Implementation
22+ open Microsoft.VisualStudio .LanguageServices .ProjectSystem
1923open Microsoft.VisualStudio .Shell
2024open Microsoft.VisualStudio .Shell .Interop
2125open Microsoft.VisualStudio .FSharp .LanguageService
@@ -27,7 +31,7 @@ type internal SVsSettingsPersistenceManager = class end
2731
2832[<Guid( FSharpCommonConstants.languageServiceGuidString) >]
2933type internal FSharpLanguageService ( package : FSharpPackage ) =
30- inherit AbstractLanguageService< FSharpPackage, FSharpLanguageService, FSharpProjectSite >( package)
34+ inherit AbstractLanguageService< FSharpPackage, FSharpLanguageService>( package)
3135
3236 static let optionsCache = Dictionary< ProjectId, FSharpProjectOptions>()
3337 static member GetOptions ( projectId : ProjectId ) =
@@ -36,6 +40,13 @@ type internal FSharpLanguageService(package : FSharpPackage) =
3640 else
3741 None
3842
43+ member this.SyncProject ( project : AbstractProject , projectContext : IWorkspaceProjectContext , site : IProjectSite ) =
44+ let updatedFiles = site.SourceFilesOnDisk()
45+ let workspaceFiles = project.GetCurrentDocuments() |> Seq.map( fun file -> file.FilePath)
46+
47+ for file in updatedFiles do if not ( workspaceFiles.Contains( file)) then projectContext.AddSourceFile( file)
48+ for file in workspaceFiles do if not ( updatedFiles.Contains( file)) then projectContext.RemoveSourceFile( file)
49+
3950 override this.ContentTypeName = FSharpCommonConstants.FSharpContentTypeName
4051 override this.LanguageName = FSharpCommonConstants.FSharpLanguageName
4152 override this.RoslynLanguageName = FSharpCommonConstants.FSharpLanguageName
@@ -52,7 +63,6 @@ type internal FSharpLanguageService(package : FSharpPackage) =
5263 // FSROSLYNTODO: Hide navigation bars for now. Enable after adding tests
5364 workspace.Options <- workspace.Options.WithChangedOption( NavigationBarOptions.ShowNavigationBar, FSharpCommonConstants.FSharpLanguageName, false )
5465
55- // Ensure that we have a project in the workspace for this document.
5666 let ( _ , buffer ) = view.GetBuffer()
5767 let filename = VsTextLines.GetFilename buffer
5868 let result = VsRunningDocumentTable.FindDocumentWithoutLocking( package.RunningDocumentTable, filename)
@@ -61,6 +71,7 @@ type internal FSharpLanguageService(package : FSharpPackage) =
6171 match hier with
6272 | :? IProvideProjectSite as siteProvider ->
6373 let site = siteProvider.GetProjectSite()
74+ let projectGuid = Guid( site.ProjectGuid)
6475 let projectFileName = site.ProjectFileName()
6576 let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath( projectFileName, projectFileName)
6677
@@ -69,14 +80,26 @@ type internal FSharpLanguageService(package : FSharpPackage) =
6980 optionsCache.Add( projectId, options)
7081
7182 if obj.ReferenceEquals( workspace.ProjectTracker.GetProject( projectId), null ) then
72- let projectSite = new FSharpProjectSite( hier, this.SystemServiceProvider, workspace, projectFileName);
73- projectSite.Initialize( hier, site)
83+ let projectContextFactory = this.Package.ComponentModel.GetService< IWorkspaceProjectContextFactory>();
84+ let errorReporter = ProjectExternalErrorReporter( projectId, " FS" , this.SystemServiceProvider)
85+ let outputFlag = site.CompilerFlags() |> Seq.pick( fun flag ->
86+ if flag.StartsWith( " -o:" ) then Some( flag.Substring( 3 ))
87+ else if flag.StartsWith( " --out:" ) then Some( flag.Substring( 6 ))
88+ else None)
89+ let outputPath = if Path.IsPathRooted( outputFlag) then outputFlag else Path.Combine( Path.GetDirectoryName( projectFileName), outputFlag)
90+
91+ let projectContext = projectContextFactory.CreateProjectContext( FSharpCommonConstants.FSharpLanguageName, projectFileName, projectFileName, projectGuid, hier, outputPath, errorReporter)
92+ let project = projectContext :?> AbstractProject
93+
94+ this.SyncProject( project, projectContext, site)
95+ site.AdviseProjectSiteChanges( FSharpCommonConstants.FSharpLanguageServiceCallbackName, AdviseProjectSiteChanges( fun () -> this.SyncProject( project, projectContext, site)))
96+ site.AdviseProjectSiteClosed( FSharpCommonConstants.FSharpLanguageServiceCallbackName, AdviseProjectSiteChanges( fun () -> project.Disconnect()))
7497 | _ -> ()
7598 | _ -> ()
7699
77100and [<Guid(FSharpCommonConstants.packageGuidString)>]
78101 internal FSharpPackage () =
79- inherit AbstractPackage< FSharpPackage, FSharpLanguageService, FSharpProjectSite >()
102+ inherit AbstractPackage< FSharpPackage, FSharpLanguageService>()
80103
81104 override this.RoslynLanguageName = FSharpCommonConstants.FSharpLanguageName
82105
0 commit comments