5 // Leszek Ciesielski (skolima@gmail.com)
6 // Rolf Bjarne Kvinge (rolf@xamarin.com)
7 // Atsushi Enomoto (atsushi@xamarin.com)
9 // (C) 2011 Leszek Ciesielski
10 // Copyright (C) 2011,2013 Xamarin Inc.
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 using System.Collections.Generic;
34 using System.Diagnostics;
36 using Microsoft.Build.Construction;
38 namespace Microsoft.Build.Evaluation
40 [DebuggerDisplay ("{ItemType}={EvaluatedInclude} [{UnevaluatedInclude}] #DirectMetadata={DirectMetadataCount}")]
41 public class ProjectItem
43 internal ProjectItem (Project project, ProjectItemElement xml, string evaluatedInclude)
45 this.project = project;
47 if (project.ItemDefinitions.ContainsKey (ItemType))
48 foreach (var md in project.ItemDefinitions [ItemType].Metadata)
50 foreach (var item in xml.Metadata)
51 metadata.Add (new ProjectMetadata (project, ItemType, metadata, m => metadata.Remove (m), item));
52 evaluated_include = evaluatedInclude;
56 ProjectItemElement xml;
57 List<ProjectMetadata> metadata = new List<ProjectMetadata> ();
58 string evaluated_include;
60 public ProjectMetadata GetMetadata (string name)
62 return metadata.FirstOrDefault (m => m.Name == name);
65 public string GetMetadataValue (string name)
67 var m = GetMetadata (name);
68 return m != null ? m.EvaluatedValue : null;
71 public bool HasMetadata (string name)
73 return GetMetadata (name) != null;
76 public bool RemoveMetadata (string name)
78 var m = GetMetadata (name);
81 return metadata.Remove (m);
84 public void Rename (string name)
86 throw new NotImplementedException ();
89 public ProjectMetadata SetMetadataValue (string name, string unevaluatedValue)
91 throw new NotImplementedException ();
94 public IEnumerable<ProjectMetadata> DirectMetadata {
96 var list = new List<ProjectMetadata> ();
97 foreach (var xm in xml.Metadata)
98 yield return new ProjectMetadata (project, ItemType, list, p => list.Remove (p), xm);
102 public int DirectMetadataCount {
103 get { return xml.Metadata.Count; }
106 public string EvaluatedInclude {
107 get { return evaluated_include; }
110 public bool IsImported {
111 get { throw new NotImplementedException (); }
114 public string ItemType {
115 get { return Xml.ItemType; }
116 set { Xml.ItemType = value; }
119 public ICollection<ProjectMetadata> Metadata {
120 get { return metadata; }
123 public int MetadataCount {
124 get { return metadata.Count; }
127 public Project Project {
128 get { return project; }
131 public string UnevaluatedInclude {
132 get { return Xml.Include; }
133 set { Xml.Include = value; }
136 public ProjectItemElement Xml {