* Makefile ($(build_lib)): Make CYCLIC_DEP_FILES depend on this.
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / MetadataReference.cs
index 8b9d7809f508e37c27b57afc3bdd66d5a1969e52..3e245ab1c9deca3ad1b59b117c4690a60936a98b 100644 (file)
@@ -34,7 +34,7 @@ using Microsoft.Build.Framework;
 using Microsoft.Build.Utilities;
 
 namespace Microsoft.Build.BuildEngine {
-       internal class MetadataReference {
+       internal class MetadataReference : IReference {
        
                string          itemName;
                string          metadataName;
@@ -78,26 +78,49 @@ namespace Microsoft.Build.BuildEngine {
                {
                        List<ITaskItem> items = new List<ITaskItem> ();
                        if (IsQualified) {
+                               // Bucket would have item lists with same metadata values,
+                               // so just get the value from the first item
                                BuildItemGroup group;
                                if (project.TryGetEvaluatedItemByNameBatched (itemName, out group))
-                                       BuildItemGroupToITaskItemArray (group, items);
+                                       BuildItemGroupToITaskItems (group, items, true);
                        } else {
+                               // Get unique metadata values from _all_ item lists
                                foreach (BuildItemGroup group in project.GetAllItemGroups ())
-                                       BuildItemGroupToITaskItemArray (group, items);
+                                       BuildItemGroupToITaskItems (group, items, false);
                        }
 
                        return items.Count == 0 ? null : items.ToArray ();
                }
 
-               void BuildItemGroupToITaskItemArray (BuildItemGroup group, List<ITaskItem> items)
+               // Gets metadata values from build item @group and adds as ITaskItem
+               // objects to @items
+               // @only_one: Batched case, all item lists would have same metadata values,
+               //            just return first one
+               void BuildItemGroupToITaskItems (BuildItemGroup group, List<ITaskItem> items, bool only_one)
                {
                        foreach (BuildItem item in group) {
-                               if (item.HasMetadata (metadataName))
-                                       items.Add (new TaskItem (
-                                               item.GetMetadata (metadataName)));
+                               if (!item.HasMetadata (metadataName))
+                                       continue;
+
+                               string metadata = item.GetMetadata (metadataName);
+                               if (HasTaskItem (items, metadata))
+                                       //return only unique metadata values
+                                       continue;
+
+                               items.Add (new TaskItem (metadata));
+                               if (only_one)
+                                       break;
                        }
                }
 
+               private bool HasTaskItem (List<ITaskItem> items, string itemspec)
+               {
+                       foreach (ITaskItem task_item in items)
+                               if (task_item.ItemSpec == itemspec)
+                                       return true;
+                       return false;
+               }
+
                public override string ToString ()
                {
                        if (IsQualified)