diff options
author | Lluis Sanchez Gual <lluis@xamarin.com> | 2013-08-21 14:51:08 +0400 |
---|---|---|
committer | Lluis Sanchez Gual <lluis@xamarin.com> | 2013-08-27 20:05:22 +0400 |
commit | 6e1037d71191077ff5ef920107d81258d4abb4d3 (patch) | |
tree | bb288af6c7b6c9a4929da0acacae4e78c2af9dfb /main | |
parent | c2a5b8ecde248ffa0c587ff1ed1b2e60de3036dc (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')
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)) |