@@ -20,15 +20,15 @@ open Microsoft.VisualStudio.LanguageServices.ProjectSystem
2020open Microsoft.VisualStudio .Shell .Interop
2121
2222[<Sealed>]
23- type internal LegacyProjectWorkspaceMap ( workspace : VisualStudioWorkspaceImpl ,
24- solution: IVsSolution,
23+ type internal LegacyProjectWorkspaceMap ( solution : IVsSolution ,
2524 projectInfoManager: FSharpProjectOptionsManager,
2625 projectContextFactory: IWorkspaceProjectContextFactory) as this=
2726
2827let invalidPathChars = set( Path.GetInvalidPathChars())
2928let optionsAssociation = ConditionalWeakTable< IWorkspaceProjectContext, string[]>()
3029let isPathWellFormed ( path : string ) = not ( String.IsNullOrWhiteSpace path) && path|> Seq.forall( fun c -> not ( Set.contains c invalidPathChars))
3130
31+ let legacyProjectIdLookup = ConcurrentDictionary()
3232let legacyProjectLookup = ConcurrentDictionary()
3333let setupQueue = ConcurrentQueue()
3434
@@ -37,10 +37,12 @@ type internal LegacyProjectWorkspaceMap(workspace: VisualStudioWorkspaceImpl,
3737
3838/// Sync the Roslyn information for the project held in 'projectContext' to match the information given by 'site'.
3939/// Also sync the info in ProjectInfoManager if necessary.
40- member this.SyncLegacyProject ( projectId : ProjectId , projectContext : IWorkspaceProjectContext , site : IProjectSite ) =
40+ member this.SyncLegacyProject ( projectContext : IWorkspaceProjectContext , site : IProjectSite ) =
4141let wellFormedFilePathSetIgnoreCase ( paths : seq < string >) =
4242 HashSet( paths|> Seq.filter isPathWellFormed|> Seq.map( fun s -> try Path.GetFullPath( s) with _ -> s), StringComparer.OrdinalIgnoreCase)
4343
44+ let projectId = projectContext.Id
45+
4446// Sync the source files in projectContext. Note that these source files are __not__ maintained in order in projectContext
4547// as edits are made. It seems this is ok because the source file list is only used to drive roslyn per-file checking.
4648let updatedFiles = site.CompilationSourceFiles|> wellFormedFilePathSetIgnoreCase
@@ -94,7 +96,7 @@ type internal LegacyProjectWorkspaceMap(workspace: VisualStudioWorkspaceImpl,
9496let info = ( updatedFiles, updatedRefs)
9597 legacyProjectLookup.AddOrUpdate( projectId, info, fun _ _ -> info) |> ignore
9698
97- member this.SetupLegacyProjectFile ( siteProvider : IProvideProjectSite , workspace : VisualStudioWorkspaceImpl ) =
99+ member this.SetupLegacyProjectFile ( siteProvider : IProvideProjectSite ) =
98100let rec setup ( site : IProjectSite ) =
99101let projectGuid = Guid( site.ProjectGuid)
100102let projectFileName = site.ProjectFileName
@@ -118,21 +120,21 @@ type internal LegacyProjectWorkspaceMap(workspace: VisualStudioWorkspaceImpl,
118120 projectGuid,
119121 hierarchy,
120122 Option.toObj site.CompilationBinOutputPath)
121-
122- let realProjectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath ( projectFileName , projectDisplayName )
123+
124+ legacyProjectIdLookup .[ projectGuid ] <- projectContext.Id
123125
124126// Sync IProjectSite --> projectContext, and IProjectSite --> ProjectInfoManage
125- this.SyncLegacyProject( realProjectId , projectContext, site)
127+ this.SyncLegacyProject( projectContext, site)
126128
127129 site.BuildErrorReporter<- Some( projectContext:?> Microsoft.VisualStudio.Shell.Interop.IVsLanguageServiceBuildErrorReporter2)
128130
129131// TODO: consider forceUpdate = false here. forceUpdate=true may be causing repeated computation?
130132 site.AdviseProjectSiteChanges( FSharpConstants.FSharpLanguageServiceCallbackName,
131- AdviseProjectSiteChanges( fun () -> this.SyncLegacyProject( realProjectId , projectContext, site)))
133+ AdviseProjectSiteChanges( fun () -> this.SyncLegacyProject( projectContext, site)))
132134
133135 site.AdviseProjectSiteClosed( FSharpConstants.FSharpLanguageServiceCallbackName,
134136 AdviseProjectSiteChanges( fun () ->
135- projectInfoManager.ClearInfoForProject( realProjectId )
137+ projectInfoManager.ClearInfoForProject( projectContext.Id )
136138 optionsAssociation.Remove( projectContext) |> ignore
137139 projectContext.Dispose()))
138140
@@ -151,7 +153,7 @@ type internal LegacyProjectWorkspaceMap(workspace: VisualStudioWorkspaceImpl,
151153member __.OnAfterOpenProject ( hier , _ ) =
152154match hierwith
153155| :? IProvideProjectSiteas siteProvider->
154- let setup = fun () -> this.SetupLegacyProjectFile( siteProvider, workspace )
156+ let setup = fun () -> this.SetupLegacyProjectFile( siteProvider)
155157let _ , o = solution.GetProperty( int__ VSPROPID.VSPROPID_ IsSolutionOpen)
156158if ( match owith | :? boolas isOpen-> isOpen| _ -> false ) then
157159 setup()
@@ -170,10 +172,12 @@ type internal LegacyProjectWorkspaceMap(workspace: VisualStudioWorkspaceImpl,
170172match hierwith
171173| :? IProvideProjectSiteas siteProvider->
172174let site = siteProvider.GetProjectSite()
173- let projectFileName = site.ProjectFileName
174- let projectDisplayName = projectDisplayNameOf projectFileName
175- let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath( projectFileName, projectDisplayName)
176- legacyProjectLookup.TryRemove( projectId) |> ignore
175+ let projectGuid = Guid( site.ProjectGuid)
176+ match legacyProjectIdLookup.TryGetValue( projectGuid) with
177+ | true , projectId->
178+ legacyProjectIdLookup.TryRemove( projectGuid) |> ignore
179+ legacyProjectLookup.TryRemove( projectId) |> ignore
180+ | _ -> ()
177181| _ -> ()
178182 VSConstants.S_ OK
179183