@@ -221,23 +221,25 @@ type internal ProjectSitesAndFiles() =
221221| _ -> None
222222| Some_ -> None
223223
224- static let rec referencedProvideProjectSites ( projectSite : IProjectSite , serviceProvider : System.IServiceProvider , extraProjectInfo : obj option , projectOptionsTable : FSharpProjectOptionsTable option ) =
224+ static let rec referencedProvideProjectSites ( projectIdOpt : ProjectId option , projectSite : IProjectSite , serviceProvider : System.IServiceProvider , extraProjectInfo : obj option , projectOptionsTable : FSharpProjectOptionsTable option ) =
225225let getReferencesForSolutionService ( solutionService : IVsSolution ) =
226226[|
227227match referencedProjects projectSite, extraProjectInfowith
228228| None, Some(:? VisualStudioWorkspaceImplas workspace) when not ( isNull workspace.CurrentSolution) ->
229229let path = projectSite.ProjectFileName
230230if not ( String.IsNullOrWhiteSpace( path)) then
231- let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath( path, projectDisplayNameOf path)
232- let project = workspace.CurrentSolution.GetProject( projectId)
233- if not ( isNull project) then
234- for referencein project.ProjectReferencesdo
235- let project = workspace.CurrentSolution.GetProject( reference.ProjectId)
236- if not ( isNull project) && project.Language= FSharpConstants.FSharpLanguageNamethen
237- let siteProvider = provideProjectSiteProvider( workspace, project, serviceProvider, projectOptionsTable)
238- let referenceProject = workspace.ProjectTracker.GetProject( reference.ProjectId)
239- let outputPath = referenceProject.BinOutputPath
240- yield Some projectId, project.FilePath, outputPath, siteProvider
231+ match projectIdOptwith
232+ | Some( projectId) ->
233+ let project = workspace.CurrentSolution.GetProject( projectId)
234+ if not ( isNull project) then
235+ for referencein project.ProjectReferencesdo
236+ let project = workspace.CurrentSolution.GetProject( reference.ProjectId)
237+ if not ( isNull project) && project.Language= FSharpConstants.FSharpLanguageNamethen
238+ let siteProvider = provideProjectSiteProvider( workspace, project, serviceProvider, projectOptionsTable)
239+ let referenceProject = workspace.ProjectTracker.GetProject( reference.ProjectId)
240+ let outputPath = referenceProject.BinOutputPath
241+ yield Some project.Id, project.FilePath, outputPath, siteProvider
242+ | _ -> ()
241243
242244| ( Some references), _ ->
243245for pin referencesdo
@@ -255,26 +257,33 @@ type internal ProjectSitesAndFiles() =
255257| None-> ()
256258}
257259
258- static let rec referencedProjectsOf ( enableInMemoryCrossProjectReferences , tryGetOptionsForReferencedProject , projectSite , serviceProvider , extraProjectInfo , projectOptionsTable ) =
259- [| for ( projectId, projectFileName, outputPath, projectSiteProvider) in referencedProvideProjectSites( projectSite, serviceProvider, extraProjectInfo, projectOptionsTable) do
260- let referencedProjectOptions =
261- // Lookup may not succeed if the project has not been established yet
262- // In this case we go and compute the options recursively.
263- match tryGetOptionsForReferencedProject projectFileNamewith
264- | None-> getProjectOptionsForProjectSite( enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, projectSiteProvider.GetProjectSite(), serviceProvider, projectId, projectFileName, extraProjectInfo, projectOptionsTable) |> snd
265- | Some options-> options
266- yield projectFileName, ( outputPath, referencedProjectOptions) |]
267-
268- and getProjectOptionsForProjectSite ( enableInMemoryCrossProjectReferences , tryGetOptionsForReferencedProject , projectSite , serviceProvider , projectId , fileName , extraProjectInfo , projectOptionsTable ) =
260+ static let rec referencedProjectsOf ( projectIdOpt , projectSite , serviceProvider , extraProjectInfo , projectOptionsTable ) =
261+ [| for ( projectIdOpt, projectFileName, outputPath, _ projectSiteProvider) in referencedProvideProjectSites( projectIdOpt, projectSite, serviceProvider, extraProjectInfo, projectOptionsTable) do
262+ let referencedProjectOptionsOpt =
263+ projectOptionsTable
264+ |> Option.bind( fun x ->
265+ match projectIdOptwith
266+ | Some( projectId) -> x.TryGetOptionsForProject( projectId)
267+ | _ -> None
268+ )
269+ |> Option.map( fun ( _ , _ , options ) -> options)
270+
271+ match referencedProjectOptionsOptwith
272+ | Some( referencedProjectOptions) ->
273+ yield projectFileName, ( outputPath, referencedProjectOptions)
274+ | _ -> ()
275+ |]
276+
277+ and getProjectOptionsForProjectSite ( enableInMemoryCrossProjectReferences , projectSite , serviceProvider , projectIdOpt , fileName , extraProjectInfo , projectOptionsTable ) =
269278let referencedProjectFileNames , referencedProjectOptions =
270279if enableInMemoryCrossProjectReferencesthen
271- referencedProjectsOf( enableInMemoryCrossProjectReferences , tryGetOptionsForReferencedProject , projectSite, serviceProvider, extraProjectInfo, projectOptionsTable)
280+ referencedProjectsOf( projectIdOpt , projectSite, serviceProvider, extraProjectInfo, projectOptionsTable)
272281|> Array.unzip
273282else [| |], [| |]
274283let option =
275284let newOption () = {
276285 ProjectFileName= projectSite.ProjectFileName
277- ProjectId= projectId |> Option.map( fun x -> x.ToFSharpProjectIdString())
286+ ProjectId= projectIdOpt |> Option.map( fun x -> x.ToFSharpProjectIdString())
278287 SourceFiles= projectSite.CompilationSourceFiles
279288 OtherOptions= projectSite.CompilationOptions
280289 ReferencedProjects= referencedProjectOptions
@@ -286,7 +295,7 @@ type internal ProjectSitesAndFiles() =
286295 ExtraProjectInfo= extraProjectInfo
287296 Stamp= ( stamp<- stamp+ 1 L; Some stamp)
288297}
289- match projectId , projectOptionsTablewith
298+ match projectIdOpt , projectOptionsTablewith
290299| Some id, Some optionsTable->
291300// Get options from cache
292301match optionsTable.TryGetOptionsForProject( id) with
@@ -308,16 +317,16 @@ type internal ProjectSitesAndFiles() =
308317 failwith" .fsx or .fsscript should have been treated as implicit project"
309318new ProjectSiteOfSingleFile( filename) :> IProjectSite
310319
311- static member GetReferencedProjectSites ( projectSite : IProjectSite , serviceProvider : System.IServiceProvider , extraProjectInfo , projectOptions ) =
312- referencedProvideProjectSites( projectSite, serviceProvider, extraProjectInfo, projectOptions)
320+ static member GetReferencedProjectSites ( projectIdOpt , projectSite : IProjectSite , serviceProvider : System.IServiceProvider , extraProjectInfo , projectOptions ) =
321+ referencedProvideProjectSites( projectIdOpt , projectSite, serviceProvider, extraProjectInfo, projectOptions)
313322|> Seq.map( fun ( _ , _ , _ , ps ) -> ps.GetProjectSite())
314323|> Seq.toArray
315324
316325/// Create project options for this project site.
317- static member GetProjectOptionsForProjectSite ( enableInMemoryCrossProjectReferences , tryGetOptionsForReferencedProject , projectSite : IProjectSite , serviceProvider , projectId , filename , extraProjectInfo , projectOptionsTable ) =
326+ static member GetProjectOptionsForProjectSite ( enableInMemoryCrossProjectReferences , projectSite : IProjectSite , serviceProvider , projectId , filename , extraProjectInfo , projectOptionsTable ) =
318327match projectSitewith
319328| :? IHaveCheckOptionsas hco-> hco.OriginalCheckOptions()
320- | _ -> getProjectOptionsForProjectSite( enableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject , projectSite, serviceProvider, projectId, filename, extraProjectInfo, projectOptionsTable)
329+ | _ -> getProjectOptionsForProjectSite( enableInMemoryCrossProjectReferences, projectSite, serviceProvider, projectId, filename, extraProjectInfo, projectOptionsTable)
321330
322331/// Create project site for these project options
323332static member CreateProjectSiteForScript ( filename , referencedProjectFileNames , checkOptions ) =