From a28432ac28574611ba442a9200cb6741ce6ee96b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 27 Sep 2025 13:59:39 +0000 Subject: [PATCH 1/2] Initial plan From a1a32e02cc0c70296762e1237ec78e398f4fa529 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 27 Sep 2025 14:11:24 +0000 Subject: [PATCH 2/2] Add System.Uri::EscapeDataString to MSBuild property function allowlist Co-authored-by: baronfel <573979+baronfel@users.noreply.github.com> --- .../IntrinsicFunctionOverload_Tests.cs | 22 +++++++++++++++++++ src/Build/Resources/Constants.cs | 1 + 2 files changed, 23 insertions(+) diff --git a/src/Build.UnitTests/Evaluation/IntrinsicFunctionOverload_Tests.cs b/src/Build.UnitTests/Evaluation/IntrinsicFunctionOverload_Tests.cs index 8f162834b18..405aa0436af 100644 --- a/src/Build.UnitTests/Evaluation/IntrinsicFunctionOverload_Tests.cs +++ b/src/Build.UnitTests/Evaluation/IntrinsicFunctionOverload_Tests.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System; using System.IO; using Microsoft.Build.Evaluation; using Microsoft.Build.Framework; @@ -568,5 +569,26 @@ public void MSBuildModuloReal() ProjectProperty? actualProperty = project.GetProperty("Actual"); actualProperty.EvaluatedValue.ShouldBe(expected); } + + [Fact] + public void SystemUriEscapeDataString() + { + const string projectContent = @" + + + hello world & friends + $([System.Uri]::EscapeDataString($(TestInput))) + + "; + + string expected = Uri.EscapeDataString("hello world & friends"); + + using TestEnvironment env = TestEnvironment.Create(); + + using ProjectFromString projectFromString = new(projectContent.Cleanup()); + Project project = projectFromString.Project; + ProjectProperty? actualProperty = project.GetProperty("Escaped"); + actualProperty.EvaluatedValue.ShouldBe(expected); + } } } diff --git a/src/Build/Resources/Constants.cs b/src/Build/Resources/Constants.cs index 7c848594fba..7d439a637c1 100644 --- a/src/Build/Resources/Constants.cs +++ b/src/Build/Resources/Constants.cs @@ -394,6 +394,7 @@ private static void InitializeAvailableMethods() availableStaticMethods.TryAdd("System.StringComparer", new Tuple(null, typeof(StringComparer))); availableStaticMethods.TryAdd("System.TimeSpan", new Tuple(null, typeof(TimeSpan))); availableStaticMethods.TryAdd("System.Text.RegularExpressions.Regex", new Tuple(null, typeof(Regex))); + availableStaticMethods.TryAdd("System.Uri", new Tuple(null, typeof(Uri))); availableStaticMethods.TryAdd("System.UriBuilder", new Tuple(null, typeof(UriBuilder))); availableStaticMethods.TryAdd("System.Version", new Tuple(null, typeof(Version))); availableStaticMethods.TryAdd("Microsoft.Build.Utilities.ToolLocationHelper", new Tuple("Microsoft.Build.Utilities.ToolLocationHelper, Microsoft.Build.Utilities.Core, Version=" + MSBuildConstants.CurrentAssemblyVersion + ", Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", null));