using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using JetBrains.Annotations; namespace RoR2; [MeansImplicitUse] public abstract class SearchableAttribute : Attribute { private static readonly Dictionary> instancesListsByType; private static HashSet assemblyBlacklist; public object target { get; private set; } public static List GetInstances() where T : SearchableAttribute { if (instancesListsByType.TryGetValue(typeof(T), out var value)) { return value; } return null; } public static void GetInstances(List dest) where T : SearchableAttribute { List instances = GetInstances(); if (instances == null) { return; } foreach (SearchableAttribute item in instances) { dest.Add((T)item); } } private static IEnumerable GetScannableAssemblies() { return from a in AppDomain.CurrentDomain.GetAssemblies() where !assemblyBlacklist.Contains(a.GetName().Name) select a; } private static void Scan() { IEnumerable enumerable = GetScannableAssemblies().SelectMany((Assembly a) => a.GetTypes()); List allInstancesList = new List(); Type memoizedInput = null; List memoizedOutput = null; foreach (Type item in enumerable) { foreach (SearchableAttribute customAttribute in CustomAttributeExtensions.GetCustomAttributes(item, inherit: false)) { Register(customAttribute, item); } MemberInfo[] members = item.GetMembers(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); foreach (MemberInfo element in members) { foreach (SearchableAttribute customAttribute2 in CustomAttributeExtensions.GetCustomAttributes(element, inherit: false)) { Register(customAttribute2, element); } } } List GetInstancesListForType(Type attributeType) { if (attributeType.Equals(memoizedInput)) { return memoizedOutput; } if (!instancesListsByType.TryGetValue(attributeType, out var value)) { value = new List(); instancesListsByType.Add(attributeType, value); } memoizedInput = attributeType; memoizedOutput = value; return value; } void Register(SearchableAttribute attribute, object target) { attribute.target = target; allInstancesList.Add(attribute); GetInstancesListForType(attribute.GetType()).Add(attribute); } } static SearchableAttribute() { instancesListsByType = new Dictionary>(); assemblyBlacklist = new HashSet { "mscorlib", "UnityEngine", "UnityEngine.AIModule", "UnityEngine.ARModule", "UnityEngine.AccessibilityModule", "UnityEngine.AnimationModule", "UnityEngine.AssetBundleModule", "UnityEngine.AudioModule", "UnityEngine.BaselibModule", "UnityEngine.ClothModule", "UnityEngine.ClusterInputModule", "UnityEngine.ClusterRendererModule", "UnityEngine.CoreModule", "UnityEngine.CrashReportingModule", "UnityEngine.DirectorModule", "UnityEngine.FileSystemHttpModule", "UnityEngine.GameCenterModule", "UnityEngine.GridModule", "UnityEngine.HotReloadModule", "UnityEngine.IMGUIModule", "UnityEngine.ImageConversionModule", "UnityEngine.InputModule", "UnityEngine.JSONSerializeModule", "UnityEngine.LocalizationModule", "UnityEngine.ParticleSystemModule", "UnityEngine.PerformanceReportingModule", "UnityEngine.PhysicsModule", "UnityEngine.Physics2DModule", "UnityEngine.ProfilerModule", "UnityEngine.ScreenCaptureModule", "UnityEngine.SharedInternalsModule", "UnityEngine.SpatialTrackingModule", "UnityEngine.SpriteMaskModule", "UnityEngine.SpriteShapeModule", "UnityEngine.StreamingModule", "UnityEngine.StyleSheetsModule", "UnityEngine.SubstanceModule", "UnityEngine.TLSModule", "UnityEngine.TerrainModule", "UnityEngine.TerrainPhysicsModule", "UnityEngine.TextCoreModule", "UnityEngine.TextRenderingModule", "UnityEngine.TilemapModule", "UnityEngine.TimelineModule", "UnityEngine.UIModule", "UnityEngine.UIElementsModule", "UnityEngine.UNETModule", "UnityEngine.UmbraModule", "UnityEngine.UnityAnalyticsModule", "UnityEngine.UnityConnectModule", "UnityEngine.UnityTestProtocolModule", "UnityEngine.UnityWebRequestModule", "UnityEngine.UnityWebRequestAssetBundleModule", "UnityEngine.UnityWebRequestAudioModule", "UnityEngine.UnityWebRequestTextureModule", "UnityEngine.UnityWebRequestWWWModule", "UnityEngine.VFXModule", "UnityEngine.VRModule", "UnityEngine.VehiclesModule", "UnityEngine.VideoModule", "UnityEngine.WindModule", "UnityEngine.XRModule", "UnityEditor", "Unity.Locator", "System.Core", "System", "Mono.Security", "System.Configuration", "System.Xml", "Unity.DataContract", "Unity.PackageManager", "UnityEngine.UI", "UnityEditor.UI", "UnityEditor.TestRunner", "UnityEngine.TestRunner", "nunit.framework", "UnityEngine.Timeline", "UnityEditor.Timeline", "UnityEngine.Networking", "UnityEditor.Networking", "UnityEditor.GoogleAudioSpatializer", "UnityEngine.GoogleAudioSpatializer", "UnityEditor.SpatialTracking", "UnityEngine.SpatialTracking", "UnityEditor.VR", "UnityEditor.Graphs", "UnityEditor.WindowsStandalone.Extensions", "SyntaxTree.VisualStudio.Unity.Bridge", "Rewired_ControlMapper_CSharp_Editor", "Rewired_CSharp_Editor", "Unity.ProBuilder.AddOns.Editor", "Wwise-Editor", "Unity.RenderPipelines.Core.Editor", "Unity.RenderPipelines.Core.Runtime", "Unity.TextMeshPro.Editor", "Unity.PackageManagerUI.Editor", "Rewired_NintendoSwitch_CSharp", "Unity.Postprocessing.Editor", "Rewired_CSharp", "Unity.Postprocessing.Runtime", "Rewired_NintendoSwitch_CSharp_Editor", "Wwise", "Unity.RenderPipelines.Core.ShaderLibrary", "Unity.TextMeshPro", "Rewired_UnityUI_CSharp_Editor", "Facepunch.Steamworks", "Rewired_Editor", "Rewired_Core", "Rewired_Windows_Lib", "Rewired_NintendoSwitch_Editor", "Rewired_NintendoSwitch_EditorRuntime", "Zio", "AssetIdRemapUtility", "ProBuilderCore", "ProBuilderMeshOps", "KdTreeLib", "pb_Stl", "Poly2Tri", "ProBuilderEditor", "netstandard", "System.Xml.Linq", "Unity.Cecil", "Unity.SerializationLogic", "Unity.Legacy.NRefactory", "ExCSS.Unity", "Unity.IvyParser", "UnityEditor.iOS.Extensions.Xcode", "SyntaxTree.VisualStudio.Unity.Messaging", "Microsoft.GeneratedCode", "Anonymously", "Hosted", "DynamicMethods", "Assembly", "UnityEditor.Switch.Extensions" }; try { Scan(); } catch (Exception ex) { System.Console.WriteLine(ex.Message); } } }