From 6e06bc8b94413cbb172d8cf32cd41d6bb52acb0d Mon Sep 17 00:00:00 2001 From: Jenny Bai Date: Mon, 12 Jun 2023 10:05:37 +0800 Subject: [PATCH 1/3] Add WithoutMetadataValue --- .../Evaluation/Expander_Tests.cs | 31 ++++++++++++++++ src/Build/Evaluation/Expander.cs | 36 +++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/src/Build.UnitTests/Evaluation/Expander_Tests.cs b/src/Build.UnitTests/Evaluation/Expander_Tests.cs index ca2a731a82d..980b2cb51c6 100644 --- a/src/Build.UnitTests/Evaluation/Expander_Tests.cs +++ b/src/Build.UnitTests/Evaluation/Expander_Tests.cs @@ -1118,6 +1118,37 @@ public void HasMetadata() logger.AssertLogContains("[One|Three|Four]"); } + + /// + /// Filter by metadata presence + /// + [Fact] + public void WithoutMetadataValue() + { + MockLogger logger = Helpers.BuildProjectWithNewOMExpectSuccess(""" + + + <_Item Include="One"> + true + + <_Item Include="Two"> + false + + <_Item Include="Three"> + + + <_Item Include="Four"> + + + + + WithoutMetadataValue('a'), 'true')]""/> + + + """); + + logger.AssertLogContains("[Two|Three|Four]"); + } [Fact] public void DirectItemMetadataReferenceShouldBeCaseInsensitive() { diff --git a/src/Build/Evaluation/Expander.cs b/src/Build/Evaluation/Expander.cs index d0c6ea7f0fe..f17fa81f5b0 100644 --- a/src/Build/Evaluation/Expander.cs +++ b/src/Build/Evaluation/Expander.cs @@ -2843,6 +2843,42 @@ internal static IEnumerable> WithMetadataValue(Expander ex } } + /// + /// Intrinsic function that returns those items don't have the given metadata value + /// Using a case insensitive comparison. + /// + internal static IEnumerable> WithoutMetadataValue(Expander expander, IElementLocation elementLocation, bool includeNullEntries, string functionName, IEnumerable> itemsOfType, string[] arguments) + { + ProjectErrorUtilities.VerifyThrowInvalidProject(arguments?.Length == 2, elementLocation, "InvalidItemFunctionSyntax", functionName, arguments == null ? 0 : arguments.Length); + + string metadataName = arguments[0]; + string metadataValueToFind = arguments[1]; + + foreach (Pair item in itemsOfType) + { + string metadataValue = null; + + try + { + metadataValue = item.Value.GetMetadataValueEscaped(metadataName); + } + catch (ArgumentException ex) // Blank metadata name + { + ProjectErrorUtilities.ThrowInvalidProject(elementLocation, "CannotEvaluateItemMetadata", metadataName, ex.Message); + } + catch (InvalidOperationException ex) + { + ProjectErrorUtilities.ThrowInvalidProject(elementLocation, "CannotEvaluateItemMetadata", metadataName, ex.Message); + } + + if (!String.Equals(metadataValue, metadataValueToFind, StringComparison.OrdinalIgnoreCase)) + { + // return a result through the enumerator + yield return new Pair(item.Key, item.Value); + } + } + } + /// /// Intrinsic function that returns a boolean to indicate if any of the items have the given metadata value /// Using a case insensitive comparison. From 0c0cbbb8f52cafe45f1b01f5591b322a8a46ebc0 Mon Sep 17 00:00:00 2001 From: Jenny Bai Date: Mon, 12 Jun 2023 14:49:23 +0800 Subject: [PATCH 2/3] Refactor the test case --- src/Build.UnitTests/Evaluation/Expander_Tests.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Build.UnitTests/Evaluation/Expander_Tests.cs b/src/Build.UnitTests/Evaluation/Expander_Tests.cs index 980b2cb51c6..11a505c2fd4 100644 --- a/src/Build.UnitTests/Evaluation/Expander_Tests.cs +++ b/src/Build.UnitTests/Evaluation/Expander_Tests.cs @@ -1120,13 +1120,13 @@ public void HasMetadata() /// - /// Filter by metadata presence + /// Filter items by WithoutMetadataValue function /// [Fact] public void WithoutMetadataValue() { MockLogger logger = Helpers.BuildProjectWithNewOMExpectSuccess(""" - + <_Item Include="One"> true @@ -1141,8 +1141,8 @@ public void WithoutMetadataValue() - - WithoutMetadataValue('a'), 'true')]""/> + + """); From 4add2e9a7078635e516f7151c6e0bc8149ea03c5 Mon Sep 17 00:00:00 2001 From: Jenny Bai Date: Tue, 20 Jun 2023 21:01:34 -0700 Subject: [PATCH 3/3] concise the catch exceptions --- src/Build/Evaluation/Expander.cs | 35 +++++++++----------------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/src/Build/Evaluation/Expander.cs b/src/Build/Evaluation/Expander.cs index f17fa81f5b0..177dfd9f5b3 100644 --- a/src/Build/Evaluation/Expander.cs +++ b/src/Build/Evaluation/Expander.cs @@ -2583,12 +2583,9 @@ internal static IEnumerable> Metadata(Expander expander, I { metadataValue = item.Value.GetMetadataValueEscaped(metadataName); } - catch (ArgumentException ex) // Blank metadata name - { - ProjectErrorUtilities.ThrowInvalidProject(elementLocation, "CannotEvaluateItemMetadata", metadataName, ex.Message); - } - catch (InvalidOperationException ex) + catch (Exception ex) when (ex is ArgumentException || ex is InvalidOperationException) { + // Blank metadata name ProjectErrorUtilities.ThrowInvalidProject(elementLocation, "CannotEvaluateItemMetadata", metadataName, ex.Message); } @@ -2788,12 +2785,9 @@ internal static IEnumerable> HasMetadata(Expander expander { metadataValue = item.Value.GetMetadataValueEscaped(metadataName); } - catch (ArgumentException ex) // Blank metadata name - { - ProjectErrorUtilities.ThrowInvalidProject(elementLocation, "CannotEvaluateItemMetadata", metadataName, ex.Message); - } - catch (InvalidOperationException ex) + catch (Exception ex) when (ex is ArgumentException || ex is InvalidOperationException) { + // Blank metadata name ProjectErrorUtilities.ThrowInvalidProject(elementLocation, "CannotEvaluateItemMetadata", metadataName, ex.Message); } @@ -2826,12 +2820,9 @@ internal static IEnumerable> WithMetadataValue(Expander ex { metadataValue = item.Value.GetMetadataValueEscaped(metadataName); } - catch (ArgumentException ex) // Blank metadata name - { - ProjectErrorUtilities.ThrowInvalidProject(elementLocation, "CannotEvaluateItemMetadata", metadataName, ex.Message); - } - catch (InvalidOperationException ex) + catch (Exception ex) when (ex is ArgumentException || ex is InvalidOperationException) { + // Blank metadata name ProjectErrorUtilities.ThrowInvalidProject(elementLocation, "CannotEvaluateItemMetadata", metadataName, ex.Message); } @@ -2862,12 +2853,9 @@ internal static IEnumerable> WithoutMetadataValue(Expander { metadataValue = item.Value.GetMetadataValueEscaped(metadataName); } - catch (ArgumentException ex) // Blank metadata name - { - ProjectErrorUtilities.ThrowInvalidProject(elementLocation, "CannotEvaluateItemMetadata", metadataName, ex.Message); - } - catch (InvalidOperationException ex) + catch (Exception ex) when (ex is ArgumentException || ex is InvalidOperationException) { + // Blank metadata name ProjectErrorUtilities.ThrowInvalidProject(elementLocation, "CannotEvaluateItemMetadata", metadataName, ex.Message); } @@ -2901,12 +2889,9 @@ internal static IEnumerable> AnyHaveMetadataValue(Expander { metadataValue = item.Value.GetMetadataValueEscaped(metadataName); } - catch (ArgumentException ex) // Blank metadata name - { - ProjectErrorUtilities.ThrowInvalidProject(elementLocation, "CannotEvaluateItemMetadata", metadataName, ex.Message); - } - catch (InvalidOperationException ex) + catch (Exception ex) when (ex is ArgumentException || ex is InvalidOperationException) { + // Blank metadata name ProjectErrorUtilities.ThrowInvalidProject(elementLocation, "CannotEvaluateItemMetadata", metadataName, ex.Message); }