2007-01-10 Marek Sieradzki <marek.sieradzki@gmail.com>
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / GroupingCollection.cs
index f0e76af186e7dcc21d419b055a40f56f9dd382e5..43aec1e1fe02d546b5a04935db7784d71101443f 100644 (file)
@@ -36,18 +36,18 @@ namespace Microsoft.Build.BuildEngine {
                
                int     imports;
                int     itemGroups;
+               Project project;
                int     propertyGroups;
                int     chooses;
 
                LinkedList <object>     list;
-               LinkedListNode <object> iterator;
-               Project project;
+               LinkedListNode <object> add_iterator;
        
                public GroupingCollection (Project project)
                {
-                       this.project = project;
                        list = new LinkedList <object> ();
-                       iterator = null;
+                       add_iterator = null;
+                       this.project = project;
                }
 
                public IEnumerator GetChooseEnumerator ()
@@ -101,37 +101,57 @@ namespace Microsoft.Build.BuildEngine {
                {
                        bpg.GroupingCollection = this;
                        propertyGroups++;
-                       if (iterator == null)
+                       if (add_iterator == null)
                                list.AddLast (bpg);
-                       else
-                               list.AddAfter (iterator, bpg);
+                       else {
+                               list.AddAfter (add_iterator, bpg);
+                               add_iterator = add_iterator.Next;
+                       }
                }
                
                internal void Add (BuildItemGroup big)
                {
                        itemGroups++;
-                       if (iterator == null)
+                       if (add_iterator == null)
                                list.AddLast (big);
-                       else
-                               list.AddAfter (iterator, big);
+                       else {
+                               list.AddAfter (add_iterator, big);
+                               add_iterator = add_iterator.Next;
+                       }
                }
                
                internal void Add (BuildChoose bc)
                {
                        chooses++;
-                       if (iterator == null)
+                       if (add_iterator == null)
                                list.AddLast (bc);
-                       else
-                               list.AddAfter (iterator, bc);
+                       else {
+                               list.AddAfter (add_iterator, bc);
+                               add_iterator = add_iterator.Next;
+                       }
                }
 
                internal void Add (Import import)
                {
                        imports++;
-                       if (iterator == null)
+                       if (add_iterator == null)
                                list.AddLast (import);
-                       else
-                               list.AddAfter (iterator, import);
+                       else {
+                               list.AddAfter (add_iterator, import);
+                               add_iterator = add_iterator.Next;
+                       }
+               }
+
+               internal void Remove (BuildItemGroup big)
+               {
+                       big.XmlElement.ParentNode.RemoveChild (big.XmlElement);
+                       list.Remove (big);
+               }
+
+               internal void Remove (BuildPropertyGroup bpg)
+               {
+                       bpg.XmlElement.ParentNode.RemoveChild (bpg.XmlElement);
+                       list.Remove (bpg);
                }
 
                internal void Evaluate ()
@@ -141,40 +161,50 @@ namespace Microsoft.Build.BuildEngine {
                        Evaluate (EvaluationType.Item);
                }
 
-               // FIXME: check conditions on groups/imports
                void Evaluate (EvaluationType type)
                {
                        BuildItemGroup big;
                        BuildPropertyGroup bpg;
                        Import import;
+                       LinkedListNode <object> evaluate_iterator;
 
                        if (type == EvaluationType.Property) {
-                               iterator = list.First;
-
-                               while (iterator != null) {
-                                       if (iterator.Value is BuildPropertyGroup) {
-                                               bpg = (BuildPropertyGroup) iterator.Value;
-                                               bpg.Evaluate ();
-                                       } else if (iterator.Value is Import) {
-                                               import = (Import) iterator.Value;
-                                               import.Evaluate ();
+                               evaluate_iterator = list.First;
+                               add_iterator = list.First;
+
+                               while (evaluate_iterator != null) {
+                                       if (evaluate_iterator.Value is BuildPropertyGroup) {
+                                               bpg = (BuildPropertyGroup) evaluate_iterator.Value;
+                                               if (ConditionParser.ParseAndEvaluate (bpg.Condition, project))
+                                                       bpg.Evaluate ();
+                                       } else if (evaluate_iterator.Value is Import) {
+                                               import = (Import) evaluate_iterator.Value;
+                                               if (ConditionParser.ParseAndEvaluate (import.Condition, project))
+                                                       import.Evaluate ();
                                        }
 
-                                       iterator = iterator.Next;
+                                       // if it wasn't moved by adding anything because of evaluating a Import shift it
+                                       if (add_iterator == evaluate_iterator)
+                                               add_iterator = add_iterator.Next;
+
+                                       evaluate_iterator = evaluate_iterator.Next;
                                }
                        } else {
-                               iterator = list.First;
-
-                               while (iterator != null) {
-                                       if (iterator.Value is BuildItemGroup) {
-                                               big = (BuildItemGroup) iterator.Value;
-
-                                               big.Evaluate ();
+                               evaluate_iterator = list.First;
+                               add_iterator = list.First;
+
+                               while (evaluate_iterator != null) {
+                                       if (evaluate_iterator.Value is BuildItemGroup) {
+                                               big = (BuildItemGroup) evaluate_iterator.Value;
+                                               if (ConditionParser.ParseAndEvaluate (big.Condition, project))
+                                                       big.Evaluate ();
                                        }
 
-                                       iterator = iterator.Next;
+                                       evaluate_iterator = evaluate_iterator.Next;
                                }
                        }
+
+                       add_iterator = null;
                }
 
                internal int Imports {