diff options
4 files changed, 34 insertions, 7 deletions
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs index d103fe3864..b971b89aa9 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs @@ -1091,7 +1091,7 @@ namespace MonoDevelop.Projects context.LogVerbosity = MSBuildVerbosity.Quiet; context.GlobalProperties.SetValue ("Silent", true); - var result = await RunTarget (monitor, "ResolveAssemblyReferences", configuration, context); + var result = await RunTargetInternal (monitor, "ResolveAssemblyReferences", configuration, context); refs = result.Items.Select (i => new AssemblyReference (i.Include, i.Metadata)).ToList (); @@ -1152,7 +1152,7 @@ namespace MonoDevelop.Projects context.LoadReferencedProjects = false; context.LogVerbosity = MSBuildVerbosity.Quiet; - var result = await RunTarget (monitor, "ResolvePackageDependenciesDesignTime", configuration, context); + var result = await RunTargetInternal (monitor, "ResolvePackageDependenciesDesignTime", configuration, context); if (result == null) return new List<PackageDependency> (); diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs index e53cda474c..7e62055fe7 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs @@ -706,7 +706,7 @@ namespace MonoDevelop.Projects ctx.BuilderQueue = BuilderQueue.ShortOperations; ctx.LogVerbosity = MSBuildVerbosity.Quiet; - var evalResult = await project.RunTarget (monitor, dependsList, config.Selector, ctx); + var evalResult = await project.RunTargetInternal (monitor, dependsList, config.Selector, ctx); if (evalResult != null && evalResult.Items != null) { result = ProcessMSBuildItems (evalResult.Items, project); } @@ -1251,6 +1251,13 @@ namespace MonoDevelop.Projects /// </param> public Task<TargetEvaluationResult> RunTarget (ProgressMonitor monitor, string target, ConfigurationSelector configuration, TargetEvaluationContext context = null) { + return BindTask<TargetEvaluationResult> (cancelToken => { + return RunTargetInternal (monitor.WithCancellationToken (cancelToken), target, configuration, context); + }); + } + + internal Task<TargetEvaluationResult> RunTargetInternal (ProgressMonitor monitor, string target, ConfigurationSelector configuration, TargetEvaluationContext context = null) + { // Initialize the evaluation context. This initialization is shared with FastCheckNeedsBuild. // Extenders will override OnConfigureTargetEvaluationContext to add custom properties and do other // initializations required by MSBuild. @@ -1865,7 +1872,7 @@ namespace MonoDevelop.Projects protected override async Task<BuildResult> OnBuild (ProgressMonitor monitor, ConfigurationSelector configuration, OperationContext operationContext) { var newContext = operationContext as TargetEvaluationContext ?? new TargetEvaluationContext (operationContext); - return (await RunTarget (monitor, "Build", configuration, newContext)).BuildResult; + return (await RunTargetInternal (monitor, "Build", configuration, newContext)).BuildResult; } async Task<TargetEvaluationResult> RunBuildTarget (ProgressMonitor monitor, ConfigurationSelector configuration, TargetEvaluationContext context) @@ -2250,7 +2257,7 @@ namespace MonoDevelop.Projects protected override async Task<BuildResult> OnClean (ProgressMonitor monitor, ConfigurationSelector configuration, OperationContext buildSession) { var newContext = buildSession as TargetEvaluationContext ?? new TargetEvaluationContext (buildSession); - return (await RunTarget (monitor, "Clean", configuration, newContext)).BuildResult; + return (await RunTargetInternal (monitor, "Clean", configuration, newContext)).BuildResult; } Task<TargetEvaluationResult> RunCleanTarget (ProgressMonitor monitor, ConfigurationSelector configuration, TargetEvaluationContext context) diff --git a/main/tests/MonoDevelop.Core.Tests/MonoDevelop.Projects/BuilderManagerTests.cs b/main/tests/MonoDevelop.Core.Tests/MonoDevelop.Projects/BuilderManagerTests.cs index cc42ef821c..587dc1d870 100644 --- a/main/tests/MonoDevelop.Core.Tests/MonoDevelop.Projects/BuilderManagerTests.cs +++ b/main/tests/MonoDevelop.Core.Tests/MonoDevelop.Projects/BuilderManagerTests.cs @@ -382,8 +382,8 @@ namespace MonoDevelop.Projects InitBuildSyncEvent (project1); - // Start the build. Use RunTarget to avoid the BindTask which will cancel the build on project dispose. - var build1 = project1.RunTarget (Util.GetMonitor (), "Build", sol.Configurations [0].Selector); + // Start the build. Use RunTargetInternal to avoid the BindTask which will cancel the build on project dispose. + var build1 = project1.RunTargetInternal (Util.GetMonitor (), "Build", sol.Configurations [0].Selector); // Wait for the build to reach the sync task await WaitForBuildSyncEvent (project1); diff --git a/main/tests/MonoDevelop.Core.Tests/MonoDevelop.Projects/ProjectTests.cs b/main/tests/MonoDevelop.Core.Tests/MonoDevelop.Projects/ProjectTests.cs index df33a38130..0d5daeedcd 100644 --- a/main/tests/MonoDevelop.Core.Tests/MonoDevelop.Projects/ProjectTests.cs +++ b/main/tests/MonoDevelop.Core.Tests/MonoDevelop.Projects/ProjectTests.cs @@ -1098,6 +1098,26 @@ namespace MonoDevelop.Projects } [Test] + public async Task ProjectDisposed_RunTarget_NullReferenceExceptionNotThrown () + { + string solFile = Util.GetSampleProject ("console-project", "ConsoleProject.sln"); + var sol = (Solution)await Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solFile); + + var p = (DotNetProject)sol.Items [0]; + sol.Dispose (); + + Assert.IsNull (p.MSBuildProject); + + try { + // RunTarget should fail since BindTask will not register a task after Project has been disposed + await p.RunTarget (Util.GetMonitor (), "ResolveAssemblyReferences", ConfigurationSelector.Default); + Assert.Fail ("Should not reach here."); + } catch (TaskCanceledException) { + // Expected exception. + } + } + + [Test] public async Task ProjectExtensionOnModifiedCalledWhenProjectModified () { var fn = new CustomItemNode<TestModifiedProjectExtension> (); |