2006-12-16 Marek Sieradzki <marek.sieradzki@gmail.com>
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / TaskEngine.cs
index 581f0247f492d361864ad496e6ceeda0cf14b174..d4365bbd52565dfc965a882f56bda2c3752f7a25 100644 (file)
@@ -28,7 +28,7 @@
 #if NET_2_0
 
 using System;
-using System.Collections;
+using System.Collections.Generic;
 using System.Collections.Specialized;
 using System.Reflection;
 using System.Xml;
@@ -58,23 +58,28 @@ namespace Microsoft.Build.BuildEngine {
                }
                
                public void Prepare (ITask task, XmlElement taskElement,
-                                    IDictionary parameters, Type taskType)
+                                    IDictionary <string, string> parameters, Type taskType)
                {
-                       Hashtable       values;
+                       Dictionary <string, object>     values;
                        PropertyInfo    currentProperty;
                        PropertyInfo[]  properties;
-               
+                       object          value;
+                       
                        this.task = task;
                        this.taskElement = taskElement;
                        this.taskType = taskType;
-                       values = new Hashtable ();
+                       values = new Dictionary <string, object> ();
                        
-                       foreach (DictionaryEntry de in parameters) {
-                               currentProperty = taskType.GetProperty ((string) de.Key);
+                       foreach (KeyValuePair <string, string> de in parameters) {
+                               currentProperty = taskType.GetProperty (de.Key);
                                if (currentProperty == null)
                                        throw new InvalidProjectFileException (String.Format ("Task does not have property \"{0}\" defined",
                                                de.Key));
-                               values.Add ((string) de.Key, GetObjectFromString ((string) de.Value, currentProperty.PropertyType)); 
+                               
+                               value = GetObjectFromString (de.Value, currentProperty.PropertyType);           
+                               
+                               if (value != null)
+                                       values.Add (de.Key, value);
                        }
                        
                        properties = taskType.GetProperties ();
@@ -102,35 +107,36 @@ namespace Microsoft.Build.BuildEngine {
                        object          o;
                
                        foreach (XmlNode xmlNode in taskElement.ChildNodes) {
-                               if (xmlNode is XmlElement) {
-                                       xmlElement = (XmlElement) xmlNode;
-                                       
-                                       if (xmlElement.Name != "Output")
-                                               throw new InvalidProjectFileException ("Only Output elements can be Task's child nodes.");
-                                       if (xmlElement.GetAttribute ("ItemName") != "" && xmlElement.GetAttribute ("PropertyName") != "")
-                                               throw new InvalidProjectFileException ("Only one of ItemName and ProperytyName attributes can be specified.");
-                                       if (xmlElement.GetAttribute ("TaskParameter") == "")
-                                               throw new InvalidProjectFileException ("TaskParameter attribute must be specified.");
-                                               
-                                       taskParameter = xmlElement.GetAttribute ("TaskParameter");
-                                       itemName = xmlElement.GetAttribute ("ItemName");
-                                       propertyName = xmlElement.GetAttribute ("PropertyName");
-                                       
-                                       propertyInfo = taskType.GetProperty (taskParameter);
-                                       if (propertyInfo == null)
-                                               throw new Exception ("Could not get property info.");
-                                       if (propertyInfo.IsDefined (outputAttribute, false) == false)
-                                               throw new Exception ("This is not output property.");
-                                       
-                                       o = propertyInfo.GetValue (task, null);
-                                       if (o == null)
-                                               continue;
+                               if (!(xmlNode is XmlElement))
+                                       continue;
+                       
+                               xmlElement = (XmlElement) xmlNode;
+                               
+                               if (xmlElement.Name != "Output")
+                                       throw new InvalidProjectFileException ("Only Output elements can be Task's child nodes.");
+                               if (xmlElement.GetAttribute ("ItemName") != String.Empty && xmlElement.GetAttribute ("PropertyName") != String.Empty)
+                                       throw new InvalidProjectFileException ("Only one of ItemName and PropertyName attributes can be specified.");
+                               if (xmlElement.GetAttribute ("TaskParameter") == String.Empty)
+                                       throw new InvalidProjectFileException ("TaskParameter attribute must be specified.");
                                        
-                                       if (itemName != String.Empty) {
-                                               PublishItemGroup (propertyInfo, o, itemName);
-                                       } else {
-                                               PublishProperty (propertyInfo, o, propertyName);
-                                       }
+                               taskParameter = xmlElement.GetAttribute ("TaskParameter");
+                               itemName = xmlElement.GetAttribute ("ItemName");
+                               propertyName = xmlElement.GetAttribute ("PropertyName");
+                               
+                               propertyInfo = taskType.GetProperty (taskParameter);
+                               if (propertyInfo == null)
+                                       throw new Exception ("Could not get property info.");
+                               if (propertyInfo.IsDefined (outputAttribute, false) == false)
+                                       throw new Exception ("This is not output property.");
+                               
+                               o = propertyInfo.GetValue (task, null);
+                               if (o == null)
+                                       continue;
+                               
+                               if (itemName != String.Empty) {
+                                       PublishItemGroup (propertyInfo, o, itemName);
+                               } else {
+                                       PublishProperty (propertyInfo, o, propertyName);
                                }
                        }
                }
@@ -145,14 +151,17 @@ namespace Microsoft.Build.BuildEngine {
                                               string itemName)
                {
                        BuildItemGroup newItems = CollectItemGroup (propertyInfo, o, itemName);
-                       if (parentProject.EvaluatedItemsByName.Contains (itemName)) {
-                               BuildItemGroup big = (BuildItemGroup) parentProject.EvaluatedItemsByName [itemName];
+                       
+                       if (parentProject.EvaluatedItemsByName.ContainsKey (itemName)) {
+                               BuildItemGroup big = parentProject.EvaluatedItemsByName [itemName];
                                big.Clear ();
                                parentProject.EvaluatedItemsByName.Remove (itemName);
                                parentProject.EvaluatedItemsByName.Add (itemName, newItems);
                        } else {
                                parentProject.EvaluatedItemsByName.Add (itemName, newItems);
                        }
+                       foreach (BuildItem bi in newItems)
+                               parentProject.EvaluatedItems.AddItem (bi);
                }
                
                private void PublishProperty (PropertyInfo propertyInfo,
@@ -223,19 +232,16 @@ namespace Microsoft.Build.BuildEngine {
                                
                private object GetObjectFromString (string raw, Type type)
                {
-                       OldExpression e;
+                       Expression e;
                        object result;
                        
-                       e = new OldExpression (parentProject);
-                       e.ParseSource (raw);
+                       e = new Expression ();
+                       e.Parse (raw);
                        
-                       if (type == typeof (ITaskItem)) {
-                               result = e.ConvertTo (typeof (ITaskItem));
-                       } else if (type == typeof (ITaskItem[])) {
-                               result = e.ConvertTo (typeof (ITaskItem[]));
-                       } else {
-                               result = e.ConvertTo (type);
-                       }
+                       if ((string) e.ConvertTo (parentProject, typeof (string)) == String.Empty)
+                               return null;
+                       
+                       result = e.ConvertTo (parentProject, type);
                        
                        return result;
                }