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
path: root/main
diff options
context:
space:
mode:
authorLluis Sanchez Gual <lluis@xamarin.com>2013-08-21 14:51:08 +0400
committerLluis Sanchez Gual <lluis@xamarin.com>2013-08-27 20:05:22 +0400
commit6e1037d71191077ff5ef920107d81258d4abb4d3 (patch)
treebb288af6c7b6c9a4929da0acacae4e78c2af9dfb /main
parentc2a5b8ecde248ffa0c587ff1ed1b2e60de3036dc (diff)
Revert "Revert "MSBuild support fixes""
This reverts commit 77beefd0e767d941f3d2f90eb64d2a4d68313afc. Conflicts: main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs
Diffstat (limited to 'main')
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ISolutionItemHandler.cs8
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/SolutionItemHandler.cs4
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildHandler.cs4
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProject.cs8
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs36
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/RemoteProjectBuilder.cs5
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionFolder.cs4
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionItem.cs1
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.cs19
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/IProjectBuilder.cs1
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ProjectBuilder.cs12
11 files changed, 94 insertions, 8 deletions
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ISolutionItemHandler.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ISolutionItemHandler.cs
index 3fe2ca2901..adef0bf5d4 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ISolutionItemHandler.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ISolutionItemHandler.cs
@@ -72,5 +72,13 @@ namespace MonoDevelop.Projects.Extensions
/// Unique and immutable identifier of the solution item inside the solution
/// </summary>
string ItemId { get; }
+
+ /// <summary>
+ /// Notifies that this solution item has been modified
+ /// </summary>
+ /// <param name='hint'>
+ /// Hint about which part of the solution item has been modified. This will typically be the property name.
+ /// </param>
+ void OnModified (string hint);
}
}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/SolutionItemHandler.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/SolutionItemHandler.cs
index 74bc882e00..56391bd52f 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/SolutionItemHandler.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/SolutionItemHandler.cs
@@ -78,5 +78,9 @@ namespace MonoDevelop.Projects.Extensions
public abstract string ItemId { get; }
public abstract void Save (IProgressMonitor monitor);
+
+ public virtual void OnModified (string hint)
+ {
+ }
}
}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildHandler.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildHandler.cs
index 997d89402c..b054d44061 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildHandler.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildHandler.cs
@@ -135,6 +135,10 @@ namespace MonoDevelop.Projects.Formats.MSBuild
throw new NotSupportedException ();
}
+ public virtual void OnModified (string hint)
+ {
+ }
+
public virtual void Dispose ()
{
}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProject.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProject.cs
index 440d77e341..f5f6f3e17d 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProject.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProject.cs
@@ -141,6 +141,12 @@ namespace MonoDevelop.Projects.Formats.MSBuild
public void Save (string fileName)
{
+ string content = SaveToString ();
+ TextFile.WriteFile (fileName, content, bom, true);
+ }
+
+ public string SaveToString ()
+ {
// StringWriter.Encoding always returns UTF16. We need it to return UTF8, so the
// XmlDocument will write the UTF8 header.
ProjectWriter sw = new ProjectWriter (bom);
@@ -151,7 +157,7 @@ namespace MonoDevelop.Projects.Formats.MSBuild
if (endsWithEmptyLine && !content.EndsWith (newLine))
content += newLine;
- TextFile.WriteFile (fileName, content, bom, true);
+ return content;
}
public string DefaultTargets {
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs
index 4504b81126..c4c4017d48 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs
@@ -42,6 +42,7 @@ using Mono.Addins;
using System.Linq;
using MonoDevelop.Core.Instrumentation;
using System.Text;
+using MonoDevelop.Core.ProgressMonitoring;
namespace MonoDevelop.Projects.Formats.MSBuild
{
@@ -56,6 +57,7 @@ namespace MonoDevelop.Projects.Formats.MSBuild
string lastBuildRuntime;
string lastFileName;
ITimeTracker timer;
+ bool modifiedInMemory;
struct ItemInfo {
public MSBuildItem Item;
@@ -137,6 +139,11 @@ namespace MonoDevelop.Projects.Formats.MSBuild
lastBuildRuntime = runtime.Id;
lastFileName = item.FileName;
}
+ else if (modifiedInMemory) {
+ modifiedInMemory = false;
+ var p = SaveProject (new NullProgressMonitor ());
+ projectBuilder.RefreshWithContent (p.SaveToString ());
+ }
return projectBuilder;
}
@@ -968,11 +975,32 @@ namespace MonoDevelop.Projects.Formats.MSBuild
return false;
}
+ public override void OnModified (string hint)
+ {
+ base.OnModified (hint);
+ modifiedInMemory = true;
+ }
+
protected override void SaveItem (MonoDevelop.Core.IProgressMonitor monitor)
{
- if (Item is UnknownProject || Item is UnknownSolutionItem)
+ modifiedInMemory = false;
+
+ MSBuildProject msproject = SaveProject (monitor);
+ if (msproject == null)
return;
+ // Don't save the file to disk if the content did not change
+ msproject.Save (EntityItem.FileName);
+
+ if (projectBuilder != null)
+ projectBuilder.Refresh ();
+ }
+
+ MSBuildProject SaveProject (MonoDevelop.Core.IProgressMonitor monitor)
+ {
+ if (Item is UnknownProject || Item is UnknownSolutionItem)
+ return null;
+
bool newProject;
SolutionEntityItem eitem = EntityItem;
@@ -1213,11 +1241,7 @@ namespace MonoDevelop.Projects.Formats.MSBuild
} else
msproject.RemoveProjectExtensions ("MonoDevelop");
- // Don't save the file to disk if the content did not change
- msproject.Save (eitem.FileName);
-
- if (projectBuilder != null)
- projectBuilder.Refresh ();
+ return msproject;
}
void SetIfPresentOrNotDefaultValue (MSBuildPropertySet propGroup, string name, string value, string defaultValue, bool isXml = false)
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/RemoteProjectBuilder.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/RemoteProjectBuilder.cs
index a30a8f7d94..b48d28766f 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/RemoteProjectBuilder.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/RemoteProjectBuilder.cs
@@ -96,6 +96,11 @@ namespace MonoDevelop.Projects.Formats.MSBuild
builder.Refresh ();
}
+ public void RefreshWithContent (string projectContent)
+ {
+ builder.RefreshWithContent (projectContent);
+ }
+
public void Dispose ()
{
if (engine != null) {
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionFolder.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionFolder.cs
index 4764f5541f..89ae4dfbc5 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionFolder.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionFolder.cs
@@ -985,6 +985,10 @@ namespace MonoDevelop.Projects
get { return false; }
}
+ public void OnModified (string hint)
+ {
+ }
+
public void Dispose ()
{
}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionItem.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionItem.cs
index b3bb536a2a..89df6adc50 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionItem.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/SolutionItem.cs
@@ -900,6 +900,7 @@ namespace MonoDevelop.Projects
/// </param>
protected void NotifyModified (string hint)
{
+ ItemHandler.OnModified (hint);
OnModified (new SolutionItemModifiedEventArgs (this, hint));
}
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.cs
index 315bd88b46..6644ad3f79 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.cs
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.cs
@@ -46,6 +46,7 @@ namespace MonoDevelop.Projects.Formats.MSBuild
ManualResetEvent doneEvent = new ManualResetEvent (false);
Dictionary<string,Engine> engines = new Dictionary<string, Engine> ();
+ Dictionary<string,string> unsavedProjects = new Dictionary<string, string> ();
public void Dispose ()
{
@@ -92,6 +93,9 @@ namespace MonoDevelop.Projects.Formats.MSBuild
internal void UnloadProject (string file)
{
+ lock (unsavedProjects)
+ unsavedProjects.Remove (file);
+
RunSTA (delegate {
foreach (var engine in engines.Values) {
var loadedProj = engine.GetLoadedProject (file);
@@ -101,6 +105,21 @@ namespace MonoDevelop.Projects.Formats.MSBuild
});
}
+ internal void SetUnsavedProjectContent (string file, string content)
+ {
+ lock (unsavedProjects)
+ unsavedProjects [file] = content;
+ }
+
+ internal string GetUnsavedProjectContent (string file)
+ {
+ lock (unsavedProjects) {
+ string content;
+ unsavedProjects.TryGetValue (file, out content);
+ return content;
+ }
+ }
+
internal static void RunSTA (ThreadStart ts)
{
lock (workLock) {
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/IProjectBuilder.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/IProjectBuilder.cs
index 167acc7240..8253c49b33 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/IProjectBuilder.cs
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/IProjectBuilder.cs
@@ -34,6 +34,7 @@ namespace MonoDevelop.Projects.Formats.MSBuild
MSBuildVerbosity verbosity);
string[] GetAssemblyReferences (ProjectConfigurationInfo[] configurations);
void Refresh ();
+ void RefreshWithContent (string projectContent);
}
[Serializable]
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ProjectBuilder.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ProjectBuilder.cs
index 20a59ab9e4..56960f921d 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ProjectBuilder.cs
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ProjectBuilder.cs
@@ -63,6 +63,12 @@ namespace MonoDevelop.Projects.Formats.MSBuild
buildEngine.UnloadProject (file);
}
+ public void RefreshWithContent (string projectContent)
+ {
+ buildEngine.UnloadProject (file);
+ buildEngine.SetUnsavedProjectContent (file, projectContent);
+ }
+
void LogWriteLine (string txt)
{
if (currentLogWriter != null)
@@ -145,7 +151,11 @@ namespace MonoDevelop.Projects.Formats.MSBuild
var p = engine.GetLoadedProject (pc.ProjectFile);
if (p == null) {
p = new Project (engine);
- p.Load (pc.ProjectFile);
+ var content = buildEngine.GetUnsavedProjectContent (pc.ProjectFile);
+ if (content == null)
+ p.Load (pc.ProjectFile);
+ else
+ p.Load (new StringReader (content));
}
p.GlobalProperties.SetProperty ("Configuration", pc.Configuration);
if (!string.IsNullOrEmpty (pc.Platform))