Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd2998b0

Browse files
TIHanbrettfo
authored andcommitted
Fixed several issues, should be working dev16
1 parent8f6315c commitd2998b0

File tree

4 files changed

+85
-64
lines changed

4 files changed

+85
-64
lines changed

‎vsintegration/src/FSharp.Editor/LanguageService/FSharpProjectOptionsManager.fs‎

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,20 +99,34 @@ type private FSharpProjectOptionsReactor (workspace: VisualStudioWorkspaceImpl,
9999
match cache.TryGetValue(projectId)with
100100
|false,_->
101101

102+
// Because this code can be kicked off before the hack, HandleCommandLineChanges, occurs,
103+
// the command line options will not be available and we should bail if one of the project references does not give us anything.
104+
let mutablecanBail=false
105+
102106
letreferencedProjects=
103107
if settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferencesthen
104108
project.ProjectReferences
105109
|> Seq.choose(fun projectReference->
106110
letreferenceProject= project.Solution.GetProject(projectReference.ProjectId)
107-
tryComputeOptions referenceProject
108-
|> Option.map(fun(_,projectOptions)->
109-
(referenceProject.OutputFilePath, projectOptions)
110-
)
111+
letresult=
112+
tryComputeOptions referenceProject
113+
|> Option.map(fun(_,projectOptions)->
114+
(referenceProject.OutputFilePath, projectOptions)
115+
)
116+
117+
if result.IsNonethen
118+
canBail<-true
119+
120+
result
111121
)
112122
|> Seq.toArray
113123
else
114124
[||]
115125

126+
if canBailthen
127+
None
128+
else
129+
116130
lethier= workspace.GetHierarchy(projectId)
117131
letprojectSite=
118132
match hierwith
@@ -137,10 +151,10 @@ type private FSharpProjectOptionsReactor (workspace: VisualStudioWorkspaceImpl,
137151
Stamp= Some(int64<| projectStamp.GetHashCode())
138152
}
139153

154+
// This can happen if we didn't receive the callback from HandleCommandLineChanges yet.
140155
if Array.isEmpty projectOptions.SourceFilesthen
141156
None
142157
else
143-
144158
checkerProvider.Checker.InvalidateConfiguration(projectOptions, startBackgroundCompileIfAlreadySeen=true, userOpName="computeOptions")
145159

146160
letparsingOptions,_= checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions)
@@ -211,6 +225,14 @@ type internal FSharpProjectOptionsManager
211225
letprojectDisplayName= projectDisplayNameOf projectFileName
212226
Some(workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName))
213227

228+
do
229+
// We need to listen to this event for lifecycle purposes.
230+
workspace.WorkspaceChanged.Add(fun args->
231+
match args.Kindwith
232+
| WorkspaceChangeKind.ProjectRemoved-> reactor.ClearOptionsByProjectId(args.ProjectId)
233+
|_->()
234+
)
235+
214236
/// Retrieve the projectOptionsTable
215237
member__.FSharpOptions= projectOptionsTable
216238

‎vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs‎

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ type internal FSharpLanguageService(package : FSharpPackage, solution: IVsSoluti
206206
letprojectDisplayName= projectDisplayNameOf projectFileName
207207
Some(workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName))
208208

209-
letmutablelegacyProjectWorkspaceMap= Unchecked.defaultof<LegacyProjectWorkspaceMap>
209+
let_legacyProjectWorkspaceMap=new LegacyProjectWorkspaceMap(package.ComponentModel.GetService<VisualStudioWorkspaceImpl>(), solution, projectInfoManager, package.ComponentModel.GetService<IWorkspaceProjectContextFactory>())
210210

211211
overridethis.Initialize()=
212212
base.Initialize()
@@ -216,9 +216,6 @@ type internal FSharpLanguageService(package : FSharpPackage, solution: IVsSoluti
216216

217217
this.Workspace.DocumentClosed.Add<|fun args-> tryRemoveSingleFileProject args.Document.Project.Id
218218

219-
legacyProjectWorkspaceMap<- LegacyProjectWorkspaceMap(this.Workspace, solution, projectInfoManager, package.ComponentModel.GetService<IWorkspaceProjectContextFactory>(), this.SystemServiceProvider)
220-
legacyProjectWorkspaceMap.Initialize()
221-
222219
lettheme= package.ComponentModel.DefaultExportProvider.GetExport<ISetThemeColors>().Value
223220
theme.SetColors()
224221

‎vsintegration/src/FSharp.Editor/LanguageService/LegacyProjectWorkspaceMap.fs‎

Lines changed: 52 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,23 @@ open Microsoft.VisualStudio.LanguageServices.ProjectSystem
2020
openMicrosoft.VisualStudio.Shell.Interop
2121

2222
[<Sealed>]
23-
typeinternalLegacyProjectWorkspaceMap(workspace: VisualStudioWorkspaceImpl,
23+
typeinternalLegacyProjectWorkspaceMap(workspace: VisualStudioWorkspaceImpl,
2424
solution: IVsSolution,
2525
projectInfoManager: FSharpProjectOptionsManager,
26-
projectContextFactory: IWorkspaceProjectContextFactory,
27-
serviceProvider: IServiceProvider)as this=
26+
projectContextFactory: IWorkspaceProjectContextFactory)as this=
2827

2928
letinvalidPathChars= set(Path.GetInvalidPathChars())
3029
letoptionsAssociation= ConditionalWeakTable<IWorkspaceProjectContext, string[]>()
3130
letisPathWellFormed(path:string)=not(String.IsNullOrWhiteSpace path)&& path|> Seq.forall(fun c->not(Set.contains c invalidPathChars))
3231

3332
letlegacyProjectLookup= ConcurrentDictionary()
33+
letsetupQueue= ConcurrentQueue()
3434

3535
lettryGetOrCreateProjectId(workspace:VisualStudioWorkspaceImpl)(projectFileName:string)=
3636
letprojectDisplayName= projectDisplayNameOf projectFileName
3737
Some(workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName))
3838

39-
memberthis.Initialize()=
39+
do
4040
solution.AdviseSolutionEvents(this)|> ignore
4141

4242
/// Sync the Roslyn information for the project held in 'projectContext' to match the information given by 'site'.
@@ -110,74 +110,77 @@ type internal LegacyProjectWorkspaceMap(workspace: VisualStudioWorkspaceImpl,
110110

111111
memberthis.SetupLegacyProjectFile(siteProvider:IProvideProjectSite,workspace:VisualStudioWorkspaceImpl,userOpName)=
112112
letuserOpName= userOpName+".SetupProjectFile"
113-
letrecsetup(site:IProjectSite)=
113+
let recsetup(site:IProjectSite)=
114114
letprojectGuid= Guid(site.ProjectGuid)
115115
letprojectFileName= site.ProjectFileName
116116
letprojectDisplayName= projectDisplayNameOf projectFileName
117117

118-
// This projectId is not guaranteed to be the same ProjectId that will actually be created once we call CreateProjectContext
119-
// in Roslyn versions once https://github.com/dotnet/roslyn/pull/26931 is merged. Roslyn will still guarantee that once
120-
// there is a project in the workspace with the same path, it'll return the ID of that. So this is sufficient to use
121-
// in that case as long as we only use it to call GetProject.
122-
letfakeProjectId= workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName)
123-
124-
if isNull(workspace.ProjectTracker.GetProject fakeProjectId)then
125-
lethierarchy=
126-
site.ProjectProvider
127-
|> Option.map(fun p-> p:?> IVsHierarchy)
128-
|> Option.toObj
129-
130-
// Roslyn is expecting site to be an IVsHierarchy.
131-
// It just so happens that the object that implements IProvideProjectSite is also
132-
// an IVsHierarchy. This assertion is to ensure that the assumption holds true.
133-
Debug.Assert(not(isNull hierarchy),"About to CreateProjectContext with a non-hierarchy site")
134-
135-
letprojectContext=
136-
projectContextFactory.CreateProjectContext(
137-
FSharpConstants.FSharpLanguageName,
138-
projectDisplayName,
139-
projectFileName,
140-
projectGuid,
141-
hierarchy,
142-
Option.toObj site.CompilationBinOutputPath)
118+
lethierarchy=
119+
site.ProjectProvider
120+
|> Option.map(fun p-> p:?> IVsHierarchy)
121+
|> Option.toObj
122+
123+
// Roslyn is expecting site to be an IVsHierarchy.
124+
// It just so happens that the object that implements IProvideProjectSite is also
125+
// an IVsHierarchy. This assertion is to ensure that the assumption holds true.
126+
Debug.Assert(not(isNull hierarchy),"About to CreateProjectContext with a non-hierarchy site")
127+
128+
letprojectContext=
129+
projectContextFactory.CreateProjectContext(
130+
FSharpConstants.FSharpLanguageName,
131+
projectDisplayName,
132+
projectFileName,
133+
projectGuid,
134+
hierarchy,
135+
Option.toObj site.CompilationBinOutputPath)
143136

144-
// The real project ID that was actually added. See comments for fakeProjectId why this one is actually good.
145-
letrealProjectId= workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName)
137+
// The real project ID that was actually added. See comments for fakeProjectId why this one is actually good.
138+
letrealProjectId= workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName)
146139

147-
// Sync IProjectSite --> projectContext, and IProjectSite --> ProjectInfoManage
148-
this.SyncLegacyProject(realProjectId, projectContext, site, workspace, forceUpdate=true, userOpName=userOpName)
140+
// Sync IProjectSite --> projectContext, and IProjectSite --> ProjectInfoManage
141+
this.SyncLegacyProject(realProjectId, projectContext, site, workspace, forceUpdate=true, userOpName=userOpName)
149142

150-
site.BuildErrorReporter<- Some(projectContext:?> Microsoft.VisualStudio.Shell.Interop.IVsLanguageServiceBuildErrorReporter2)
143+
site.BuildErrorReporter<- Some(projectContext:?> Microsoft.VisualStudio.Shell.Interop.IVsLanguageServiceBuildErrorReporter2)
151144

152-
// TODO: consider forceUpdate = false here. forceUpdate=true may be causing repeated computation?
153-
site.AdviseProjectSiteChanges(FSharpConstants.FSharpLanguageServiceCallbackName,
154-
AdviseProjectSiteChanges(fun()-> this.SyncLegacyProject(realProjectId, projectContext, site, workspace, forceUpdate=true, userOpName="AdviseProjectSiteChanges."+userOpName)))
145+
// TODO: consider forceUpdate = false here. forceUpdate=true may be causing repeated computation?
146+
site.AdviseProjectSiteChanges(FSharpConstants.FSharpLanguageServiceCallbackName,
147+
AdviseProjectSiteChanges(fun()-> this.SyncLegacyProject(realProjectId, projectContext, site, workspace, forceUpdate=true, userOpName="AdviseProjectSiteChanges."+userOpName)))
155148

156-
site.AdviseProjectSiteClosed(FSharpConstants.FSharpLanguageServiceCallbackName,
157-
AdviseProjectSiteChanges(fun()->
158-
projectInfoManager.ClearInfoForProject(realProjectId)
159-
optionsAssociation.Remove(projectContext)|> ignore
160-
projectContext.Dispose()))
161-
162-
for referencedSitein ProjectSitesAndFiles.GetReferencedProjectSites(Some realProjectId, site, serviceProvider, Some(workspace:>obj), workspace.CurrentSolution, Some projectInfoManager.FSharpOptions)do
163-
setup referencedSite
149+
site.AdviseProjectSiteClosed(FSharpConstants.FSharpLanguageServiceCallbackName,
150+
AdviseProjectSiteChanges(fun()->
151+
projectInfoManager.ClearInfoForProject(realProjectId)
152+
optionsAssociation.Remove(projectContext)|> ignore
153+
projectContext.Dispose()))
164154

165155
setup(siteProvider.GetProjectSite())
166156

167157
interface IVsSolutionEventswith
168158

169-
member__.OnAfterCloseSolution(_)= VSConstants.S_OK
159+
member__.OnAfterCloseSolution(_)=
160+
// Clear
161+
let mutablesetup= Unchecked.defaultof<_>
162+
while setupQueue.TryDequeue(&setup)do()
163+
VSConstants.S_OK
170164

171165
member__.OnAfterLoadProject(_,_)= VSConstants.S_OK
172166

173167
member__.OnAfterOpenProject(hier,_)=
174168
match hierwith
175169
|:? IProvideProjectSiteas siteProvider->
176-
this.SetupLegacyProjectFile(siteProvider, workspace,"LegacyProjectWorkspaceMap.Initialize")
170+
letsetup=fun()-> this.SetupLegacyProjectFile(siteProvider, workspace,"LegacyProjectWorkspaceMap.OnAfterOpenProject")
171+
let_,o= solution.GetProperty(int__VSPROPID.VSPROPID_IsSolutionOpen)
172+
if(match owith|:? boolas isOpen-> isOpen|_->false)then
173+
setup()
174+
else
175+
setupQueue.Enqueue(setup)
177176
|_->()
178177
VSConstants.S_OK
179178

180-
member__.OnAfterOpenSolution(_,_)= VSConstants.S_OK
179+
member__.OnAfterOpenSolution(_,_)=
180+
let mutablesetup= Unchecked.defaultof<_>
181+
while setupQueue.TryDequeue(&setup)do
182+
setup()
183+
VSConstants.S_OK
181184

182185
member__.OnBeforeCloseProject(hier,_)=
183186
match hierwith

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -366,8 +366,6 @@ namespace rec Microsoft.VisualStudio.FSharp.ProjectSystem
366366

367367
let mutablenormalizedRefs:string[]option= None
368368

369-
let mutablebinOutputPath:string option= None
370-
371369
#if DEBUG
372370
letlogger=new Microsoft.Build.Logging.ConsoleLogger(Microsoft.Build.Framework.LoggerVerbosity.Diagnostic,
373371
(fun s-> Trace.WriteLine("MSBuild:"+ s)),
@@ -1260,7 +1258,6 @@ namespace rec Microsoft.VisualStudio.FSharp.ProjectSystem
12601258
letupdatedNormalizedRefs= flags|> Array.choose(fun flag->if flag.StartsWith("-r:")then Some flag.[3..]else None)|> Array.map(fun fn-> Path.GetFullPath(Path.Combine(x.ProjectFolder, fn)))
12611259
sourcesAndFlags<- Some(updatedNormalizedSources, flags)
12621260
normalizedRefs<- Some updatedNormalizedRefs
1263-
binOutputPath<- x.GetCurrentOutputAssembly()|> Option.ofObj
12641261

12651262
if projectSite.State= ProjectSiteOptionLifetimeState.Openingthen
12661263
// This is the first time, so set up interface for language service to talk to us
@@ -1288,7 +1285,7 @@ namespace rec Microsoft.VisualStudio.FSharp.ProjectSystem
12881285
member__.CompilationSourceFiles=match sourcesAndFlagswith None->[||]| Some(sources,_)-> sources
12891286
member__.CompilationOptions=match sourcesAndFlagswith None->[||]| Some(_,flags)-> flags
12901287
member__.CompilationReferences=match normalizedRefswith None->[||]| Some refs-> refs
1291-
member__.CompilationBinOutputPath=binOutputPath
1288+
memberx.CompilationBinOutputPath=x.GetCurrentOutputAssembly()
12921289

12931290
overridex.ComputeSourcesAndFlags()=
12941291

@@ -1410,7 +1407,9 @@ namespace rec Microsoft.VisualStudio.FSharp.ProjectSystem
14101407
member__.CompilationSourceFiles= x.CompilationSourceFiles
14111408
member__.CompilationOptions= x.CompilationOptions
14121409
member__.CompilationReferences= x.CompilationReferences
1413-
member__.CompilationBinOutputPath= x.CompilationBinOutputPath
1410+
member__.CompilationBinOutputPath=
1411+
letoutputPath= x.CompilationBinOutputPath
1412+
if String.IsNullOrWhiteSpace(outputPath)then Noneelse Some(outputPath)
14141413

14151414
member__.Description=
14161415
match sourcesAndFlagswith
@@ -1453,7 +1452,7 @@ namespace rec Microsoft.VisualStudio.FSharp.ProjectSystem
14531452
member__.CompilationSourceFiles= sourceFiles
14541453
member__.CompilationOptions= options
14551454
member__.CompilationReferences= refs
1456-
member__.CompilationBinOutputPath= outputPath
1455+
member__.CompilationBinOutputPath=if String.IsNullOrWhiteSpace(outputPath)then Noneelse Some(outputPath)
14571456
member__.ProjectFileName= projFileName
14581457
member__.BuildErrorReporter
14591458
with get()= staticBuildErrorReporter

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp