From d5f71191352b9b37f335dc76230a3e63f08618e1 Mon Sep 17 00:00:00 2001 From: Heejae Chang Date: Thu, 15 Nov 2018 12:29:58 -0800 Subject: [PATCH] add output paths as one of causes to reanalyze solution cralwer. (#31181) 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); }