Skip to content

Commit ab87859

Browse files
author
Omar Tawfik
committed
Integrate with CPSProject workspace
1 parent 297b8e3 commit ab87859

File tree

7 files changed

+38
-88
lines changed

7 files changed

+38
-88
lines changed

vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
<Compile Include="AssemblyInfo.fs" />
3333
<Compile Include="CommonConstants.fs" />
3434
<Compile Include="CommonRoslynHelpers.fs" />
35-
<Compile Include="ProjectSite.fs" />
3635
<Compile Include="LanguageService.fs" />
3736
<Compile Include="ColorizationService.fs">
3837
<Link>Classification\ColorizationService.fs</Link>

vsintegration/src/FSharp.Editor/LanguageService.fs

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ namespace Microsoft.VisualStudio.FSharp.Editor
55
open System
66
open System.Collections.Generic
77
open System.Runtime.InteropServices
8+
open System.Linq
9+
open System.IO
810

911
open Microsoft.FSharp.Compiler.SourceCodeServices
1012

@@ -15,7 +17,9 @@ open Microsoft.VisualStudio.LanguageServices
1517
open Microsoft.VisualStudio.LanguageServices.Implementation.LanguageService
1618
open Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem
1719
open Microsoft.VisualStudio.LanguageServices.Implementation.DebuggerIntelliSense
20+
open Microsoft.VisualStudio.LanguageServices.Implementation.TaskList
1821
open Microsoft.VisualStudio.LanguageServices.Implementation
22+
open Microsoft.VisualStudio.LanguageServices.ProjectSystem
1923
open Microsoft.VisualStudio.Shell
2024
open Microsoft.VisualStudio.Shell.Interop
2125
open Microsoft.VisualStudio.FSharp.LanguageService
@@ -27,7 +31,7 @@ type internal SVsSettingsPersistenceManager = class end
2731

2832
[<Guid(FSharpCommonConstants.languageServiceGuidString)>]
2933
type 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

7790
and [<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

vsintegration/src/FSharp.Editor/ProjectSite.fs

Lines changed: 0 additions & 77 deletions
This file was deleted.

vsintegration/src/FSharp.LanguageService/IProjectSite.fs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ type internal IProjectSite =
4343
/// target framework moniker
4444
abstract TargetFrameworkMoniker : string
4545

46+
/// Project Guid
47+
abstract ProjectGuid : string
48+
4649
/// timestamp the site was last loaded
4750
abstract LoadTime : System.DateTime
4851

vsintegration/src/FSharp.LanguageService/ProjectSitesAndFiles.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ type private ProjectSiteOfScriptFile(filename:string, checkOptions : FSharpProje
3535
override this.AdviseProjectSiteClosed(_,_) = ()
3636
override this.IsIncompleteTypeCheckEnvironment = checkOptions.IsIncompleteTypeCheckEnvironment
3737
override this.TargetFrameworkMoniker = ""
38+
override this.ProjectGuid = ""
3839
override this.LoadTime = checkOptions.LoadTime
3940

4041
interface IHaveCheckOptions with
@@ -66,6 +67,7 @@ type private ProjectSiteOfSingleFile(sourceFile) =
6667
override this.AdviseProjectSiteClosed(_,_) = ()
6768
override this.IsIncompleteTypeCheckEnvironment = true
6869
override this.TargetFrameworkMoniker = ""
70+
override this.ProjectGuid = ""
6971
override this.LoadTime = new DateTime(2000,1,1) // any constant time is fine, orphan files do not interact with reloading based on update time
7072

7173
/// Information about projects, open files and other active artifacts in visual studio.

vsintegration/src/FSharp.ProjectSystem.Base/Project/HierarchyNode.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3031,6 +3031,13 @@ internal string GetTargetFrameworkMoniker()
30313031
return moniker;
30323032
}
30333033

3034+
internal string GetProjectGuid()
3035+
{
3036+
string guid = projectMgr.GetProjectProperty(ProjectFileConstants.ProjectGuid) as String;
3037+
Debug.Assert(!String.IsNullOrEmpty(guid), "No project guid?");
3038+
return guid;
3039+
}
3040+
30343041
internal uint GetTargetFrameworkVersion()
30353042
{
30363043
var version = new System.Runtime.Versioning.FrameworkName(GetTargetFrameworkMoniker()).Version;

vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ namespace rec Microsoft.VisualStudio.FSharp.ProjectSystem
9696
member ips.ErrorListTaskProvider() = inner.ErrorListTaskProvider()
9797
member ips.ErrorListTaskReporter() = inner.ErrorListTaskReporter()
9898
member ips.TargetFrameworkMoniker = inner.TargetFrameworkMoniker
99+
member ips.ProjectGuid = inner.ProjectGuid
99100
member ips.IsIncompleteTypeCheckEnvironment = false
100101
member ips.LoadTime = inner.LoadTime
101102

@@ -1476,6 +1477,7 @@ namespace rec Microsoft.VisualStudio.FSharp.ProjectSystem
14761477
closeNotifier.Advise(callbackOwnerKey,callback)
14771478
member this.IsIncompleteTypeCheckEnvironment = false
14781479
member this.TargetFrameworkMoniker = x.GetTargetFrameworkMoniker()
1480+
member this.ProjectGuid = x.GetProjectGuid()
14791481
member this.LoadTime = creationTime
14801482
}
14811483

@@ -1506,6 +1508,7 @@ namespace rec Microsoft.VisualStudio.FSharp.ProjectSystem
15061508
member this.AdviseProjectSiteClosed(_,_) = ()
15071509
member this.IsIncompleteTypeCheckEnvironment = false
15081510
member this.TargetFrameworkMoniker = targetFrameworkMoniker
1511+
member this.ProjectGuid = x.GetProjectGuid()
15091512
member this.LoadTime = creationTime
15101513
}
15111514

0 commit comments

Comments
 (0)