/// <summary> /// Evaluates an item group that's *outside* of a Target. /// Metadata is not allowed on conditions, and we against the parent project. /// </summary> internal void Evaluate ( BuildPropertyGroup existingProperties, Hashtable existingItemsByName, bool collectItemsIgnoringCondition, bool collectItemsRespectingCondition, ProcessingPass pass ) { ErrorUtilities.VerifyThrow(pass == ProcessingPass.Pass2, "Pass should be Pass2 for ItemGroups."); ErrorUtilities.VerifyThrow(collectItemsIgnoringCondition || collectItemsRespectingCondition, "collectItemsIgnoringCondition and collectItemsRespectingCondition can't both be false."); Expander expander = new Expander(existingProperties, existingItemsByName, ExpanderOptions.ExpandAll); bool itemGroupCondition = Utilities.EvaluateCondition(Condition, (IsPersisted ? xml.ConditionAttribute : null), expander, ParserOptions.AllowPropertiesAndItemLists, parentProject); if (!itemGroupCondition && !collectItemsIgnoringCondition) { // Neither list needs updating return; } foreach (BuildItem currentItem in this) { bool itemCondition = Utilities.EvaluateCondition(currentItem.Condition, currentItem.ConditionAttribute, expander, ParserOptions.AllowPropertiesAndItemLists, parentProject); if (!itemCondition && !collectItemsIgnoringCondition) { // Neither list needs updating continue; } if (collectItemsIgnoringCondition) { // Since we're re-evaluating the project, clear out the previous list of child items // for each persisted item tag. currentItem.ChildItems.Clear(); } currentItem.EvaluateAllItemMetadata(expander, ParserOptions.AllowPropertiesAndItemLists, parentProject.ParentEngine.LoggingServices, parentProject.ProjectBuildEventContext); BuildItemGroup items = BuildItemGroup.ExpandItemIntoItems(parentProject.ProjectDirectory, currentItem, expander, false /* do not expand metadata */); foreach (BuildItem item in items) { BuildItem newItem = BuildItem.CreateClonedParentedItem(item, currentItem); if (itemGroupCondition && itemCondition && collectItemsRespectingCondition) { parentProject.AddToItemListByName(newItem); } if (collectItemsIgnoringCondition) { parentProject.AddToItemListByNameIgnoringCondition(newItem); // Set up the other half of the parent/child relationship. newItem.ParentPersistedItem.ChildItems.AddItem(newItem); } } } }