diff options
Diffstat (limited to 'mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectItemInstance.cs')
-rw-r--r-- | mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectItemInstance.cs | 324 |
1 files changed, 182 insertions, 142 deletions
diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectItemInstance.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectItemInstance.cs index 0e27811ef8..720c4b32b1 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectItemInstance.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectItemInstance.cs @@ -3,8 +3,9 @@ // // Author: // Rolf Bjarne Kvinge (rolf@xamarin.com) +// Atsushi Enomoto (atsushi@xamarin.com) // -// Copyright (C) 2011 Xamarin Inc. +// Copyright (C) 2011,2013 Xamarin Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the @@ -26,152 +27,191 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // -using Microsoft.Build.Framework; using System; using System.Collections.Generic; +using System.Linq; +using Microsoft.Build.Framework; +using Microsoft.Build.Evaluation; +using System.Collections; +using Microsoft.Build.Construction; +using System.Globalization; +using System.IO; namespace Microsoft.Build.Execution { - public class ProjectItemInstance + public class ProjectItemInstance : ITaskItem2 - { - private ProjectItemInstance () - { - throw new NotImplementedException (); - } - - public ProjectMetadataInstance GetMetadata (string name) - { - throw new NotImplementedException (); - } - - public string GetMetadataValue (string name) - { - throw new NotImplementedException (); - } - - public bool HasMetadata (string name) - { - throw new NotImplementedException (); - } - - public void RemoveMetadata (string metadataName) - { - throw new NotImplementedException (); - } - - public void SetMetadata (IEnumerable<KeyValuePair<string, string>> metadataDictionary) - { - throw new NotImplementedException (); - } - - public ProjectMetadataInstance SetMetadata (string name, string evaluatedValue) - { - throw new NotImplementedException (); - } - - public int DirectMetadataCount { - get { throw new NotImplementedException (); } - } - - public string EvaluatedInclude { - get { throw new NotImplementedException (); } - set { throw new NotImplementedException (); } - } - - public string ItemType { - get { throw new NotImplementedException (); } - } - - public IEnumerable<ProjectMetadataInstance> Metadata { - get { throw new NotImplementedException (); } - } - - public int MetadataCount { - get { throw new NotImplementedException (); } - } - - public ICollection<string> MetadataNames { - get { throw new NotImplementedException (); } - } - - public ProjectInstance Project { - get { throw new NotImplementedException (); } - } - - #region ITaskItem2 implementation - string ITaskItem2.GetMetadataValueEscaped (string metadataName) - { - throw new NotImplementedException (); - } - - void ITaskItem2.SetMetadataValueLiteral (string metadataName, string metadataValue) - { - throw new NotImplementedException (); - } - - System.Collections.IDictionary ITaskItem2.CloneCustomMetadataEscaped () - { - throw new NotImplementedException (); - } - - string ITaskItem2.EvaluatedIncludeEscaped { - get { - throw new NotImplementedException (); - } - set { - throw new NotImplementedException (); - } - } - #endregion - - #region ITaskItem implementation - System.Collections.IDictionary ITaskItem.CloneCustomMetadata () - { - throw new NotImplementedException (); - } - - void ITaskItem.CopyMetadataTo (ITaskItem destinationItem) - { - throw new NotImplementedException (); - } - - string ITaskItem.GetMetadata (string metadataName) - { - throw new NotImplementedException (); - } - - void ITaskItem.RemoveMetadata (string metadataName) - { - throw new NotImplementedException (); - } - - void ITaskItem.SetMetadata (string metadataName, string metadataValue) - { - throw new NotImplementedException (); - } - - string ITaskItem.ItemSpec { - get { - throw new NotImplementedException (); - } - set { - throw new NotImplementedException (); - } - } - - int ITaskItem.MetadataCount { - get { - throw new NotImplementedException (); - } - } - - System.Collections.ICollection ITaskItem.MetadataNames { - get { - throw new NotImplementedException (); - } - } - #endregion - } + { + internal ProjectItemInstance (ProjectInstance project, string itemType, IEnumerable<KeyValuePair<string,string>> metadata, string evaluatedInclude) + { + this.project = project; + this.evaluated_include = evaluatedInclude; + this.item_type = itemType; + this.metadata = new List<ProjectMetadataInstance> (); + SetMetadata (metadata); + } + + readonly ProjectInstance project; + readonly string item_type; + string evaluated_include; + readonly List<ProjectMetadataInstance> metadata; + + public ProjectMetadataInstance GetMetadata (string name) + { + if (name == null) + throw new ArgumentNullException ("name"); + // This does not return any Well Known metadata + return Metadata.FirstOrDefault (m => m.Name.Equals (name, StringComparison.OrdinalIgnoreCase)); + } + + public string GetMetadataValue (string name) + { + if (name == null) + throw new ArgumentNullException ("name"); + var wk = ProjectCollection.GetWellKnownMetadata (name, EvaluatedInclude, project.GetFullPath, RecursiveDir); + if (wk != null) + return wk; + var m = GetMetadata (name); + return m != null ? m.EvaluatedValue : null; + } + + public bool HasMetadata (string name) + { + return GetMetadata (name) != null; + } + + public void RemoveMetadata (string metadataName) + { + var m = GetMetadata (metadataName); + if (m != null) + metadata.Remove (m); + } + + public void SetMetadata (IEnumerable<KeyValuePair<string, string>> metadataDictionary) + { + foreach (var p in metadataDictionary) + SetMetadata (p.Key, p.Value); + } + + public ProjectMetadataInstance SetMetadata (string name, string evaluatedValue) + { + var m = metadata.FirstOrDefault (_ => _.Name.Equals (name, StringComparison.OrdinalIgnoreCase)); + if (m != null) + metadata.Remove (m); + m = new ProjectMetadataInstance (name, evaluatedValue); + metadata.Add (m); + return m; + } + + public int DirectMetadataCount { + get { throw new NotImplementedException (); } + } + + public string EvaluatedInclude { + get { return evaluated_include; } + set { + if (value == null) + throw new ArgumentNullException ("value"); + evaluated_include = value; + } + } + + public string ItemType { + get { return item_type; } + } + + public IEnumerable<ProjectMetadataInstance> Metadata { + get { return metadata; } + } + + public int MetadataCount { + get { return metadata.Count; } + } + + public ICollection<string> MetadataNames { + get { return metadata.Select (m => m.Name).ToArray (); } + } + + public ProjectInstance Project { + get { return project; } + } + + internal string RecursiveDir { get; set; } + + #region ITaskItem2 implementation + + string ITaskItem2.GetMetadataValueEscaped (string metadataName) + { + return ProjectCollection.Escape (GetMetadataValue (metadataName)); + } + + void ITaskItem2.SetMetadataValueLiteral (string metadataName, string metadataValue) + { + SetMetadata (metadataName, metadataValue); + } + + System.Collections.IDictionary ITaskItem2.CloneCustomMetadataEscaped () + { + var dic = ((ITaskItem) this).CloneCustomMetadata (); + foreach (DictionaryEntry p in dic) + dic [p.Key] = ProjectCollection.Escape ((string) p.Value); + return dic; + } + + string ITaskItem2.EvaluatedIncludeEscaped { + get { return ProjectCollection.Escape (EvaluatedInclude); } + set { EvaluatedInclude = ProjectCollection.Unescape (value); } + } + + #endregion + + #region ITaskItem implementation + + IDictionary ITaskItem.CloneCustomMetadata () + { + var dic = new Hashtable (); + foreach (var md in Metadata) + dic [md.Name] = md.EvaluatedValue; + return dic; + } + + void ITaskItem.CopyMetadataTo (ITaskItem destinationItem) + { + if (destinationItem == null) + throw new ArgumentNullException ("destinationItem"); + foreach (var md in Metadata) + destinationItem.SetMetadata (md.Name, md.EvaluatedValue); + } + + string ITaskItem.GetMetadata (string metadataName) + { + return GetMetadataValue (metadataName); + } + + void ITaskItem.RemoveMetadata (string metadataName) + { + RemoveMetadata (metadataName); + } + + void ITaskItem.SetMetadata (string metadataName, string metadataValue) + { + SetMetadata (metadataName, ProjectCollection.Unescape (metadataValue)); + } + + string ITaskItem.ItemSpec { + get { return EvaluatedInclude; } + set { EvaluatedInclude = value; } + } + + int ITaskItem.MetadataCount { + get { return MetadataCount; } + } + + ICollection ITaskItem.MetadataNames { + get { return MetadataNames.ToArray (); } + } + + #endregion + } } |