From 2ebab07b99a2cf1b2c9deb42a7ca52f41f5fb16e Mon Sep 17 00:00:00 2001 From: Nathan Mytelka Date: Wed, 2 Dec 2020 09:58:10 -0800 Subject: [PATCH 1/2] Optimization neglected to include condition Fixes #5766 --- src/Build/Evaluation/LazyItemEvaluator.RemoveOperation.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Build/Evaluation/LazyItemEvaluator.RemoveOperation.cs b/src/Build/Evaluation/LazyItemEvaluator.RemoveOperation.cs index 546ef225a4e..bcfe47d6c84 100644 --- a/src/Build/Evaluation/LazyItemEvaluator.RemoveOperation.cs +++ b/src/Build/Evaluation/LazyItemEvaluator.RemoveOperation.cs @@ -38,7 +38,7 @@ protected override void ApplyImpl(ImmutableList.Builder listBuilder, I new BuildEventFileInfo(string.Empty), "OM_MatchOnMetadataIsRestrictedToOnlyOneReferencedItem"); - if (_matchOnMetadata.IsEmpty && ItemspecContainsASingleBareItemReference(_itemSpec, _itemElement.ItemType)) + if (_matchOnMetadata.IsEmpty && ItemspecContainsASingleBareItemReference(_itemSpec, _itemElement.ItemType) && _conditionResult) { // Perf optimization: If the Remove operation references itself (e.g. ) // then all items are removed and matching is not necessary From 247318e8aedd8cc62ffc21ec9c28b44cdbec003b Mon Sep 17 00:00:00 2001 From: Nathan Mytelka Date: Wed, 2 Dec 2020 11:20:47 -0800 Subject: [PATCH 2/2] Test Remove optimization still respects condition --- .../Definition/ProjectItem_Tests.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Build.OM.UnitTests/Definition/ProjectItem_Tests.cs b/src/Build.OM.UnitTests/Definition/ProjectItem_Tests.cs index 9299381c7ca..d94e4ab56e0 100644 --- a/src/Build.OM.UnitTests/Definition/ProjectItem_Tests.cs +++ b/src/Build.OM.UnitTests/Definition/ProjectItem_Tests.cs @@ -2774,6 +2774,17 @@ public void UpdateShouldImportMetadataFromReferencedItem() ObjectModelHelpers.AssertItemHasMetadata(expectedMetadataC, items[4]); } + [Fact] + public void OptimizedRemoveOperationRespectsCondition() + { + string content = @" + + "; + IList items = ObjectModelHelpers.GetItemsFromFragment(content, true); + + items[0].EvaluatedInclude.ShouldBe("InitialValue"); + } + [Theory] [InlineData(true)] [InlineData(false)]