@@ -58,7 +58,7 @@ type internal FSharpProjectOptionsManager
5858member this.AddOrUpdateSingleFileProject ( projectId , data ) = singleFileProjectTable.[ projectId] <- data
5959
6060/// Get the exact options for a single-file script
61- member this.ComputeSingleFileOptions ( tryGetOrCreateProjectId , fileName , loadTime , fileContents ) =
61+ member this.ComputeSingleFileOptions ( tryGetOrCreateProjectId , fileName , loadTime , fileContents , solution ) =
6262async {
6363let extraProjectInfo = Some( box workspace)
6464if SourceFile.MustBeSingleFileProject( fileName) then
@@ -70,22 +70,22 @@ type internal FSharpProjectOptionsManager
7070// compiled and #r will refer to files on disk
7171let referencedProjectFileNames = [| |]
7272let site = ProjectSitesAndFiles.CreateProjectSiteForScript( fileName, referencedProjectFileNames, options)
73- let deps , projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite( settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, site, serviceProvider, ( tryGetOrCreateProjectId fileName), fileName, options.ExtraProjectInfo, Some projectOptionsTable)
73+ let deps , projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite( settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, site, serviceProvider, ( tryGetOrCreateProjectId fileName), fileName, options.ExtraProjectInfo, solution , Some projectOptionsTable)
7474let parsingOptions , _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions( projectOptions)
7575return ( deps, parsingOptions, projectOptions)
7676else
7777let site = ProjectSitesAndFiles.ProjectSiteOfSingleFile( fileName)
78- let deps , projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite( settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, site, serviceProvider, ( tryGetOrCreateProjectId fileName), fileName, extraProjectInfo, Some projectOptionsTable)
78+ let deps , projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite( settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, site, serviceProvider, ( tryGetOrCreateProjectId fileName), fileName, extraProjectInfo, solution , Some projectOptionsTable)
7979let parsingOptions , _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions( projectOptions)
8080return ( deps, parsingOptions, projectOptions)
8181}
8282
8383/// Update the info for a project in the project table
84- member this.UpdateProjectInfo ( tryGetOrCreateProjectId , projectId , site , userOpName , invalidateConfig ) =
84+ member this.UpdateProjectInfo ( tryGetOrCreateProjectId , projectId , site , userOpName , invalidateConfig , solution ) =
8585 Logger.Log LogEditorFunctionId.LanguageService_ UpdateProjectInfo
8686 projectOptionsTable.AddOrUpdateProject( projectId, ( fun isRefresh ->
8787let extraProjectInfo = Some( box workspace)
88- let referencedProjects , projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite( settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, site, serviceProvider, Some( projectId), site.ProjectFileName, extraProjectInfo, Some projectOptionsTable)
88+ let referencedProjects , projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite( settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, site, serviceProvider, Some( projectId), site.ProjectFileName, extraProjectInfo, solution , Some projectOptionsTable)
8989if invalidateConfigthen checkerProvider.Checker.InvalidateConfiguration( projectOptions, startBackgroundCompileIfAlreadySeen= not isRefresh, userOpName= userOpName+ " .UpdateProjectInfo" )
9090let referencedProjectIds = referencedProjects|> Array.choose tryGetOrCreateProjectId
9191let parsingOptions , _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions( projectOptions)
@@ -122,13 +122,29 @@ type internal FSharpProjectOptionsManager
122122// NOTE: we don't use FCS cross-project references from scripts to projects. The projects must have been
123123// compiled and #r will refer to files on disk.
124124let tryGetOrCreateProjectId _ = None
125- let! _referencedProjectFileNames , parsingOptions , projectOptions = this.ComputeSingleFileOptions( tryGetOrCreateProjectId, fileName, loadTime, sourceText.ToString())
125+ let! _referencedProjectFileNames , parsingOptions , projectOptions = this.ComputeSingleFileOptions( tryGetOrCreateProjectId, fileName, loadTime, sourceText.ToString(), document.Project.Solution )
126126 this.AddOrUpdateSingleFileProject( projectId, ( loadTime, parsingOptions, projectOptions))
127127return Some( parsingOptions, None, projectOptions)
128128with ex->
129129 Assert.Exception( ex)
130130return None
131- | _ -> return this.TryGetOptionsForProject( projectId)
131+ | _ ->
132+ match this.TryGetOptionsForProject( projectId) with
133+ | Some( parsingOptions, site, projectOptions) ->
134+ let projectOptions =
135+ { projectOptionswith
136+ ReferencedProjects=
137+ document.Project.ProjectReferences
138+ |> Seq.choose( fun projectReference ->
139+ let referenceProject = document.Project.Solution.GetProject( projectReference.ProjectId)
140+ match this.TryGetOptionsForProject( projectReference.ProjectId) with
141+ | Some(_, _, referenceProjectOptions) -> Some( referenceProject.OutputFilePath, referenceProjectOptions)
142+ | _ -> None
143+ )
144+ |> Seq.toArray
145+ }
146+ return Some( parsingOptions, site, projectOptions)
147+ | _ -> return None
132148}
133149
134150/// Get the options for a document or project relevant for syntax processing.
@@ -143,7 +159,7 @@ type internal FSharpProjectOptionsManager
143159member this.ProvideProjectSiteProvider ( project : Project ) = provideProjectSiteProvider( workspace, project, serviceProvider, Some projectOptionsTable)
144160
145161/// Tell the checker to update the project info for the specified project id
146- member this.UpdateProjectInfoWithProjectId ( projectId : ProjectId , userOpName , invalidateConfig ) =
162+ member this.UpdateProjectInfoWithProjectId ( projectId : ProjectId , userOpName , invalidateConfig , solution ) =
147163let hier = workspace.GetHierarchy( projectId)
148164match hierwith
149165| null -> ()
@@ -153,13 +169,13 @@ type internal FSharpProjectOptionsManager
153169let siteProvider = this.ProvideProjectSiteProvider( project)
154170let projectSite = siteProvider.GetProjectSite()
155171if projectSite.CompilationSourceFiles.Length<> 0 then
156- this.UpdateProjectInfo( tryGetOrCreateProjectId, projectId, projectSite, userOpName, invalidateConfig)
172+ this.UpdateProjectInfo( tryGetOrCreateProjectId, projectId, projectSite, userOpName, invalidateConfig, solution )
157173| _ -> ()
158174
159175/// Tell the checker to update the project info for the specified project id
160- member this.UpdateDocumentInfoWithProjectId ( projectId : ProjectId , documentId : DocumentId , userOpName , invalidateConfig ) =
176+ member this.UpdateDocumentInfoWithProjectId ( projectId : ProjectId , documentId : DocumentId , userOpName , invalidateConfig , solution ) =
161177if workspace.IsDocumentOpen( documentId) then
162- this.UpdateProjectInfoWithProjectId( projectId, userOpName, invalidateConfig)
178+ this.UpdateProjectInfoWithProjectId( projectId, userOpName, invalidateConfig, solution )
163179
164180[<Export>]
165181/// This handles commandline change notifications from the Dotnet Project-system
@@ -181,6 +197,6 @@ type internal FSharpProjectOptionsManager
181197let referencePaths = references|> Seq.map( fun r -> fullPath r.Reference) |> Seq.toArray
182198
183199 projectOptionsTable.SetOptionsWithProjectId( projectId, sourcePaths, referencePaths, options.ToArray())
184- this.UpdateProjectInfoWithProjectId( projectId, " HandleCommandLineChanges" , invalidateConfig= true )
200+ this.UpdateProjectInfoWithProjectId( projectId, " HandleCommandLineChanges" , invalidateConfig= true , solution = workspace.CurrentSolution )
185201
186202member __.Checker = checkerProvider.Checker