Merge pull request #1569 from TASVideos/isavailable_rewrite

Rewrite ToolManager.IsAvailable
This commit is contained in:
feos 2019-05-25 19:45:33 +03:00 committed by GitHub
commit 05b770fcff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 15 additions and 42 deletions

View File

@ -728,60 +728,33 @@ namespace BizHawk.Client.EmuHawk
} }
} }
public bool IsAvailable<T>() private static readonly Lazy<Type[]> lazyAsmTypes = new Lazy<Type[]>(() => Assembly.ReflectionOnlyLoadFrom(Assembly.GetExecutingAssembly().Location).GetTypes());
{
return IsAvailable(typeof(T));
}
public bool IsAvailable(Type t) public bool IsAvailable(Type tool)
{ {
if (!ServiceInjector.IsAvailable(Global.Emulator.ServiceProvider, t)) if (!ServiceInjector.IsAvailable(Global.Emulator.ServiceProvider, tool)
|| (tool == typeof(LuaConsole) && PlatformLinkedLibSingleton.RunningOnUnix) // simply doesn't work (for now)
|| !Array.Exists(lazyAsmTypes.Value, t => t == tool)) // not a tool
{ {
return false; return false;
} }
if (t == typeof(LuaConsole) && PlatformLinkedLibSingleton.RunningOnUnix) return false; ToolAttribute attr;
try
var tool = Assembly
.GetExecutingAssembly()
.GetTypes()
.FirstOrDefault(type => type == t);
if (tool == null) // This isn't a tool, must not be available
{ {
return false; attr = tool.GetCustomAttributes(false).OfType<ToolAttribute>().Single();
} }
catch (InvalidOperationException e) // no ToolAttribute on given type
var attr = tool.GetCustomAttributes(false)
.OfType<ToolAttribute>()
.FirstOrDefault();
// start with the assumption that if no supported systems are mentioned and no unsupported cores are mentioned
// then this is available for all
bool supported = true;
if (attr?.SupportedSystems != null && attr.SupportedSystems.Any())
{ {
// supported systems are available return true;
supported = attr.SupportedSystems.Contains(Global.Emulator.SystemId);
if (supported)
{
// check for a core not supported override
if (attr.UnsupportedCores.Contains(Global.Emulator.DisplayName()))
supported = false;
}
} }
else if (attr?.UnsupportedCores != null && attr.UnsupportedCores.Any()) var sysName = Global.Emulator.DisplayName();
{ return !attr.UnsupportedCores.Contains(sysName) // not unsupported
// no supported system specified, but unsupported cores are && (!attr.SupportedSystems.Any() || attr.SupportedSystems.Contains(sysName)); // supported (no supported list -> assumed all supported)
if (attr.UnsupportedCores.Contains(Global.Emulator.DisplayName()))
supported = false;
}
return supported;
} }
public bool IsAvailable<T>() => IsAvailable(typeof(T));
// Note: Referencing these properties creates an instance of the tool and persists it. They should be referenced by type if this is not desired // Note: Referencing these properties creates an instance of the tool and persists it. They should be referenced by type if this is not desired
#region Tools #region Tools