X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FMicrosoft.Build.Engine%2FMicrosoft.Build.BuildEngine%2FMetadataReference.cs;h=3e245ab1c9deca3ad1b59b117c4690a60936a98b;hb=d531a7515eaad9fb1c2ca9fff160851fa70aa168;hp=8b9d7809f508e37c27b57afc3bdd66d5a1969e52;hpb=a5e40870bd3bb18e1681afed6c71e7edfdb80534;p=mono.git diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/MetadataReference.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/MetadataReference.cs index 8b9d7809f50..3e245ab1c9d 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/MetadataReference.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/MetadataReference.cs @@ -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 items = new List (); 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 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 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 items, string itemspec) + { + foreach (ITaskItem task_item in items) + if (task_item.ItemSpec == itemspec) + return true; + return false; + } + public override string ToString () { if (IsQualified)