diff --git a/BizHawk.Client.EmuHawk/tools/ToolManager.cs b/BizHawk.Client.EmuHawk/tools/ToolManager.cs index 1d4f348f0f..18dc99da8a 100644 --- a/BizHawk.Client.EmuHawk/tools/ToolManager.cs +++ b/BizHawk.Client.EmuHawk/tools/ToolManager.cs @@ -728,60 +728,33 @@ namespace BizHawk.Client.EmuHawk } } - public bool IsAvailable() - { - return IsAvailable(typeof(T)); - } + private static readonly Lazy lazyAsmTypes = new Lazy(() => Assembly.ReflectionOnlyLoadFrom(Assembly.GetExecutingAssembly().Location).GetTypes()); - 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; } - if (t == typeof(LuaConsole) && PlatformLinkedLibSingleton.RunningOnUnix) return false; - - var tool = Assembly - .GetExecutingAssembly() - .GetTypes() - .FirstOrDefault(type => type == t); - - if (tool == null) // This isn't a tool, must not be available + ToolAttribute attr; + try { - return false; + attr = tool.GetCustomAttributes(false).OfType().Single(); } - - var attr = tool.GetCustomAttributes(false) - .OfType() - .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()) + catch (InvalidOperationException e) // no ToolAttribute on given type { - // supported systems are available - 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; - } + return true; } - else if (attr?.UnsupportedCores != null && attr.UnsupportedCores.Any()) - { - // no supported system specified, but unsupported cores are - if (attr.UnsupportedCores.Contains(Global.Emulator.DisplayName())) - supported = false; - } - - return supported; + var sysName = Global.Emulator.DisplayName(); + return !attr.UnsupportedCores.Contains(sysName) // not unsupported + && (!attr.SupportedSystems.Any() || attr.SupportedSystems.Contains(sysName)); // supported (no supported list -> assumed all supported) } + public bool IsAvailable() => 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 #region Tools