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

Commit03fb5b8

Browse files
dsymedsyme
dsyme
authored and
dsyme
committed
fix 3033 - make projects known to roslyn
1 parent64eb7dc commit03fb5b8

File tree

15 files changed

+647
-198
lines changed

15 files changed

+647
-198
lines changed

‎VisualFSharp.sln‎

Lines changed: 454 additions & 4 deletions
Large diffs are not rendered by default.

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

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ type internal FSharpProjectOptionsManager
149149
this.AddOrUpdateProject(projectId,(fun isRefresh->
150150
letextraProjectInfo= Some(box workspace)
151151
lettryGetOptionsForReferencedProject f= f|> tryGetOrCreateProjectId|> Option.bind this.TryGetOptionsForProject
152-
letreferencedProjects,options= ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, site.ProjectFileName(), extraProjectInfo, serviceProvider,true)
152+
letreferencedProjects,options= ProjectSitesAndFiles.GetProjectOptionsForProjectSite(Settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, tryGetOptionsForReferencedProject, site, site.ProjectFileName, extraProjectInfo, serviceProvider,true)
153153
letreferencedProjectIds= referencedProjects|> Array.choose tryGetOrCreateProjectId
154154
checkerProvider.Checker.InvalidateConfiguration(options, startBackgroundCompileIfAlreadySeen=not isRefresh, userOpName= userOpName+".UpdateProjectInfo")
155155
referencedProjectIds, options))
@@ -352,7 +352,9 @@ and
352352
whiletruedo
353353
let!siteProvider= inbox.Receive()
354354
do! Async.SwitchToContext ctx
355-
this.SetupProjectFile(siteProvider, this.Workspace,"SetupProjectsAfterSolutionOpen")}
355+
this.SetupProjectFile(siteProvider, this.Workspace,"SetupProjectsAfterSolutionOpen")
356+
do! Async.SwitchToThreadPool()
357+
}
356358

357359
use _= Events.SolutionEvents.OnAfterOpenProject|> Observable.subscribe(fun args->
358360
match args.Hierarchywith
@@ -367,41 +369,47 @@ and
367369
lettheme= package.ComponentModel.DefaultExportProvider.GetExport<ISetThemeColors>().Value
368370
theme.SetColors()
369371

370-
/// Sync the information for the project
371-
memberthis.SyncProject(project:AbstractProject,projectContext:IWorkspaceProjectContext,site:IProjectSite,workspace,forceUpdate,userOpName)=
372+
/// Sync the Roslyn information for the project held in 'projectContext' to match the information given by 'site'.
373+
/// Also sync the info in ProjectInfoManager if necessary.
374+
memberthis.SyncProject(project:AbstractProject,projectContext:IWorkspaceProjectContext,site:IProjectSite,workspace,userOpName)=
372375
letwellFormedFilePathSetIgnoreCase(paths:seq<string>)=
373-
HashSet(paths|> Seq.filter isPathWellFormed|> Seq.map(fun s->trySystem.IO.Path.GetFullPath(s)with_-> s), StringComparer.OrdinalIgnoreCase)
376+
HashSet(paths|> Seq.filter isPathWellFormed|> Seq.map(fun s->try Path.GetFullPath(s)with_-> s), StringComparer.OrdinalIgnoreCase)
374377

375-
letupdatedFiles= site.SourceFilesOnDisk()|> wellFormedFilePathSetIgnoreCase
378+
// Sync the source files in projectContext. Note that these source files are __not__ maintained in order in projectContext
379+
// as edits are made. It seems this is ok because the source file list is only used to drive roslyn per-file checking.
380+
letupdatedFiles= site.CompilationSourceFiles|> wellFormedFilePathSetIgnoreCase
376381
letoriginalFiles= project.GetCurrentDocuments()|> Seq.map(fun file-> file.FilePath)|> wellFormedFilePathSetIgnoreCase
377382

378-
let mutableupdated= forceUpdate
379-
380383
for filein updatedFilesdo
381384
ifnot(originalFiles.Contains(file))then
382385
projectContext.AddSourceFile(file)
383-
updated<-true
384386

385387
for filein originalFilesdo
386388
ifnot(updatedFiles.Contains(file))then
387389
projectContext.RemoveSourceFile(file)
388-
updated<-true
389390

390-
letupdatedRefs= site.AssemblyReferences()|> wellFormedFilePathSetIgnoreCase
391+
// Update the output assembly path projectContext.
392+
letupdatedBinOutputPath= site.CompilationBinOutputPath|> Option.toObj
393+
letoriginalBinOutputPath= projectContext.BinOutputPath
394+
if updatedBinOutputPath<> originalBinOutputPaththen
395+
projectContext.BinOutputPath<- updatedBinOutputPath
396+
397+
// Update the metadata/project references in projectContext. Note that AbstractProject.cs converts metadata references
398+
// to project references automagically by consulting the project tracker.
399+
letupdatedRefs= site.CompilationReferences|> wellFormedFilePathSetIgnoreCase
391400
letoriginalRefs= project.GetCurrentMetadataReferences()|> Seq.map(fun ref-> ref.FilePath)|> wellFormedFilePathSetIgnoreCase
392401

393402
for refin updatedRefsdo
394403
ifnot(originalRefs.Contains(ref))then
395404
projectContext.AddMetadataReference(ref, MetadataReferenceProperties.Assembly)
396-
updated<-true
397405

398406
for refin originalRefsdo
399407
ifnot(updatedRefs.Contains(ref))then
400408
projectContext.RemoveMetadataReference(ref)
401-
updated<-true
402409

410+
// Update the project options association
403411
letok,originalOptions= optionsAssociation.TryGetValue(projectContext)
404-
letupdatedOptions= site.CompilerFlags()
412+
letupdatedOptions= site.CompilationOptions
405413
ifnot ok|| originalOptions<> updatedOptionsthen
406414

407415
// OK, project options have changed, try to fake out Roslyn to convince it to reparse things.
@@ -417,23 +425,19 @@ and
417425
if okthen optionsAssociation.Remove(projectContext)|> ignore
418426
optionsAssociation.Add(projectContext, updatedOptions)
419427

420-
updated<-true
421-
422428
// update the cached options
423-
if updatedthen
424-
projectInfoManager.UpdateProjectInfo(tryGetOrCreateProjectId workspace, project.Id, site, project.Workspace, userOpName+".SyncProject")
429+
projectInfoManager.UpdateProjectInfo(tryGetOrCreateProjectId workspace, project.Id, site, project.Workspace, userOpName+".SyncProject")
425430

426431
memberthis.SetupProjectFile(siteProvider:IProvideProjectSite,workspace:VisualStudioWorkspaceImpl,userOpName)=
427432
letuserOpName= userOpName+".SetupProjectFile"
428433
let recsetup(site:IProjectSite)=
429434
letprojectGuid= Guid(site.ProjectGuid)
430-
letprojectFileName= site.ProjectFileName()
435+
letprojectFileName= site.ProjectFileName
431436
letprojectDisplayName= projectDisplayNameOf projectFileName
432437

433438
letprojectId= workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName)
434439

435440
if isNull(workspace.ProjectTracker.GetProject projectId)then
436-
projectInfoManager.UpdateProjectInfo(tryGetOrCreateProjectId workspace, projectId, site, workspace, userOpName)
437441
letprojectContextFactory= package.ComponentModel.GetService<IWorkspaceProjectContextFactory>();
438442
leterrorReporter= ProjectExternalErrorReporter(projectId,"FS", this.SystemServiceProvider)
439443

@@ -449,16 +453,22 @@ and
449453

450454
letprojectContext=
451455
projectContextFactory.CreateProjectContext(
452-
FSharpConstants.FSharpLanguageName, projectDisplayName, projectFileName, projectGuid, hierarchy,null, errorReporter)
456+
FSharpConstants.FSharpLanguageName,
457+
projectDisplayName,
458+
projectFileName,
459+
projectGuid,
460+
hierarchy,
461+
Option.toObj site.CompilationBinOutputPath,
462+
errorReporter)
453463

454464
letproject= projectContext:?> AbstractProject
455465

456-
this.SyncProject(project, projectContext, site, workspace,forceUpdate=false,userOpName=userOpName)
466+
this.SyncProject(project, projectContext, site, workspace, userOpName=userOpName)
457467

458468
site.BuildErrorReporter<- Some(errorReporter:> Microsoft.VisualStudio.Shell.Interop.IVsLanguageServiceBuildErrorReporter2)
459469

460470
site.AdviseProjectSiteChanges(FSharpConstants.FSharpLanguageServiceCallbackName,
461-
AdviseProjectSiteChanges(fun()-> this.SyncProject(project, projectContext, site, workspace,forceUpdate=true,userOpName="AdviseProjectSiteChanges."+userOpName)))
471+
AdviseProjectSiteChanges(fun()-> this.SyncProject(project, projectContext, site, workspace, userOpName="AdviseProjectSiteChanges."+userOpName)))
462472
site.AdviseProjectSiteClosed(FSharpConstants.FSharpLanguageServiceCallbackName,
463473
AdviseProjectSiteChanges(fun()->
464474
projectInfoManager.ClearInfoForProject(project.Id)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ type internal FSharpLanguageServiceBackgroundRequests_DEPRECATED
9999
letprojectSite= ProjectSitesAndFiles.CreateProjectSiteForScript(fileName, referencedProjectFileNames, checkOptions)
100100
{ ProjectSite= projectSite
101101
CheckOptions= checkOptions
102-
ProjectFileName= projectSite.ProjectFileName()
102+
ProjectFileName= projectSite.ProjectFileName
103103
FSharpChecker= checker
104104
Colorizer=lazy getColorizer(view)}
105105
Some data
@@ -109,7 +109,7 @@ type internal FSharpLanguageServiceBackgroundRequests_DEPRECATED
109109
letprojectSite= getProjectSitesAndFiles().FindOwningProject_DEPRECATED(rdt,fileName)
110110
letenableInMemoryCrossProjectReferences=true
111111
let_,checkOptions= ProjectSitesAndFiles.GetProjectOptionsForProjectSite(enableInMemoryCrossProjectReferences,(fun _-> None), projectSite, fileName, None, getServiceProvider(),false)
112-
letprojectFileName= projectSite.ProjectFileName()
112+
letprojectFileName= projectSite.ProjectFileName
113113
letdata=
114114
{ ProjectSite= projectSite
115115
CheckOptions= checkOptions

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ type internal FSharpSource_DEPRECATED(service:LanguageService_DEPRECATED, textLi
350350
[|
351351
match iSource.ProjectSitewith
352352
| Some pi->
353-
yield! pi.CompilerFlags()|> Array.filter(fun flag-> flag.StartsWith("--define:"))
353+
yield! pi.CompilationOptions|> Array.filter(fun flag-> flag.StartsWith("--define:"))
354354
| None->()
355355
yield"--noframework"
356356

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

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,32 @@ type internal IProvideProjectSite =
1717
andinternalIProjectSite=
1818

1919
/// List of files in the project. In the correct order.
20-
abstractSourceFilesOnDisk :unit->string[]
20+
abstractCompilationSourceFiles :string[]
2121

22-
/// Flags that the compiler would need to understand how to compile.
23-
abstractCompilerFlags :unit->string[]
22+
/// Flags that the compiler would need to understand how to compile. Includes '-r'
23+
/// options but not source files
24+
abstractCompilationOptions :string[]
25+
26+
/// The normalized '-r:' assembly references, without the '-r:'
27+
abstractCompilationReferences :string[]
28+
29+
/// The '-o:' output bin path, without the '-o:'
30+
abstractCompilationBinOutputPath :stringoption
2431

2532
/// Register for notifications for when the above change
26-
abstractAdviseProjectSiteChanges :(*callbackOwnerKey*)string*AdviseProjectSiteChanges->unit
33+
abstractAdviseProjectSiteChanges : callbackOwnerKey:string*AdviseProjectSiteChanges->unit
2734

2835
/// Register for notifications when project is cleaned/rebuilt (and thus any live TypeProviders should be refreshed)
29-
abstractAdviseProjectSiteCleaned :(*callbackOwnerKey*)string*AdviseProjectSiteChanges->unit
36+
abstractAdviseProjectSiteCleaned : callbackOwnerKey:string*AdviseProjectSiteChanges->unit
3037

3138
// Register for notifications when project is closed.
32-
abstractAdviseProjectSiteClosed :(*callbackOwnerKey*)string*AdviseProjectSiteChanges->unit
39+
abstractAdviseProjectSiteClosed : callbackOwnerKey:string*AdviseProjectSiteChanges->unit
3340

3441
/// A user-friendly description of the project. Used only for developer/DEBUG tooltips and such.
35-
abstractDescriptionOfProject :unit->string
42+
abstractDescription :string
3643

3744
/// The name of the project file.
38-
abstractProjectFileName :unit->string
45+
abstractProjectFileName :string
3946

4047
/// The error list task reporter
4148
abstractBuildErrorReporter :Microsoft.VisualStudio.Shell.Interop.IVsLanguageServiceBuildErrorReporter2optionwith get, set
@@ -55,4 +62,4 @@ and internal IProjectSite =
5562

5663
abstractProjectProvider :IProvideProjectSiteoption
5764

58-
abstractAssemblyReferences :unit->string[]
65+

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

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,14 @@ type private IHaveCheckOptions =
4949
/// Convert from FSharpProjectOptions into IProjectSite.
5050
typeprivateProjectSiteOfScriptFile(filename:string,referencedProjectFileNames,checkOptions: FSharpProjectOptions)=
5151
interface IProjectSitewith
52-
overridethis.SourceFilesOnDisk()= checkOptions.SourceFiles
53-
overridethis.DescriptionOfProject()= sprintf"Script Closure at Root%s" filename
54-
overridethis.CompilerFlags()= checkOptions.OtherOptions
55-
overridethis.ProjectFileName()= checkOptions.ProjectFileName
52+
overridethis.Description= sprintf"Script Closure at Root%s" filename
53+
overridethis.CompilationSourceFiles= checkOptions.SourceFiles
54+
overridethis.CompilationOptions= checkOptions.OtherOptions
55+
overridethis.CompilationReferences=
56+
checkOptions.OtherOptions
57+
|> Array.choose(fun flag->if flag.StartsWith("-r:")then Some flag.[3..]else None)
58+
overridethis.CompilationBinOutputPath= None
59+
overridethis.ProjectFileName= checkOptions.ProjectFileName
5660
overridethis.BuildErrorReporterwith get()= Noneandset _v=()
5761
overridethis.AdviseProjectSiteChanges(_,_)=()
5862
overridethis.AdviseProjectSiteCleaned(_,_)=()
@@ -62,7 +66,6 @@ type private ProjectSiteOfScriptFile(filename:string, referencedProjectFileNames
6266
overridethis.ProjectGuid=""
6367
overridethis.LoadTime= checkOptions.LoadTime
6468
overridethis.ProjectProvider= None
65-
overridethis.AssemblyReferences()=[||]
6669

6770
interface IHaveCheckOptionswith
6871
overridethis.OriginalCheckOptions()=(referencedProjectFileNames, checkOptions)
@@ -73,7 +76,7 @@ type private ProjectSiteOfScriptFile(filename:string, referencedProjectFileNames
7376
/// By design, these are never going to typecheck because there is no affiliated references.
7477
/// We show many squiggles in this case because they're not particularly informational.
7578
typeprivateProjectSiteOfSingleFile(sourceFile)=
76-
//CompilerFlags() gets called a lot, so pre-compute what we can
79+
//CompilationOptions gets called a lot, so pre-compute what we can
7780
static letcompilerFlags=
7881
letflags=["--noframework";"--warn:3"]
7982
letassumeDotNetFramework=true
@@ -85,10 +88,12 @@ type private ProjectSiteOfSingleFile(sourceFile) =
8588
letprojectFileName= sourceFile+".orphan.fsproj"
8689

8790
interface IProjectSitewith
88-
overridethis.SourceFilesOnDisk()=[|sourceFile|]
89-
overridethis.DescriptionOfProject()="Orphan File Project"
90-
overridethis.CompilerFlags()= compilerFlags
91-
overridethis.ProjectFileName()= projectFileName
91+
overridethis.Description= projectFileName
92+
overridethis.CompilationSourceFiles=[|sourceFile|]
93+
overridethis.CompilationOptions= compilerFlags
94+
overridethis.CompilationReferences= compilerFlags|> Array.choose(fun flag->if flag.StartsWith("-r:")then Some flag.[3..]else None)
95+
overridethis.CompilationBinOutputPath= None
96+
overridethis.ProjectFileName= projectFileName
9297
overridethis.BuildErrorReporterwith get()= Noneandset _v=()
9398
overridethis.AdviseProjectSiteChanges(_,_)=()
9499
overridethis.AdviseProjectSiteCleaned(_,_)=()
@@ -98,7 +103,6 @@ type private ProjectSiteOfSingleFile(sourceFile) =
98103
overridethis.ProjectGuid=""
99104
overridethis.LoadTime=new DateTime(2000,1,1)// any constant time is fine, orphan files do not interact with reloading based on update time
100105
overridethis.ProjectProvider= None
101-
overridethis.AssemblyReferences()=[||]
102106

103107
overridex.ToString()= sprintf"ProjectSiteOfSingleFile(%s)" sourceFile
104108

@@ -174,9 +178,9 @@ type internal ProjectSitesAndFiles() =
174178
else[||],[||]
175179

176180
letoptions=
177-
{ProjectFileName= projectSite.ProjectFileName()
178-
SourceFiles= projectSite.SourceFilesOnDisk()
179-
OtherOptions= projectSite.CompilerFlags()
181+
{ProjectFileName= projectSite.ProjectFileName
182+
SourceFiles= projectSite.CompilationSourceFiles
183+
OtherOptions= projectSite.CompilationOptions
180184
ReferencedProjects= referencedProjectOptions
181185
IsIncompleteTypeCheckEnvironment= projectSite.IsIncompleteTypeCheckEnvironment
182186
UseScriptResolutionRules= SourceFile.MustBeSingleFileProject fileName
@@ -259,7 +263,7 @@ type internal ProjectSitesAndFiles() =
259263
| Some site-> site
260264
| None-> ProjectSitesAndFiles.ProjectSiteOfSingleFile(filename)
261265

262-
CompilerEnvironment.GetCompilationDefinesForEditing(filename,site.CompilerFlags()|> Array.toList)
266+
CompilerEnvironment.GetCompilationDefinesForEditing(filename,site.CompilationOptions|> Array.toList)
263267

264268

265269
memberart.TryFindOwningProject_DEPRECATED(rdt:IVsRunningDocumentTable,filename)=
@@ -269,11 +273,7 @@ type internal ProjectSitesAndFiles() =
269273
| Some(hier,_textLines)->
270274
match tryGetProjectSite(hier)with
271275
| Some(site)->
272-
#if DEBUG
273-
for srcin site.SourceFilesOnDisk()do
274-
Debug.Assert(Path.GetFullPath(src)= src,"SourceFilesOnDisk reported a filename that was not in canonical format")
275-
#endif
276-
if site.SourceFilesOnDisk()|> Array.exists(fun src-> StringComparer.OrdinalIgnoreCase.Equals(src,filename))then
276+
if site.CompilationSourceFiles|> Array.exists(fun src-> StringComparer.OrdinalIgnoreCase.Equals(src,filename))then
277277
Some site
278278
else
279279
None

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp