Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs4
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs13
-rw-r--r--main/tests/MonoDevelop.Core.Tests/MonoDevelop.Projects/BuilderManagerTests.cs4
-rw-r--r--main/tests/MonoDevelop.Core.Tests/MonoDevelop.Projects/ProjectTests.cs20
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> ();