From bc0976245e6ba2038cc73f3935bc43a69d1e280d Mon Sep 17 00:00:00 2001 From: HeeJae Chang Date: Wed, 14 Nov 2018 14:31:56 -0800 Subject: [PATCH] add output paths as one of causes to reanalyze solution cralwer. output paths are not specifically affecting semantics of code but some analyzer such as source based test discovery requires it to generate correct data. so they want to be re-analyzed when those are changed as well. since output path are rarely get changed. decide to add it as one of cause to reanalyze projects. --- .../SolutionCrawler/WorkCoordinatorTests.cs | 36 +++++++++++++++++++ .../SolutionCrawler/WorkCoordinator.cs | 4 ++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/EditorFeatures/Test/SolutionCrawler/WorkCoordinatorTests.cs b/src/EditorFeatures/Test/SolutionCrawler/WorkCoordinatorTests.cs index 7db4cad25dcb9..9954a728857aa 100644 --- a/src/EditorFeatures/Test/SolutionCrawler/WorkCoordinatorTests.cs +++ b/src/EditorFeatures/Test/SolutionCrawler/WorkCoordinatorTests.cs @@ -286,6 +286,42 @@ public async Task Project_AnalyzerOptions_Change() } } + [Fact] + public async Task Project_OutputFilePath_Change() + { + using (var workspace = new WorkCoordinatorWorkspace(SolutionCrawler)) + { + var solutionInfo = GetInitialSolutionInfo_2Projects_10Documents(workspace); + workspace.OnSolutionAdded(solutionInfo); + await WaitWaiterAsync(workspace.ExportProvider); + + var projectId = workspace.CurrentSolution.Projects.First(p => p.Name == "P1").Id; + var newSolution = workspace.CurrentSolution.WithProjectOutputFilePath(projectId, "/newPath"); + var worker = await ExecuteOperation(workspace, w => w.ChangeProject(projectId, newSolution)); + + Assert.Equal(5, worker.SyntaxDocumentIds.Count); + Assert.Equal(5, worker.DocumentIds.Count); + } + } + + [Fact] + public async Task Project_OutputRefFilePath_Change() + { + using (var workspace = new WorkCoordinatorWorkspace(SolutionCrawler)) + { + var solutionInfo = GetInitialSolutionInfo_2Projects_10Documents(workspace); + workspace.OnSolutionAdded(solutionInfo); + await WaitWaiterAsync(workspace.ExportProvider); + + var projectId = workspace.CurrentSolution.Projects.First(p => p.Name == "P1").Id; + var newSolution = workspace.CurrentSolution.WithProjectOutputRefFilePath(projectId, "/newPath"); + var worker = await ExecuteOperation(workspace, w => w.ChangeProject(projectId, newSolution)); + + Assert.Equal(5, worker.SyntaxDocumentIds.Count); + Assert.Equal(5, worker.DocumentIds.Count); + } + } + [Fact] public async Task Test_NeedsReanalysisOnOptionChanged() { diff --git a/src/Features/Core/Portable/SolutionCrawler/WorkCoordinator.cs b/src/Features/Core/Portable/SolutionCrawler/WorkCoordinator.cs index d529fef348129..3fefa1cd4481c 100644 --- a/src/Features/Core/Portable/SolutionCrawler/WorkCoordinator.cs +++ b/src/Features/Core/Portable/SolutionCrawler/WorkCoordinator.cs @@ -506,7 +506,9 @@ private async Task EnqueueProjectConfigurationChangeWorkItemAsync(ProjectChanges !object.Equals(oldProject.AssemblyName, newProject.AssemblyName) || !object.Equals(oldProject.Name, newProject.Name) || !object.Equals(oldProject.AnalyzerOptions, newProject.AnalyzerOptions) || - !object.Equals(oldProject.DefaultNamespace, newProject.DefaultNamespace)) + !object.Equals(oldProject.DefaultNamespace, newProject.DefaultNamespace) || + !object.Equals(oldProject.OutputFilePath, newProject.OutputFilePath) || + !object.Equals(oldProject.OutputRefFilePath, newProject.OutputRefFilePath)) { projectConfigurationChange = projectConfigurationChange.With(InvocationReasons.ProjectConfigurationChanged); }