@@ -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,23 +40,25 @@ type internal FSharpLanguageService(package : FSharpPackage) =
3640 else
3741 None
3842
43+ member this.SyncProject ( projectContext : IWorkspaceProjectContext , site : IProjectSite ) =
44+ let updatedFiles = site.SourceFilesOnDisk()
45+ let workspaceFiles = ( projectContext :?> AbstractProject) .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
4253
4354 override this.LanguageServiceId = new Guid( FSharpCommonConstants.languageServiceGuidString)
44- override this.DebuggerLanguageId = DebuggerEnvironment.GetLanguageID()
45-
46- override this.CreateContext ( _ , _ , _ , _ , _ ) = raise( System.NotImplementedException())
4755
4856 override this.SetupNewTextView ( view ) =
49- base .SetupNewTextView( view)
5057 let workspace = this.Package.ComponentModel.GetService< VisualStudioWorkspaceImpl>();
51-
58+
5259 // FSROSLYNTODO: Hide navigation bars for now. Enable after adding tests
5360 workspace.Options <- workspace.Options.WithChangedOption( NavigationBarOptions.ShowNavigationBar, FSharpCommonConstants.FSharpLanguageName, false )
5461
55- // Ensure that we have a project in the workspace for this document.
5662 let ( _ , buffer ) = view.GetBuffer()
5763 let filename = VsTextLines.GetFilename buffer
5864 let result = VsRunningDocumentTable.FindDocumentWithoutLocking( package.RunningDocumentTable, filename)
@@ -61,6 +67,7 @@ type internal FSharpLanguageService(package : FSharpPackage) =
6167 match hier with
6268 | :? IProvideProjectSite as siteProvider ->
6369 let site = siteProvider.GetProjectSite()
70+ let projectGuid = Guid( site.ProjectGuid)
6471 let projectFileName = site.ProjectFileName()
6572 let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath( projectFileName, projectFileName)
6673
@@ -69,14 +76,20 @@ type internal FSharpLanguageService(package : FSharpPackage) =
6976 optionsCache.Add( projectId, options)
7077
7178 if obj.ReferenceEquals( workspace.ProjectTracker.GetProject( projectId), null ) then
72- let projectSite = new FSharpProjectSite( hier, this.SystemServiceProvider, workspace, projectFileName, projectId.Id);
73- projectSite.Initialize( hier, site)
79+ let projectContextFactory = this.Package.ComponentModel.GetService< IWorkspaceProjectContextFactory>();
80+ let errorReporter = ProjectExternalErrorReporter( projectId, " FS" , this.SystemServiceProvider)
81+ let outputFlag = ( site.CompilerFlags() |> Seq.find( fun flag -> flag.StartsWith( " -o:" ))) .Substring( 3 )
82+ let outputPath = if Path.IsPathRooted( outputFlag) then outputFlag else Path.Combine( Path.GetDirectoryName( projectFileName), outputFlag)
83+
84+ let projectContext = projectContextFactory.CreateProjectContext( FSharpCommonConstants.FSharpLanguageName, projectFileName, projectFileName, projectGuid, hier, outputPath, errorReporter)
85+ this.SyncProject( projectContext, site)
86+ site.AdviseProjectSiteChanges( FSharpCommonConstants.FSharpLanguageServiceCallbackName, AdviseProjectSiteChanges( fun () -> this.SyncProject( projectContext, site)))
7487 | _ -> ()
7588 | _ -> ()
7689
7790and [<Guid(FSharpCommonConstants.packageGuidString)>]
7891 internal FSharpPackage () =
79- inherit AbstractPackage< FSharpPackage, FSharpLanguageService, FSharpProjectSite >()
92+ inherit AbstractPackage< FSharpPackage, FSharpLanguageService>()
8093
8194 override this.RoslynLanguageName = FSharpCommonConstants.FSharpLanguageName
8295
0 commit comments