More tasks.
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / BuildItemGroup.cs
1 //
2 // BuildItemGroup.cs: Represents a group of build items.
3 //
4 // Author:
5 //   Marek Sieradzki (marek.sieradzki@gmail.com)
6 // 
7 // (C) 2005 Marek Sieradzki
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
28 #if NET_2_0
29
30 using System;
31 using System.Reflection;
32 using System.Collections;
33 using System.Collections.Generic;
34 using System.Xml;
35 using Microsoft.Build.Framework;
36 using Microsoft.Build.Utilities;
37
38 namespace Microsoft.Build.BuildEngine {
39         public class BuildItemGroup : IEnumerable {
40         
41                 List <BuildItem>        buildItems;
42                 GroupingCollection      parentCollection;
43                 Project                 parentProject;
44                 ImportedProject         importedProject;
45                 XmlElement              itemGroupElement;
46
47                 public BuildItemGroup ()
48                         : this (null, null, null)
49                 {
50                 }
51                 
52                 internal BuildItemGroup (XmlElement xmlElement, Project project, ImportedProject importedProject)
53                 {
54                         this.buildItems = new List <BuildItem> ();
55                         this.importedProject = importedProject;
56                         this.itemGroupElement = xmlElement;
57                         this.parentProject = project;
58                         
59                         if (!FromXml)
60                                 return;
61
62                         foreach (XmlNode xn in xmlElement.ChildNodes) {
63                                 if (!(xn is XmlElement))
64                                         continue;
65                                         
66                                 XmlElement xe = (XmlElement) xn;
67                                 BuildItem bi = new BuildItem (xe, this);
68                                 buildItems.Add (bi);
69                         }
70                 }
71
72                 public BuildItem AddNewItem (string itemName,
73                                              string itemInclude)
74                 {
75                         return AddNewItem (itemName, itemInclude, false);
76                 }
77                 
78                 [MonoTODO]
79                 public BuildItem AddNewItem (string itemName,
80                                              string itemInclude,
81                                              bool treatItemIncludeAsLiteral)
82                 {
83                         if (treatItemIncludeAsLiteral)
84                                 itemInclude = Utilities.Escape (itemInclude);
85
86                         BuildItem bi = new BuildItem (itemName, itemInclude);
87
88                         bi.Evaluate (null, true);
89
90                         buildItems.Add (bi);
91
92                         return bi;
93                 }
94                 
95                 public void Clear ()
96                 {
97                         buildItems = new List <BuildItem> ();
98                 }
99
100                 [MonoTODO]
101                 public BuildItemGroup Clone (bool deepClone)
102                 {
103                         if (deepClone) {
104                                 if (FromXml)
105                                         throw new NotImplementedException ();
106                                 else
107                                         throw new NotImplementedException ();
108                         } else {
109                                 if (FromXml)
110                                         throw new InvalidOperationException ("A shallow clone of this object cannot be created.");
111                                 else
112                                         throw new NotImplementedException ();
113                         }
114                 }
115
116                 public IEnumerator GetEnumerator ()
117                 {
118                         return buildItems.GetEnumerator ();
119                 }
120
121                 public void RemoveItem (BuildItem itemToRemove)
122                 {
123                         buildItems.Remove (itemToRemove);
124                 }
125
126                 public void RemoveItemAt (int index)
127                 {
128                         buildItems.RemoveAt (index);
129                 }
130
131                 public BuildItem[] ToArray ()
132                 {
133                         return buildItems.ToArray ();
134                 }
135
136                 internal void AddItem (BuildItem buildItem)
137                 {
138                         buildItems.Add (buildItem);
139                 }
140
141                 internal void AddItem (string name, ITaskItem taskItem)
142                 {
143                         BuildItem buildItem;
144                         buildItem = new BuildItem (name, taskItem);
145                         buildItems.Add (buildItem);
146                 }
147
148                 internal string ConvertToString (Expression transform,
149                                                  Expression separator)
150                 {
151                         string separatorString;
152                         
153                         if (separator == null)
154                                 separatorString = ";";
155                         else
156                                 separatorString = (string) separator.ConvertTo (parentProject, typeof (string));
157                 
158                         string[] items = new string [buildItems.Count];
159                         int i = 0;
160                         foreach (BuildItem bi in  buildItems)
161                                 items [i++] = bi.ConvertToString (transform);
162                         return String.Join (separatorString, items);
163                 }
164
165                 internal ITaskItem[] ConvertToITaskItemArray (Expression transform)
166                 {
167                         ITaskItem[] array = new ITaskItem [buildItems.Count];
168                         int i = 0;
169                         foreach (BuildItem item in buildItems)
170                                 array [i++] = item.ConvertToITaskItem (transform);
171                         return array;
172                 }
173
174                 internal void Evaluate ()
175                 {
176                         foreach (BuildItem bi in buildItems) {
177                                 if (bi.Condition == String.Empty)
178                                         bi.Evaluate (parentProject, true);
179                                 else {
180                                         ConditionExpression ce = ConditionParser.ParseCondition (bi.Condition);
181                                         bi.Evaluate (parentProject, ce.BoolEvaluate (parentProject));
182                                 }
183                         }
184                 }               
185                 
186                 [MonoTODO]
187                 // FIXME: whether we can invoke get_Condition on BuildItemGroup not based on XML
188                 public string Condition {
189                         get {
190                                 if (FromXml)
191                                         return itemGroupElement.GetAttribute ("Condition");
192                                 else
193                                         return String.Empty;
194                         }
195                         set {
196                                 if (FromXml)
197                                         itemGroupElement.SetAttribute ("Condition", value);
198                                 else
199                                         throw new InvalidOperationException ("Cannot set a condition on an object not represented by an XML element in the project file.");
200                         }
201                 }
202
203                 public int Count {
204                         get { return buildItems.Count; }
205                 }
206
207                 public bool IsImported {
208                         get { return importedProject != null; }
209                 }
210
211                 
212                 [MonoTODO]
213                 public BuildItem this [int index] {
214                         get {
215                                 return buildItems [index];
216                         }
217                 }
218                 
219                 internal GroupingCollection GroupingCollection {
220                         get { return parentCollection; }
221                         set { parentCollection = value; }
222                 }
223                 
224                 internal Project Project {
225                         get { return parentProject; }
226                 }
227
228                 internal bool FromXml {
229                         get {
230                                 return itemGroupElement != null;
231                         }
232                 }
233         }
234 }
235
236 #endif