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:
Diffstat (limited to 'main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildPropertyGroupMerged.cs')
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildPropertyGroupMerged.cs234
1 files changed, 234 insertions, 0 deletions
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildPropertyGroupMerged.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildPropertyGroupMerged.cs
new file mode 100644
index 0000000000..11117a97e6
--- /dev/null
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildPropertyGroupMerged.cs
@@ -0,0 +1,234 @@
+//
+// MSBuildPropertyGroupMerged.cs
+//
+// Author:
+// Lluis Sanchez Gual <lluis@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin, Inc (http://www.xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+using System.Xml;
+
+using MonoDevelop.Core;
+using System.Xml.Linq;
+
+namespace MonoDevelop.Projects.Formats.MSBuild
+{
+
+ class MSBuildPropertyGroupMerged: IMSBuildPropertySet
+ {
+ List<IMSBuildPropertySet> groups = new List<IMSBuildPropertySet> ();
+ MSBuildFileFormat format;
+
+ public MSBuildPropertyGroupMerged (MSBuildProject project, MSBuildFileFormat format)
+ {
+ this.format = format;
+ Project = project;
+ }
+
+ public MSBuildProject Project { get; private set; }
+
+ public string Label { get; set; }
+
+ public void Add (IMSBuildPropertySet g)
+ {
+ groups.Add (g);
+ }
+
+ public int GroupCount {
+ get { return groups.Count; }
+ }
+
+ public MSBuildProperty GetProperty (string name)
+ {
+ // Find property in reverse order, since the last set
+ // value is the good one
+ for (int n=groups.Count - 1; n >= 0; n--) {
+ var g = groups [n];
+ MSBuildProperty p = g.GetProperty (name);
+ if (p != null)
+ return p;
+ }
+ return null;
+ }
+
+ public IMSBuildPropertySet GetGroupForProperty (string name)
+ {
+ // Find property in reverse order, since the last set
+ // value is the good one
+ for (int n=groups.Count - 1; n >= 1; n--) {
+ var g = groups [n];
+ MSBuildProperty p = g.GetProperty (name);
+ if (p != null)
+ return g;
+ }
+ return groups[0];
+ }
+
+ Dictionary<Type,object> customDataObjects = new Dictionary<Type, object> ();
+
+ public T GetObject<T> () where T:IMSBuildDataObject, new()
+ {
+ object ob;
+ if (!customDataObjects.TryGetValue (typeof(T), out ob)) {
+ customDataObjects [typeof(T)] = ob = new T ();
+ ((IMSBuildDataObject)ob).Read (this, format);
+ }
+ return (T)ob;
+ }
+
+ public void SetObject<T> (T t, bool persist = true) where T:IMSBuildDataObject
+ {
+ customDataObjects [typeof(T)] = t;
+ }
+
+ public void WriteDataObjects ()
+ {
+ foreach (IMSBuildDataObject ob in customDataObjects.Values)
+ ob.Write (this, format);
+ }
+
+ public void SetPropertyValue (string name, string value, bool preserveExistingCase)
+ {
+ MSBuildProperty p = GetProperty (name);
+ if (p != null) {
+ if (!preserveExistingCase || !string.Equals (value, p.Value, StringComparison.OrdinalIgnoreCase)) {
+ p.SetValue (value);
+ }
+ return;
+ }
+ groups [0].SetValue (name, value, preserveExistingCase:preserveExistingCase);
+ }
+
+ public void SetValue (string name, string value, string defaultValue = null, bool preserveExistingCase = false, bool mergeToMainGroup = false, string condition = null)
+ {
+ GetGroupForProperty (name).SetValue (name, value, defaultValue, preserveExistingCase, mergeToMainGroup, condition);
+ }
+
+ public void SetValue (string name, FilePath value, FilePath defaultValue = default(FilePath), bool relativeToProject = true, FilePath relativeToPath = default(FilePath), bool mergeToMainGroup = false, string condition = null)
+ {
+ GetGroupForProperty (name).SetValue (name, value, defaultValue, relativeToProject, relativeToPath, mergeToMainGroup, condition);
+ }
+
+ public void SetValue (string name, object value, object defaultValue = null, bool mergeToMainGroup = false, string condition = null)
+ {
+ GetGroupForProperty (name).SetValue (name, value, defaultValue, mergeToMainGroup, condition);
+ }
+
+ public string GetValue (string name, string defaultValue = null)
+ {
+ return GetGroupForProperty (name).GetValue (name, defaultValue);
+ }
+
+ public string GetPathValue (string name, FilePath defaultValue = default(FilePath), bool relativeToFile = true)
+ {
+ return GetGroupForProperty (name).GetPathValue (name, defaultValue, relativeToFile);
+ }
+
+ public T GetValue<T> (string name)
+ {
+ return GetGroupForProperty (name).GetValue<T> (name);
+ }
+
+ public T GetValue<T> (string name, T defaultValue)
+ {
+ return GetGroupForProperty (name).GetValue<T> (name, defaultValue);
+ }
+
+ public object GetValue (string name, Type type, object defaultValue)
+ {
+ return GetGroupForProperty (name).GetValue (name, type, defaultValue);
+ }
+
+ public bool RemoveProperty (string name)
+ {
+ bool found = false;
+ foreach (var g in groups) {
+ if (g.RemoveProperty (name)) {
+ Prune ((MSBuildPropertyGroup)g);
+ found = true;
+ }
+ }
+ return found;
+ }
+
+ public void RemoveAllProperties ()
+ {
+ foreach (var g in groups) {
+ g.RemoveAllProperties ();
+ Prune ((MSBuildPropertyGroup)g);
+ }
+ }
+
+ public void UnMerge (IMSBuildPropertySet baseGrp, ISet<string> propertiesToExclude)
+ {
+ foreach (var g in groups) {
+ ((MSBuildPropertyGroup)g).UnMerge (baseGrp, propertiesToExclude);
+ }
+ }
+
+ public IEnumerable<MSBuildProperty> Properties {
+ get {
+ foreach (var g in groups) {
+ foreach (var p in g.Properties)
+ yield return p;
+ }
+ }
+ }
+
+ void Prune (MSBuildPropertyGroup g)
+ {
+ if (g != groups [0] && !g.Properties.Any()) {
+ // Remove this group since it's now empty
+ g.Project.RemoveGroup (g);
+ }
+ }
+
+ public void SetObject<T> (T t) where T : IMSBuildDataObject
+ {
+ throw new NotImplementedException ();
+ }
+
+ public bool HasProperty (string name)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public FilePath GetPathValue (string name, FilePath defaultValue = default(FilePath), bool relativeToProject = true, FilePath relativeToPath = default(FilePath))
+ {
+ return GetGroupForProperty (name).GetPathValue (name, defaultValue, relativeToProject, relativeToPath);
+ }
+
+ public bool TryGetPathValue (string name, out FilePath value, FilePath defaultValue = default(FilePath), bool relativeToProject = true, FilePath relativeToPath = default(FilePath))
+ {
+ return GetGroupForProperty (name).TryGetPathValue (name, out value, defaultValue, relativeToProject, relativeToPath);
+ }
+
+ public void SetPropertyOrder (params string[] propertyNames)
+ {
+ foreach (var g in groups)
+ g.SetPropertyOrder (propertyNames);
+ }
+ }
+
+}