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:
authorLluis Sanchez Gual <lluis@xamarin.com>2014-05-05 22:43:47 +0400
committerLluis Sanchez <lluis@xamarin.com>2014-05-05 22:46:40 +0400
commita2c688cdabf3e19598178ddca5dc88f875f45302 (patch)
tree2d67cc70dd51cd56114bdc91936b38243bbfc61e
parentea6a454f1af1af09dd11b1441507fae2dc0a8414 (diff)
Fix default startup project issuemonodevelop-5.0.0.840
When a project is added to a solution, if that project supports execution and there no valid startup project for the solution, set the new project as startup. Added new SupportsExecute method for checking if a project supports execution or not. CanExcute can't be used to check that since this method depends on the configuration, target and other properties. Fixes 19502 - iOS project added to Shared Asset only solution cannot be compiled
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs5
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectService.cs10
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectServiceExtension.cs28
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs5
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionItem.cs12
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/WorkspaceItem.cs10
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/ConfigurationMerger.cs1
-rw-r--r--main/tests/UnitTests/MonoDevelop.Projects/SharedAssetsProjectTests.cs20
8 files changed, 90 insertions, 1 deletions
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs
index 281d3ef7cf..c56f52a198 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs
@@ -99,6 +99,11 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
return false;
}
+ internal protected override bool OnGetSupportsExecute ()
+ {
+ return false;
+ }
+
protected override void OnBoundToSolution ()
{
if (currentSolution != null) {
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectService.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectService.cs
index 3b4b21a2e9..2679c9d0f4 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectService.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectService.cs
@@ -709,6 +709,16 @@ namespace MonoDevelop.Projects
throw new InvalidOperationException ("Unknown item type: " + item);
}
+ public override bool SupportsExecute (IBuildTarget item)
+ {
+ if (item is WorkspaceItem)
+ return ((WorkspaceItem)item).OnGetSupportsExecute ();
+ else if (item is SolutionItem)
+ return ((SolutionItem)item).OnGetSupportsExecute ();
+ else
+ throw new InvalidOperationException ("Unknown item type: " + item);
+ }
+
public override void Execute (IProgressMonitor monitor, IBuildTarget item, ExecutionContext context, ConfigurationSelector configuration)
{
if (item is SolutionEntityItem) {
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectServiceExtension.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectServiceExtension.cs
index 245eb658c3..476081baf6 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectServiceExtension.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectServiceExtension.cs
@@ -156,6 +156,34 @@ namespace MonoDevelop.Projects
return GetNext (item).SupportsTarget ((IBuildTarget) item, target);
}
+ public virtual bool SupportsExecute (IBuildTarget item)
+ {
+ if (item is SolutionEntityItem)
+ return SupportsExecute ((SolutionEntityItem)item);
+ else if (item is WorkspaceItem)
+ return SupportsExecute ((WorkspaceItem) item);
+ else
+ return GetNext (item).SupportsExecute (item);
+ }
+
+ protected virtual bool SupportsExecute (SolutionEntityItem item)
+ {
+ return GetNext (item).SupportsExecute ((IBuildTarget) item);
+ }
+
+ protected virtual bool SupportsExecute (Solution solution)
+ {
+ return GetNext (solution).SupportsExecute ((IBuildTarget) solution);
+ }
+
+ protected virtual bool SupportsExecute (WorkspaceItem item)
+ {
+ if (item is Solution)
+ return SupportsExecute ((Solution) item);
+ else
+ return GetNext (item).SupportsExecute ((IBuildTarget) item);
+ }
+
protected virtual void Clean (IProgressMonitor monitor, IBuildTarget item, ConfigurationSelector configuration)
{
if (item is SolutionEntityItem)
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs
index 09f023d53c..af3754530c 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs
@@ -124,7 +124,7 @@ namespace MonoDevelop.Projects
if (startupItem == null && singleStartup) {
ReadOnlyCollection<SolutionEntityItem> its = GetAllSolutionItems<SolutionEntityItem> ();
if (its.Count > 0)
- startupItem = its [0];
+ startupItem = its.FirstOrDefault (it => it.SupportsExecute ());
}
return startupItem;
}
@@ -666,6 +666,9 @@ namespace MonoDevelop.Projects
// Register the new entry in every solution configuration
foreach (SolutionConfiguration conf in Configurations)
conf.AddItem (eitem);
+ // If there is no startup project or it is an invalid one, use the new project as startup if possible
+ if ((StartupItem == null || !StartupItem.SupportsExecute ()) && eitem.SupportsExecute ())
+ StartupItem = eitem;
} else {
// Reuse the configuration information of the replaced item
foreach (SolutionConfiguration conf in Configurations)
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionItem.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionItem.cs
index 2bbab1c45e..dd9f434cdf 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionItem.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionItem.cs
@@ -483,6 +483,11 @@ namespace MonoDevelop.Projects
return SupportsTarget (ProjectService.BuildTarget);
}
+ public bool SupportsExecute ()
+ {
+ return Services.ProjectService.GetExtensionChain (this).SupportsExecute (this);
+ }
+
/// <summary>
/// Cleans the files produced by this solution item
/// </summary>
@@ -664,6 +669,8 @@ namespace MonoDevelop.Projects
/// </param>
public bool CanExecute (ExecutionContext context, ConfigurationSelector configuration)
{
+ if (!SupportsExecute ())
+ return false;
return Services.ProjectService.GetExtensionChain (this).CanExecute (this, context, configuration);
}
@@ -1060,6 +1067,11 @@ namespace MonoDevelop.Projects
return true;
}
+ internal protected virtual bool OnGetSupportsExecute ()
+ {
+ return true;
+ }
+
/// <summary>
/// Determines whether this solution item can be executed using the specified context and configuration.
/// </summary>
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/WorkspaceItem.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/WorkspaceItem.cs
index c9f0169080..27fa88ae0c 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/WorkspaceItem.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/WorkspaceItem.cs
@@ -267,6 +267,11 @@ namespace MonoDevelop.Projects
return Services.ProjectService.GetExtensionChain (this).SupportsTarget (this, target);
}
+ public bool SupportsExecute ()
+ {
+ return Services.ProjectService.GetExtensionChain (this).SupportsExecute (this);
+ }
+
public BuildResult Build (IProgressMonitor monitor, string configuration)
{
return InternalBuild (monitor, (SolutionConfigurationSelector) configuration);
@@ -421,6 +426,11 @@ namespace MonoDevelop.Projects
return true;
}
+ internal protected virtual bool OnGetSupportsExecute ()
+ {
+ return true;
+ }
+
protected virtual void OnClean (IProgressMonitor monitor, ConfigurationSelector configuration)
{
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/ConfigurationMerger.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/ConfigurationMerger.cs
index d32eb80443..b111883203 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/ConfigurationMerger.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/ConfigurationMerger.cs
@@ -126,6 +126,7 @@ namespace MonoDevelop.Components.MainToolbar
// There is no startup project, just use all solution configurations in this case
var p = new TargetPartition ();
p.SolutionConfigurations.AddRange (sol.GetConfigurations ());
+ partitions.Add (p);
}
// There can be several configurations with the same prefix and different platform but which build the same projects.
diff --git a/main/tests/UnitTests/MonoDevelop.Projects/SharedAssetsProjectTests.cs b/main/tests/UnitTests/MonoDevelop.Projects/SharedAssetsProjectTests.cs
index 871679f075..c4784267cc 100644
--- a/main/tests/UnitTests/MonoDevelop.Projects/SharedAssetsProjectTests.cs
+++ b/main/tests/UnitTests/MonoDevelop.Projects/SharedAssetsProjectTests.cs
@@ -263,6 +263,26 @@ namespace MonoDevelop.Projects
Assert.AreEqual (refSharedProjectXml, sharedProjectXml);
Assert.AreEqual (refSharedProjectItemsXml, sharedProjectItemsXml);
}
+
+ [Test]
+ public void SharedProjectCantBeStartup ()
+ {
+ var sol = new Solution ();
+ var shared = new SharedAssetsProject ();
+
+ // Shared projects are not executable
+ Assert.IsFalse (shared.SupportsExecute ());
+
+ sol.RootFolder.AddItem (shared);
+
+ // The shared project is not executable, so it shouldn't be set as startup by default
+ Assert.IsNull (sol.StartupItem);
+
+ // An executable project is set as startup by default when there is no startup project
+ DotNetAssemblyProject project = new DotNetAssemblyProject ("C#");
+ sol.RootFolder.AddItem (project);
+ Assert.IsTrue (sol.StartupItem == project);
+ }
}
}