diff --git a/src/Microsoft.Android.Build.BaseTasks/MSBuildExtensions.cs b/src/Microsoft.Android.Build.BaseTasks/MSBuildExtensions.cs index d50b3d9..757b754 100644 --- a/src/Microsoft.Android.Build.BaseTasks/MSBuildExtensions.cs +++ b/src/Microsoft.Android.Build.BaseTasks/MSBuildExtensions.cs @@ -13,6 +13,12 @@ namespace Microsoft.Android.Build.Tasks { + [Flags] + public enum RegisterTaskObjectKeyFlags { + None = 0, + IncludeProjectFile = 1 << 0, + } + public static class MSBuildExtensions { public static void LogDebugMessage (this TaskLoggingHelper log, string message, params object[] messageArgs) @@ -252,34 +258,80 @@ public static void SetDestinationSubPath (this ITaskItem assembly) /// /// IBuildEngine4.RegisterTaskObject, but adds the current assembly path into the key /// + [Obsolete ("Use RegisterTaskObjectAssemblyLocal (engine, key, value, allowEarlyCollection, lifetime, flags) instead.")] public static void RegisterTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, object value, RegisteredTaskObjectLifetime lifetime, bool allowEarlyCollection = false) => - engine.RegisterTaskObject ((AssemblyLocation, key), value, lifetime, allowEarlyCollection); + RegisterTaskObjectAssemblyLocal (engine, key, value, lifetime, allowEarlyCollection: false, flags: RegisterTaskObjectKeyFlags.IncludeProjectFile); + + /// + /// IBuildEngine4.RegisterTaskObject, but adds the current assembly path into the key + /// + public static void RegisterTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, object value, RegisteredTaskObjectLifetime lifetime, bool allowEarlyCollection = false, RegisterTaskObjectKeyFlags flags = RegisterTaskObjectKeyFlags.IncludeProjectFile) => + engine.RegisterTaskObject (engine.GetKey (AssemblyLocation, key, flags), value, lifetime, allowEarlyCollection); /// /// IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key /// + [Obsolete ("Use GetRegisteredTaskObjectAssemblyLocal (engine, key, lifetime, flags) instead.")] public static object GetRegisteredTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime) => - engine.GetRegisteredTaskObject ((AssemblyLocation, key), lifetime); + GetRegisteredTaskObjectAssemblyLocal (engine, key, lifetime, flags: RegisterTaskObjectKeyFlags.IncludeProjectFile); + + /// + /// IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key + /// + public static object GetRegisteredTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime, RegisterTaskObjectKeyFlags flags = RegisterTaskObjectKeyFlags.IncludeProjectFile) => + engine.GetRegisteredTaskObject (engine.GetKey (AssemblyLocation, key, flags), lifetime); + /// /// Generic version of IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key /// + [Obsolete ("Use GetRegisteredTaskObjectAssemblyLocal (engine, key, lifetime, flags) instead.")] public static T GetRegisteredTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime) - where T : class => - engine.GetRegisteredTaskObject ((AssemblyLocation, key), lifetime) as T; + where T : class => GetRegisteredTaskObjectAssemblyLocal (engine, key, lifetime, flags: RegisterTaskObjectKeyFlags.IncludeProjectFile); + /// + /// Generic version of IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key + /// + public static T GetRegisteredTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime, RegisterTaskObjectKeyFlags flags = RegisterTaskObjectKeyFlags.IncludeProjectFile) + where T : class => + engine.GetRegisteredTaskObject (engine.GetKey (AssemblyLocation, key, flags), lifetime) as T; /// /// IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key /// + [Obsolete ("Use UnregisterTaskObjectAssemblyLocal (engine, key, lifetime, flags) instead.")] public static object UnregisterTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime) => - engine.UnregisterTaskObject ((AssemblyLocation, key), lifetime); + UnregisterTaskObjectAssemblyLocal (engine, key, lifetime, flags: RegisterTaskObjectKeyFlags.IncludeProjectFile); + + /// + /// IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key + /// + public static object UnregisterTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime, RegisterTaskObjectKeyFlags flags = RegisterTaskObjectKeyFlags.IncludeProjectFile) => + engine.UnregisterTaskObject (engine.GetKey (AssemblyLocation, key, flags), lifetime); /// /// Generic version of IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key /// + [Obsolete ("Use UnregisterTaskObjectAssemblyLocal (engine, key, lifetime, flags) instead.")] public static T UnregisterTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime) + where T : class => UnregisterTaskObjectAssemblyLocal (engine, key, lifetime, flags: RegisterTaskObjectKeyFlags.IncludeProjectFile); + + /// + /// Generic version of IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key + /// + public static T UnregisterTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime, RegisterTaskObjectKeyFlags flags = RegisterTaskObjectKeyFlags.IncludeProjectFile) where T : class => - engine.UnregisterTaskObject ((AssemblyLocation, key), lifetime) as T; + engine.UnregisterTaskObject (engine.GetKey (AssemblyLocation, key, flags), lifetime) as T; + + /// + /// Method to calculate the key for the RegisterTaskObject. This is based on the + /// RegisterTaskObjectKeyFlags which are passed. + /// + static object GetKey (this IBuildEngine4 engine, string location, object key, RegisterTaskObjectKeyFlags flags) + { + return ((flags & RegisterTaskObjectKeyFlags.IncludeProjectFile) != 0) + ? (location, key, engine.ProjectFileOfTaskNode) + : (location, key, string.Empty); + } } }