Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 58 additions & 6 deletions src/Microsoft.Android.Build.BaseTasks/MSBuildExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -252,34 +258,80 @@ public static void SetDestinationSubPath (this ITaskItem assembly)
/// <summary>
/// IBuildEngine4.RegisterTaskObject, but adds the current assembly path into the key
/// </summary>
[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);

/// <summary>
/// IBuildEngine4.RegisterTaskObject, but adds the current assembly path into the key
/// </summary>
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);

/// <summary>
/// IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key
/// </summary>
[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);

/// <summary>
/// IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key
/// </summary>
public static object GetRegisteredTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime, RegisterTaskObjectKeyFlags flags = RegisterTaskObjectKeyFlags.IncludeProjectFile) =>
engine.GetRegisteredTaskObject (engine.GetKey (AssemblyLocation, key, flags), lifetime);


/// <summary>
/// Generic version of IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key
/// </summary>
[Obsolete ("Use GetRegisteredTaskObjectAssemblyLocal<T> (engine, key, lifetime, flags) instead.")]
public static T GetRegisteredTaskObjectAssemblyLocal<T> (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime)
where T : class =>
engine.GetRegisteredTaskObject ((AssemblyLocation, key), lifetime) as T;
where T : class => GetRegisteredTaskObjectAssemblyLocal<T> (engine, key, lifetime, flags: RegisterTaskObjectKeyFlags.IncludeProjectFile);

/// <summary>
/// Generic version of IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key
/// </summary>
public static T GetRegisteredTaskObjectAssemblyLocal<T> (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime, RegisterTaskObjectKeyFlags flags = RegisterTaskObjectKeyFlags.IncludeProjectFile)
where T : class =>
engine.GetRegisteredTaskObject (engine.GetKey (AssemblyLocation, key, flags), lifetime) as T;

/// <summary>
/// IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key
/// </summary>
[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);

/// <summary>
/// IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key
/// </summary>
public static object UnregisterTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime, RegisterTaskObjectKeyFlags flags = RegisterTaskObjectKeyFlags.IncludeProjectFile) =>
engine.UnregisterTaskObject (engine.GetKey (AssemblyLocation, key, flags), lifetime);

/// <summary>
/// Generic version of IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key
/// </summary>
[Obsolete ("Use UnregisterTaskObjectAssemblyLocal<T> (engine, key, lifetime, flags) instead.")]
public static T UnregisterTaskObjectAssemblyLocal<T> (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime)
where T : class => UnregisterTaskObjectAssemblyLocal<T> (engine, key, lifetime, flags: RegisterTaskObjectKeyFlags.IncludeProjectFile);

/// <summary>
/// Generic version of IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key
/// </summary>
public static T UnregisterTaskObjectAssemblyLocal<T> (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;

/// <summary>
/// Method to calculate the key for the RegisterTaskObject. This is based on the
/// RegisterTaskObjectKeyFlags which are passed.
/// </summary>
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);
}
}
}