From aecf5515d644600f3a12d5470aa558d9f94ac8e3 Mon Sep 17 00:00:00 2001 From: Jeff Kluge Date: Thu, 21 Nov 2019 09:03:56 -0800 Subject: [PATCH 1/5] Implementation --- .../net/Microsoft.Build.Framework.cs | 4 ++++ .../netstandard/Microsoft.Build.Framework.cs | 4 ++++ .../net/Microsoft.Build.Utilities.Core.cs | 1 + .../Microsoft.Build.Utilities.Core.cs | 1 + .../Components/RequestBuilder/TaskHost.cs | 15 ++++++++++++++- .../Instance/TaskFactories/TaskHostTask.cs | 3 ++- src/Framework/IBuildEngine6.cs | 19 +++++++++++++++++++ src/MSBuild/OutOfProcTaskHostNode.cs | 15 ++++++++++++++- src/Shared/TaskHostConfiguration.cs | 18 +++++++++++++++++- src/Shared/UnitTests/MockEngine.cs | 9 ++++++++- src/Utilities/Task.cs | 11 ++++++++--- 11 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 src/Framework/IBuildEngine6.cs diff --git a/ref/Microsoft.Build.Framework/net/Microsoft.Build.Framework.cs b/ref/Microsoft.Build.Framework/net/Microsoft.Build.Framework.cs index a9cc3b76c19..be172d8592b 100644 --- a/ref/Microsoft.Build.Framework/net/Microsoft.Build.Framework.cs +++ b/ref/Microsoft.Build.Framework/net/Microsoft.Build.Framework.cs @@ -193,6 +193,10 @@ public partial interface IBuildEngine5 : Microsoft.Build.Framework.IBuildEngine, { void LogTelemetry(string eventName, System.Collections.Generic.IDictionary properties); } + public partial interface IBuildEngine6 : Microsoft.Build.Framework.IBuildEngine, Microsoft.Build.Framework.IBuildEngine2, Microsoft.Build.Framework.IBuildEngine3, Microsoft.Build.Framework.IBuildEngine4, Microsoft.Build.Framework.IBuildEngine5 + { + System.Collections.Generic.Dictionary GetGlobalProperties(); + } public partial interface ICancelableTask : Microsoft.Build.Framework.ITask { void Cancel(); diff --git a/ref/Microsoft.Build.Framework/netstandard/Microsoft.Build.Framework.cs b/ref/Microsoft.Build.Framework/netstandard/Microsoft.Build.Framework.cs index 247cf91a717..390da64fc38 100644 --- a/ref/Microsoft.Build.Framework/netstandard/Microsoft.Build.Framework.cs +++ b/ref/Microsoft.Build.Framework/netstandard/Microsoft.Build.Framework.cs @@ -193,6 +193,10 @@ public partial interface IBuildEngine5 : Microsoft.Build.Framework.IBuildEngine, { void LogTelemetry(string eventName, System.Collections.Generic.IDictionary properties); } + public partial interface IBuildEngine6 : Microsoft.Build.Framework.IBuildEngine, Microsoft.Build.Framework.IBuildEngine2, Microsoft.Build.Framework.IBuildEngine3, Microsoft.Build.Framework.IBuildEngine4, Microsoft.Build.Framework.IBuildEngine5 + { + System.Collections.Generic.Dictionary GetGlobalProperties(); + } public partial interface ICancelableTask : Microsoft.Build.Framework.ITask { void Cancel(); diff --git a/ref/Microsoft.Build.Utilities.Core/net/Microsoft.Build.Utilities.Core.cs b/ref/Microsoft.Build.Utilities.Core/net/Microsoft.Build.Utilities.Core.cs index fb383fb887f..d739b45082b 100644 --- a/ref/Microsoft.Build.Utilities.Core/net/Microsoft.Build.Utilities.Core.cs +++ b/ref/Microsoft.Build.Utilities.Core/net/Microsoft.Build.Utilities.Core.cs @@ -351,6 +351,7 @@ protected Task(System.Resources.ResourceManager taskResources, string helpKeywor public Microsoft.Build.Framework.IBuildEngine3 BuildEngine3 { get { throw null; } } public Microsoft.Build.Framework.IBuildEngine4 BuildEngine4 { get { throw null; } } public Microsoft.Build.Framework.IBuildEngine5 BuildEngine5 { get { throw null; } } + public Microsoft.Build.Framework.IBuildEngine6 BuildEngine6 { get { throw null; } } protected string HelpKeywordPrefix { get { throw null; } set { } } public Microsoft.Build.Framework.ITaskHost HostObject { get { throw null; } set { } } public Microsoft.Build.Utilities.TaskLoggingHelper Log { get { throw null; } } diff --git a/ref/Microsoft.Build.Utilities.Core/netstandard/Microsoft.Build.Utilities.Core.cs b/ref/Microsoft.Build.Utilities.Core/netstandard/Microsoft.Build.Utilities.Core.cs index 6b6b6c02eb2..1263a5949a1 100644 --- a/ref/Microsoft.Build.Utilities.Core/netstandard/Microsoft.Build.Utilities.Core.cs +++ b/ref/Microsoft.Build.Utilities.Core/netstandard/Microsoft.Build.Utilities.Core.cs @@ -196,6 +196,7 @@ protected Task(System.Resources.ResourceManager taskResources, string helpKeywor public Microsoft.Build.Framework.IBuildEngine3 BuildEngine3 { get { throw null; } } public Microsoft.Build.Framework.IBuildEngine4 BuildEngine4 { get { throw null; } } public Microsoft.Build.Framework.IBuildEngine5 BuildEngine5 { get { throw null; } } + public Microsoft.Build.Framework.IBuildEngine6 BuildEngine6 { get { throw null; } } protected string HelpKeywordPrefix { get { throw null; } set { } } public Microsoft.Build.Framework.ITaskHost HostObject { get { throw null; } set { } } public Microsoft.Build.Utilities.TaskLoggingHelper Log { get { throw null; } } diff --git a/src/Build/BackEnd/Components/RequestBuilder/TaskHost.cs b/src/Build/BackEnd/Components/RequestBuilder/TaskHost.cs index 4cf1d3ec5f2..ab06e845519 100644 --- a/src/Build/BackEnd/Components/RequestBuilder/TaskHost.cs +++ b/src/Build/BackEnd/Components/RequestBuilder/TaskHost.cs @@ -33,7 +33,7 @@ internal class TaskHost : #if FEATURE_APPDOMAIN MarshalByRefObject, #endif - IBuildEngine5 + IBuildEngine6 { /// /// True if the "secret" environment variable MSBUILDNOINPROCNODE is set. @@ -647,6 +647,19 @@ public void LogTelemetry(string eventName, IDictionary propertie #endregion + #region IBuildEngine6 Members + + /// + /// Gets the global properties for the current project. + /// + /// A containing the global properties of the current project. + public Dictionary GetGlobalProperties() + { + return _requestEntry.RequestConfiguration.GlobalProperties.ToDictionary(); + } + + #endregion + /// /// Called by the internal MSBuild task. /// Does not take the lock because it is called by another request builder thread. diff --git a/src/Build/Instance/TaskFactories/TaskHostTask.cs b/src/Build/Instance/TaskFactories/TaskHostTask.cs index 5710c7b98fe..ead6986c715 100644 --- a/src/Build/Instance/TaskFactories/TaskHostTask.cs +++ b/src/Build/Instance/TaskFactories/TaskHostTask.cs @@ -273,7 +273,8 @@ public bool Execute() BuildEngine.ContinueOnError, _taskType.Type.FullName, AssemblyUtilities.GetAssemblyLocation(_taskType.Type.GetTypeInfo().Assembly), - _setParameters + _setParameters, + new Dictionary(_buildComponentHost.BuildParameters.GlobalProperties) ); try diff --git a/src/Framework/IBuildEngine6.cs b/src/Framework/IBuildEngine6.cs new file mode 100644 index 00000000000..e5fe93aa51d --- /dev/null +++ b/src/Framework/IBuildEngine6.cs @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; + +namespace Microsoft.Build.Framework +{ + /// + /// This interface extends to allow tasks to get the current project's global properties. + /// + public interface IBuildEngine6 : IBuildEngine5 + { + /// + /// Gets the global properties for the current project. + /// + /// A containing the global properties of the current project. + Dictionary GetGlobalProperties(); + } +} diff --git a/src/MSBuild/OutOfProcTaskHostNode.cs b/src/MSBuild/OutOfProcTaskHostNode.cs index 10255fc411d..f5d6aa596ff 100644 --- a/src/MSBuild/OutOfProcTaskHostNode.cs +++ b/src/MSBuild/OutOfProcTaskHostNode.cs @@ -36,7 +36,7 @@ internal class OutOfProcTaskHostNode : #if CLR2COMPATIBILITY IBuildEngine3 #else - IBuildEngine5 + IBuildEngine6 #endif { /// @@ -442,6 +442,19 @@ public void LogTelemetry(string eventName, IDictionary propertie #endregion + #region IBuildEngine6 Implementation + + /// + /// Gets the global properties for the current project. + /// + /// A containing the global properties of the current project. + public Dictionary GetGlobalProperties() + { + return new Dictionary(_currentConfiguration.GlobalProperties); + } + + #endregion + #endif #region INodePacketFactory Members diff --git a/src/Shared/TaskHostConfiguration.cs b/src/Shared/TaskHostConfiguration.cs index 0235cdf0692..199d46eefb2 100644 --- a/src/Shared/TaskHostConfiguration.cs +++ b/src/Shared/TaskHostConfiguration.cs @@ -87,6 +87,8 @@ internal class TaskHostConfiguration : INodePacket /// private Dictionary _taskParameters; + private Dictionary _globalParameters; + /// /// Constructor /// @@ -119,7 +121,8 @@ public TaskHostConfiguration bool continueOnError, string taskName, string taskLocation, - IDictionary taskParameters + IDictionary taskParameters, + Dictionary globalParameters ) { ErrorUtilities.VerifyThrowInternalLength(taskName, "taskName"); @@ -159,6 +162,8 @@ IDictionary taskParameters _taskParameters[parameter.Key] = new TaskParameter(parameter.Value); } } + + _globalParameters = globalParameters ?? new Dictionary(); } /// @@ -301,6 +306,16 @@ public Dictionary TaskParameters { return _taskParameters; } } + /// + /// Gets the global properties for the current project. + /// + public Dictionary GlobalProperties + { + [DebuggerStepThrough] + get + { return _globalParameters; } + } + /// /// The NodePacketType of this NodePacket /// @@ -332,6 +347,7 @@ public void Translate(ITranslator translator) translator.Translate(ref _taskLocation); translator.TranslateDictionary(ref _taskParameters, StringComparer.OrdinalIgnoreCase, TaskParameter.FactoryForDeserialization); translator.Translate(ref _continueOnError); + translator.TranslateDictionary(ref _globalParameters, StringComparer.OrdinalIgnoreCase); } /// diff --git a/src/Shared/UnitTests/MockEngine.cs b/src/Shared/UnitTests/MockEngine.cs index 14da919f659..0fa3fbcaaf0 100644 --- a/src/Shared/UnitTests/MockEngine.cs +++ b/src/Shared/UnitTests/MockEngine.cs @@ -31,7 +31,7 @@ namespace Microsoft.Build.UnitTests * is somewhat of a no-no for task assemblies. * **************************************************************************/ - internal sealed class MockEngine : IBuildEngine5 + internal sealed class MockEngine : IBuildEngine6 { private readonly object _lockObj = new object(); // Protects _log, _output private readonly ITestOutputHelper _output; @@ -53,6 +53,8 @@ internal MockEngine() : this(false) public BuildErrorEventArgs[] ErrorEvents => _errorEvents.ToArray(); + public Dictionary GlobalProperties { get; set; } = new Dictionary(StringComparer.OrdinalIgnoreCase); + internal MockLogger MockLogger { get; } public MockEngine(bool logToConsole) @@ -171,6 +173,11 @@ public void LogTelemetry(string eventName, IDictionary propertie } } + public Dictionary GetGlobalProperties() + { + return GlobalProperties; + } + public bool ContinueOnError => false; public string ProjectFileOfTaskNode => String.Empty; diff --git a/src/Utilities/Task.cs b/src/Utilities/Task.cs index 1a4bab26c5d..76c2d030bd8 100644 --- a/src/Utilities/Task.cs +++ b/src/Utilities/Task.cs @@ -70,20 +70,25 @@ protected Task(ResourceManager taskResources, string helpKeywordPrefix) public IBuildEngine2 BuildEngine2 => (IBuildEngine2)BuildEngine; /// - /// Retrieves the IBuildEngine3 version of the build engine interface provided by the host. + /// Retrieves the version of the build engine interface provided by the host. /// public IBuildEngine3 BuildEngine3 => (IBuildEngine3)BuildEngine; /// - /// Retrieves the IBuildEngine4 version of the build engine interface provided by the host. + /// Retrieves the version of the build engine interface provided by the host. /// public IBuildEngine4 BuildEngine4 => (IBuildEngine4)BuildEngine; /// - /// Retrieves the IBuildEngine5 version of the build engine interface provided by the host. + /// Retrieves the version of the build engine interface provided by the host. /// public IBuildEngine5 BuildEngine5 => (IBuildEngine5)BuildEngine; + /// + /// Retrieves the version of the build engine interface provided by the host. + /// + public IBuildEngine6 BuildEngine6 => (IBuildEngine6)BuildEngine; + /// /// The build engine sets this property if the host IDE has associated a host object with this particular task. /// From 74c08313395ee87d58ef53f8a7918a937082be01 Mon Sep 17 00:00:00 2001 From: Jeff Kluge Date: Thu, 21 Nov 2019 09:20:35 -0800 Subject: [PATCH 2/5] Unit tests --- .../BackEnd/TaskHostConfiguration_Tests.cs | 41 ++++++++--- src/Build.UnitTests/BackEnd/TaskHost_Tests.cs | 72 +++++++++++++++++++ src/Shared/UnitTests/ObjectModelHelpers.cs | 8 +-- 3 files changed, 109 insertions(+), 12 deletions(-) diff --git a/src/Build.UnitTests/BackEnd/TaskHostConfiguration_Tests.cs b/src/Build.UnitTests/BackEnd/TaskHostConfiguration_Tests.cs index 182524b1d6b..58c9083de34 100644 --- a/src/Build.UnitTests/BackEnd/TaskHostConfiguration_Tests.cs +++ b/src/Build.UnitTests/BackEnd/TaskHostConfiguration_Tests.cs @@ -52,6 +52,7 @@ public void ConstructorWithNullName() _continueOnErrorDefault, null, @"c:\my tasks\mytask.dll", + null, null); } ); @@ -79,6 +80,7 @@ public void ConstructorWithEmptyName() _continueOnErrorDefault, String.Empty, @"c:\my tasks\mytask.dll", + null, null); } ); @@ -106,6 +108,7 @@ public void ConstructorWithNullLocation() _continueOnErrorDefault, "TaskName", null, + null, null); } ); @@ -135,6 +138,7 @@ public void ConstructorWithEmptyLocation() _continueOnErrorDefault, "TaskName", String.Empty, + null, null); } ); @@ -162,7 +166,9 @@ public void TestValidConstructors() _continueOnErrorDefault, "TaskName", @"c:\MyTasks\MyTask.dll", + null, null); + TaskHostConfiguration config2 = new TaskHostConfiguration( 1, Directory.GetCurrentDirectory(), @@ -178,7 +184,8 @@ public void TestValidConstructors() _continueOnErrorDefault, "TaskName", @"c:\MyTasks\MyTask.dll", - null); + null, + null); IDictionary parameters = new Dictionary(); TaskHostConfiguration config3 = new TaskHostConfiguration( @@ -196,7 +203,8 @@ public void TestValidConstructors() _continueOnErrorDefault, "TaskName", @"c:\MyTasks\MyTask.dll", - parameters); + parameters, + null); IDictionary parameters2 = new Dictionary(); parameters2.Add("Text", "Hello!"); @@ -219,7 +227,8 @@ public void TestValidConstructors() _continueOnErrorDefault, "TaskName", @"c:\MyTasks\MyTask.dll", - parameters2); + parameters2, + null); } /// @@ -228,6 +237,12 @@ public void TestValidConstructors() [Fact] public void TestTranslationWithNullDictionary() { + var expectedGlobalProperties = new Dictionary + { + ["Property1"] = "Value1", + ["Property2"] = "Value2" + }; + TaskHostConfiguration config = new TaskHostConfiguration( 1, Directory.GetCurrentDirectory(), @@ -243,7 +258,8 @@ public void TestTranslationWithNullDictionary() _continueOnErrorDefault, "TaskName", @"c:\MyTasks\MyTask.dll", - null); + null, + expectedGlobalProperties); ((ITranslatable)config).Translate(TranslationHelpers.GetWriteTranslator()); INodePacket packet = TaskHostConfiguration.FactoryForDeserialization(TranslationHelpers.GetReadTranslator()); @@ -255,6 +271,8 @@ public void TestTranslationWithNullDictionary() Assert.Equal(config.TaskLocation, deserializedConfig.TaskLocation); #endif Assert.Null(deserializedConfig.TaskParameters); + + Assert.Equal(expectedGlobalProperties, deserializedConfig.GlobalProperties); } /// @@ -278,7 +296,8 @@ public void TestTranslationWithEmptyDictionary() _continueOnErrorDefault, "TaskName", @"c:\MyTasks\MyTask.dll", - new Dictionary()); + new Dictionary(), + new Dictionary()); ((ITranslatable)config).Translate(TranslationHelpers.GetWriteTranslator()); INodePacket packet = TaskHostConfiguration.FactoryForDeserialization(TranslationHelpers.GetReadTranslator()); @@ -291,6 +310,9 @@ public void TestTranslationWithEmptyDictionary() #endif Assert.NotNull(deserializedConfig.TaskParameters); Assert.Equal(config.TaskParameters.Count, deserializedConfig.TaskParameters.Count); + + Assert.NotNull(deserializedConfig.GlobalProperties); + Assert.Equal(config.GlobalProperties.Count, deserializedConfig.GlobalProperties.Count); } /// @@ -317,7 +339,8 @@ public void TestTranslationWithValueTypesInDictionary() _continueOnErrorDefault, "TaskName", @"c:\MyTasks\MyTask.dll", - parameters); + parameters, + null); ((ITranslatable)config).Translate(TranslationHelpers.GetWriteTranslator()); INodePacket packet = TaskHostConfiguration.FactoryForDeserialization(TranslationHelpers.GetReadTranslator()); @@ -357,7 +380,8 @@ public void TestTranslationWithITaskItemInDictionary() _continueOnErrorDefault, "TaskName", @"c:\MyTasks\MyTask.dll", - parameters); + parameters, + null); ((ITranslatable)config).Translate(TranslationHelpers.GetWriteTranslator()); INodePacket packet = TaskHostConfiguration.FactoryForDeserialization(TranslationHelpers.GetReadTranslator()); @@ -396,7 +420,8 @@ public void TestTranslationWithITaskItemArrayInDictionary() _continueOnErrorDefault, "TaskName", @"c:\MyTasks\MyTask.dll", - parameters); + parameters, + null); ((ITranslatable)config).Translate(TranslationHelpers.GetWriteTranslator()); INodePacket packet = TaskHostConfiguration.FactoryForDeserialization(TranslationHelpers.GetReadTranslator()); diff --git a/src/Build.UnitTests/BackEnd/TaskHost_Tests.cs b/src/Build.UnitTests/BackEnd/TaskHost_Tests.cs index 13edcad032b..ff501e2f2b8 100644 --- a/src/Build.UnitTests/BackEnd/TaskHost_Tests.cs +++ b/src/Build.UnitTests/BackEnd/TaskHost_Tests.cs @@ -634,6 +634,78 @@ public void LogErrorAfterTaskIsDone() } #endif + /// + /// Verifies that tasks can get global properties. + /// + [Fact] + public void TasksCanGetGlobalProperties() + { + string projectFileContents = @" + + + + + + + + + +"; + + Dictionary globalProperties = new Dictionary + { + ["Property1"] = "Value_%", + ["Property2"] = "Value_$", + ["Property3"] = "Value_@", + ["Property4"] = "Value_'", + ["Property5"] = "Value_;", + ["Property6"] = "Value_?", + ["Property7"] = "Value_*", + }; + + MockLogger mockLogger = Helpers.BuildProjectWithNewOMExpectSuccess(projectFileContents, globalProperties); + + foreach (var item in globalProperties) + { + mockLogger.AssertLogContains($"{item.Key}: '{item.Value}'"); + } + } + + /// + /// Verifies that if the user specifies no global properties, tasks get back an empty collection. + /// + [Fact] + public void TasksGetNoGlobalPropertiesIfNoneSpecified() + { + string projectFileContents = @" + + + + + + + + + +"; + + MockLogger mockLogger = Helpers.BuildProjectWithNewOMExpectSuccess(projectFileContents); + + mockLogger.AssertLogContains("Global property count: 0"); + } + #region Helper Classes /// diff --git a/src/Shared/UnitTests/ObjectModelHelpers.cs b/src/Shared/UnitTests/ObjectModelHelpers.cs index c809a843a69..30b7fed3443 100644 --- a/src/Shared/UnitTests/ObjectModelHelpers.cs +++ b/src/Shared/UnitTests/ObjectModelHelpers.cs @@ -1296,11 +1296,11 @@ internal static void AssertEnumerationsValueEqual(IEnumerable one, IEnumer /// Build a project with the provided content in memory. /// Assert that it succeeded, and return the mock logger with the output. /// - internal static MockLogger BuildProjectWithNewOMExpectSuccess(string content) + internal static MockLogger BuildProjectWithNewOMExpectSuccess(string content, Dictionary globalProperties = null) { MockLogger logger; bool result; - BuildProjectWithNewOM(content, out logger, out result, false); + BuildProjectWithNewOM(content, out logger, out result, false, globalProperties); Assert.True(result); return logger; @@ -1309,12 +1309,12 @@ internal static MockLogger BuildProjectWithNewOMExpectSuccess(string content) /// /// Build a project in memory using the new OM /// - private static void BuildProjectWithNewOM(string content, out MockLogger logger, out bool result, bool allowTaskCrash) + private static void BuildProjectWithNewOM(string content, out MockLogger logger, out bool result, bool allowTaskCrash, Dictionary globalProperties = null) { // Replace the crazy quotes with real ones content = ObjectModelHelpers.CleanupFileContents(content); - Project project = new Project(XmlReader.Create(new StringReader(content))); + Project project = new Project(XmlReader.Create(new StringReader(content)), globalProperties, toolsVersion: null); logger = new MockLogger(); logger.AllowTaskCrashes = allowTaskCrash; List loggers = new List(); From ea2d4ad644aab5ccb09aa6ef07e6d70c81c37bd4 Mon Sep 17 00:00:00 2001 From: Jeff Kluge Date: Thu, 21 Nov 2019 09:52:32 -0800 Subject: [PATCH 3/5] Return IDictionary instead of Dictionary --- .../net/Microsoft.Build.Framework.cs | 2 +- .../netstandard/Microsoft.Build.Framework.cs | 2 +- src/Build/BackEnd/Components/RequestBuilder/TaskHost.cs | 4 ++-- src/Framework/IBuildEngine6.cs | 4 ++-- src/MSBuild/OutOfProcTaskHostNode.cs | 4 ++-- src/Shared/UnitTests/MockEngine.cs | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ref/Microsoft.Build.Framework/net/Microsoft.Build.Framework.cs b/ref/Microsoft.Build.Framework/net/Microsoft.Build.Framework.cs index be172d8592b..083399e5eb7 100644 --- a/ref/Microsoft.Build.Framework/net/Microsoft.Build.Framework.cs +++ b/ref/Microsoft.Build.Framework/net/Microsoft.Build.Framework.cs @@ -195,7 +195,7 @@ public partial interface IBuildEngine5 : Microsoft.Build.Framework.IBuildEngine, } public partial interface IBuildEngine6 : Microsoft.Build.Framework.IBuildEngine, Microsoft.Build.Framework.IBuildEngine2, Microsoft.Build.Framework.IBuildEngine3, Microsoft.Build.Framework.IBuildEngine4, Microsoft.Build.Framework.IBuildEngine5 { - System.Collections.Generic.Dictionary GetGlobalProperties(); + System.Collections.Generic.IDictionary GetGlobalProperties(); } public partial interface ICancelableTask : Microsoft.Build.Framework.ITask { diff --git a/ref/Microsoft.Build.Framework/netstandard/Microsoft.Build.Framework.cs b/ref/Microsoft.Build.Framework/netstandard/Microsoft.Build.Framework.cs index 390da64fc38..78743e67b79 100644 --- a/ref/Microsoft.Build.Framework/netstandard/Microsoft.Build.Framework.cs +++ b/ref/Microsoft.Build.Framework/netstandard/Microsoft.Build.Framework.cs @@ -195,7 +195,7 @@ public partial interface IBuildEngine5 : Microsoft.Build.Framework.IBuildEngine, } public partial interface IBuildEngine6 : Microsoft.Build.Framework.IBuildEngine, Microsoft.Build.Framework.IBuildEngine2, Microsoft.Build.Framework.IBuildEngine3, Microsoft.Build.Framework.IBuildEngine4, Microsoft.Build.Framework.IBuildEngine5 { - System.Collections.Generic.Dictionary GetGlobalProperties(); + System.Collections.Generic.IDictionary GetGlobalProperties(); } public partial interface ICancelableTask : Microsoft.Build.Framework.ITask { diff --git a/src/Build/BackEnd/Components/RequestBuilder/TaskHost.cs b/src/Build/BackEnd/Components/RequestBuilder/TaskHost.cs index ab06e845519..438dcd6825c 100644 --- a/src/Build/BackEnd/Components/RequestBuilder/TaskHost.cs +++ b/src/Build/BackEnd/Components/RequestBuilder/TaskHost.cs @@ -652,8 +652,8 @@ public void LogTelemetry(string eventName, IDictionary propertie /// /// Gets the global properties for the current project. /// - /// A containing the global properties of the current project. - public Dictionary GetGlobalProperties() + /// An containing the global properties of the current project. + public IDictionary GetGlobalProperties() { return _requestEntry.RequestConfiguration.GlobalProperties.ToDictionary(); } diff --git a/src/Framework/IBuildEngine6.cs b/src/Framework/IBuildEngine6.cs index e5fe93aa51d..3d980b98437 100644 --- a/src/Framework/IBuildEngine6.cs +++ b/src/Framework/IBuildEngine6.cs @@ -13,7 +13,7 @@ public interface IBuildEngine6 : IBuildEngine5 /// /// Gets the global properties for the current project. /// - /// A containing the global properties of the current project. - Dictionary GetGlobalProperties(); + /// An containing the global properties of the current project. + IDictionary GetGlobalProperties(); } } diff --git a/src/MSBuild/OutOfProcTaskHostNode.cs b/src/MSBuild/OutOfProcTaskHostNode.cs index f5d6aa596ff..d34194c6de7 100644 --- a/src/MSBuild/OutOfProcTaskHostNode.cs +++ b/src/MSBuild/OutOfProcTaskHostNode.cs @@ -447,8 +447,8 @@ public void LogTelemetry(string eventName, IDictionary propertie /// /// Gets the global properties for the current project. /// - /// A containing the global properties of the current project. - public Dictionary GetGlobalProperties() + /// An containing the global properties of the current project. + public IDictionary GetGlobalProperties() { return new Dictionary(_currentConfiguration.GlobalProperties); } diff --git a/src/Shared/UnitTests/MockEngine.cs b/src/Shared/UnitTests/MockEngine.cs index 0fa3fbcaaf0..ef6306d240e 100644 --- a/src/Shared/UnitTests/MockEngine.cs +++ b/src/Shared/UnitTests/MockEngine.cs @@ -173,7 +173,7 @@ public void LogTelemetry(string eventName, IDictionary propertie } } - public Dictionary GetGlobalProperties() + public IDictionary GetGlobalProperties() { return GlobalProperties; } From 6b0e759afbd65d59350a3afd70d3c6c1c3f9d504 Mon Sep 17 00:00:00 2001 From: Jeff Kluge Date: Thu, 21 Nov 2019 09:53:57 -0800 Subject: [PATCH 4/5] Fix spacing in TaskHostConfiguration_Tests --- src/Build.UnitTests/BackEnd/TaskHostConfiguration_Tests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Build.UnitTests/BackEnd/TaskHostConfiguration_Tests.cs b/src/Build.UnitTests/BackEnd/TaskHostConfiguration_Tests.cs index 58c9083de34..716b94050f0 100644 --- a/src/Build.UnitTests/BackEnd/TaskHostConfiguration_Tests.cs +++ b/src/Build.UnitTests/BackEnd/TaskHostConfiguration_Tests.cs @@ -185,7 +185,7 @@ public void TestValidConstructors() "TaskName", @"c:\MyTasks\MyTask.dll", null, - null); + null); IDictionary parameters = new Dictionary(); TaskHostConfiguration config3 = new TaskHostConfiguration( @@ -204,7 +204,7 @@ public void TestValidConstructors() "TaskName", @"c:\MyTasks\MyTask.dll", parameters, - null); + null); IDictionary parameters2 = new Dictionary(); parameters2.Add("Text", "Hello!"); @@ -228,7 +228,7 @@ public void TestValidConstructors() "TaskName", @"c:\MyTasks\MyTask.dll", parameters2, - null); + null); } /// From b3bb4ac6f67b85661dc07a6cf9acb19fb72452c7 Mon Sep 17 00:00:00 2001 From: Jeff Kluge Date: Thu, 21 Nov 2019 10:03:04 -0800 Subject: [PATCH 5/5] Use IReadOnlyDictionary instead --- .../net/Microsoft.Build.Framework.cs | 2 +- .../netstandard/Microsoft.Build.Framework.cs | 2 +- src/Build/BackEnd/Components/RequestBuilder/TaskHost.cs | 4 ++-- src/Framework/IBuildEngine6.cs | 4 ++-- src/MSBuild/OutOfProcTaskHostNode.cs | 4 ++-- src/Shared/UnitTests/MockEngine.cs | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ref/Microsoft.Build.Framework/net/Microsoft.Build.Framework.cs b/ref/Microsoft.Build.Framework/net/Microsoft.Build.Framework.cs index 083399e5eb7..f848650b1d0 100644 --- a/ref/Microsoft.Build.Framework/net/Microsoft.Build.Framework.cs +++ b/ref/Microsoft.Build.Framework/net/Microsoft.Build.Framework.cs @@ -195,7 +195,7 @@ public partial interface IBuildEngine5 : Microsoft.Build.Framework.IBuildEngine, } public partial interface IBuildEngine6 : Microsoft.Build.Framework.IBuildEngine, Microsoft.Build.Framework.IBuildEngine2, Microsoft.Build.Framework.IBuildEngine3, Microsoft.Build.Framework.IBuildEngine4, Microsoft.Build.Framework.IBuildEngine5 { - System.Collections.Generic.IDictionary GetGlobalProperties(); + System.Collections.Generic.IReadOnlyDictionary GetGlobalProperties(); } public partial interface ICancelableTask : Microsoft.Build.Framework.ITask { diff --git a/ref/Microsoft.Build.Framework/netstandard/Microsoft.Build.Framework.cs b/ref/Microsoft.Build.Framework/netstandard/Microsoft.Build.Framework.cs index 78743e67b79..19a6888414a 100644 --- a/ref/Microsoft.Build.Framework/netstandard/Microsoft.Build.Framework.cs +++ b/ref/Microsoft.Build.Framework/netstandard/Microsoft.Build.Framework.cs @@ -195,7 +195,7 @@ public partial interface IBuildEngine5 : Microsoft.Build.Framework.IBuildEngine, } public partial interface IBuildEngine6 : Microsoft.Build.Framework.IBuildEngine, Microsoft.Build.Framework.IBuildEngine2, Microsoft.Build.Framework.IBuildEngine3, Microsoft.Build.Framework.IBuildEngine4, Microsoft.Build.Framework.IBuildEngine5 { - System.Collections.Generic.IDictionary GetGlobalProperties(); + System.Collections.Generic.IReadOnlyDictionary GetGlobalProperties(); } public partial interface ICancelableTask : Microsoft.Build.Framework.ITask { diff --git a/src/Build/BackEnd/Components/RequestBuilder/TaskHost.cs b/src/Build/BackEnd/Components/RequestBuilder/TaskHost.cs index 438dcd6825c..2f57426067b 100644 --- a/src/Build/BackEnd/Components/RequestBuilder/TaskHost.cs +++ b/src/Build/BackEnd/Components/RequestBuilder/TaskHost.cs @@ -652,8 +652,8 @@ public void LogTelemetry(string eventName, IDictionary propertie /// /// Gets the global properties for the current project. /// - /// An containing the global properties of the current project. - public IDictionary GetGlobalProperties() + /// An containing the global properties of the current project. + public IReadOnlyDictionary GetGlobalProperties() { return _requestEntry.RequestConfiguration.GlobalProperties.ToDictionary(); } diff --git a/src/Framework/IBuildEngine6.cs b/src/Framework/IBuildEngine6.cs index 3d980b98437..a8b7f70a673 100644 --- a/src/Framework/IBuildEngine6.cs +++ b/src/Framework/IBuildEngine6.cs @@ -13,7 +13,7 @@ public interface IBuildEngine6 : IBuildEngine5 /// /// Gets the global properties for the current project. /// - /// An containing the global properties of the current project. - IDictionary GetGlobalProperties(); + /// An containing the global properties of the current project. + IReadOnlyDictionary GetGlobalProperties(); } } diff --git a/src/MSBuild/OutOfProcTaskHostNode.cs b/src/MSBuild/OutOfProcTaskHostNode.cs index d34194c6de7..af10ead716a 100644 --- a/src/MSBuild/OutOfProcTaskHostNode.cs +++ b/src/MSBuild/OutOfProcTaskHostNode.cs @@ -447,8 +447,8 @@ public void LogTelemetry(string eventName, IDictionary propertie /// /// Gets the global properties for the current project. /// - /// An containing the global properties of the current project. - public IDictionary GetGlobalProperties() + /// An containing the global properties of the current project. + public IReadOnlyDictionary GetGlobalProperties() { return new Dictionary(_currentConfiguration.GlobalProperties); } diff --git a/src/Shared/UnitTests/MockEngine.cs b/src/Shared/UnitTests/MockEngine.cs index ef6306d240e..4e8bea7d34c 100644 --- a/src/Shared/UnitTests/MockEngine.cs +++ b/src/Shared/UnitTests/MockEngine.cs @@ -173,7 +173,7 @@ public void LogTelemetry(string eventName, IDictionary propertie } } - public IDictionary GetGlobalProperties() + public IReadOnlyDictionary GetGlobalProperties() { return GlobalProperties; }