From 2a3df5de9dc3128b1da8d7f4f952a10f084909ff Mon Sep 17 00:00:00 2001 From: sinaioutlander <49360850+sinaioutlander@users.noreply.github.com> Date: Tue, 17 Nov 2020 23:26:22 +1100 Subject: [PATCH] cleanup CacheMembers a bit --- .../Reflection/CacheObject/CacheField.cs | 3 +- .../Reflection/CacheObject/CacheMember.cs | 3 +- .../Reflection/CacheObject/CacheMethod.cs | 2 +- .../Reflection/CacheObject/CacheProperty.cs | 3 +- .../Reflection/ReflectionInspector.cs | 262 ++++++++---------- src/UI/UISyntaxHighlight.cs | 6 +- 6 files changed, 123 insertions(+), 156 deletions(-) diff --git a/src/Inspectors/Reflection/CacheObject/CacheField.cs b/src/Inspectors/Reflection/CacheObject/CacheField.cs index 40eb154..6f05c95 100644 --- a/src/Inspectors/Reflection/CacheObject/CacheField.cs +++ b/src/Inspectors/Reflection/CacheObject/CacheField.cs @@ -5,6 +5,7 @@ using System.Text; using System.Reflection; using UnityExplorer.UI; using UnityExplorer.Helpers; +using UnityEngine; namespace UnityExplorer.Inspectors.Reflection { @@ -14,7 +15,7 @@ namespace UnityExplorer.Inspectors.Reflection public override Type FallbackType => (MemInfo as FieldInfo).FieldType; - public CacheField(FieldInfo fieldInfo, object declaringInstance) : base(fieldInfo, declaringInstance) + public CacheField(FieldInfo fieldInfo, object declaringInstance, GameObject parent) : base(fieldInfo, declaringInstance, parent) { CreateIValue(null, fieldInfo.FieldType); } diff --git a/src/Inspectors/Reflection/CacheObject/CacheMember.cs b/src/Inspectors/Reflection/CacheObject/CacheMember.cs index c698f69..f493c40 100644 --- a/src/Inspectors/Reflection/CacheObject/CacheMember.cs +++ b/src/Inspectors/Reflection/CacheObject/CacheMember.cs @@ -43,11 +43,12 @@ namespace UnityExplorer.Inspectors.Reflection public string RichTextName => m_richTextName ?? GetRichTextName(); private string m_richTextName; - public CacheMember(MemberInfo memberInfo, object declaringInstance) + public CacheMember(MemberInfo memberInfo, object declaringInstance, GameObject parentContent) { MemInfo = memberInfo; DeclaringType = memberInfo.DeclaringType; DeclaringInstance = declaringInstance; + this.m_parentContent = parentContent; #if CPP if (DeclaringInstance != null) DeclaringInstance = DeclaringInstance.Il2CppCast(DeclaringType); diff --git a/src/Inspectors/Reflection/CacheObject/CacheMethod.cs b/src/Inspectors/Reflection/CacheObject/CacheMethod.cs index c832f8e..0b0fc92 100644 --- a/src/Inspectors/Reflection/CacheObject/CacheMethod.cs +++ b/src/Inspectors/Reflection/CacheObject/CacheMethod.cs @@ -26,7 +26,7 @@ namespace UnityExplorer.Inspectors.Reflection public string[] m_genericArgInput = new string[0]; - public CacheMethod(MethodInfo methodInfo, object declaringInstance) : base(methodInfo, declaringInstance) + public CacheMethod(MethodInfo methodInfo, object declaringInstance, GameObject parent) : base(methodInfo, declaringInstance, parent) { GenericArgs = methodInfo.GetGenericArguments(); diff --git a/src/Inspectors/Reflection/CacheObject/CacheProperty.cs b/src/Inspectors/Reflection/CacheObject/CacheProperty.cs index 93fdff4..c058d94 100644 --- a/src/Inspectors/Reflection/CacheObject/CacheProperty.cs +++ b/src/Inspectors/Reflection/CacheObject/CacheProperty.cs @@ -5,6 +5,7 @@ using System.Text; using System.Reflection; using UnityExplorer.UI; using UnityExplorer.Helpers; +using UnityEngine; namespace UnityExplorer.Inspectors.Reflection { @@ -14,7 +15,7 @@ namespace UnityExplorer.Inspectors.Reflection public override bool IsStatic => (MemInfo as PropertyInfo).GetAccessors(true)[0].IsStatic; - public CacheProperty(PropertyInfo propertyInfo, object declaringInstance) : base(propertyInfo, declaringInstance) + public CacheProperty(PropertyInfo propertyInfo, object declaringInstance, GameObject parent) : base(propertyInfo, declaringInstance, parent) { this.m_arguments = propertyInfo.GetIndexParameters(); this.m_argumentInput = new string[m_arguments.Length]; diff --git a/src/Inspectors/Reflection/ReflectionInspector.cs b/src/Inspectors/Reflection/ReflectionInspector.cs index 0bed49e..bfa9938 100644 --- a/src/Inspectors/Reflection/ReflectionInspector.cs +++ b/src/Inspectors/Reflection/ReflectionInspector.cs @@ -34,7 +34,7 @@ namespace UnityExplorer.Inspectors } // Blacklists - private static readonly HashSet s_typeAndMemberBlacklist = new HashSet + private static readonly HashSet bl_typeAndMember = new HashSet { #if CPP // these cause a crash in IL2CPP @@ -45,14 +45,14 @@ namespace UnityExplorer.Inspectors "Texture2D.SetPixelDataImpl", #endif }; - private static readonly HashSet s_methodStartsWithBlacklist = new HashSet + private static readonly HashSet bl_memberNameStartsWith = new HashSet { // these are redundant "get_", "set_", }; -#endregion + #endregion #region INSTANCE @@ -132,24 +132,99 @@ namespace UnityExplorer.Inspectors RefreshDisplay(); } - private void OnMemberFilterClicked(MemberTypes type, Button button) + internal bool IsBlacklisted(string sig) => bl_typeAndMember.Any(it => sig.Contains(it)); + internal bool IsBlacklisted(MethodInfo method) => bl_memberNameStartsWith.Any(it => method.Name.StartsWith(it)); + + internal string GetSig(MemberInfo member) => $"{member.DeclaringType.Name}.{member.Name}"; + internal string AppendArgsToSig(ParameterInfo[] args) { - if (m_lastActiveMemButton) + string ret = " ("; + foreach (var param in args) + ret += $"{param.ParameterType.Name} {param.Name}, "; + ret += ")"; + return ret; + } + + public void CacheMembers(Type type) + { + var list = new List(); + var cachedSigs = new HashSet(); + + var types = ReflectionHelpers.GetAllBaseTypes(type); + + var flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static; + if (this is InstanceInspector) + flags |= BindingFlags.Instance; + + foreach (var declaringType in types) { - var lastColors = m_lastActiveMemButton.colors; - lastColors.normalColor = new Color(0.2f, 0.2f, 0.2f); - m_lastActiveMemButton.colors = lastColors; + var target = Target; +#if CPP + target = target.Il2CppCast(declaringType); +#endif + IEnumerable infos = declaringType.GetMethods(flags); + infos = infos.Concat(declaringType.GetProperties(flags)); + infos = infos.Concat(declaringType.GetFields(flags)); + + foreach (var member in infos) + { + try + { + //ExplorerCore.Log($"Trying to cache member {sig}..."); + //ExplorerCore.Log(member.DeclaringType.FullName + "." + member.Name); + + var sig = GetSig(member); + + var mi = member as MethodInfo; + var pi = member as PropertyInfo; + var fi = member as FieldInfo; + + if (IsBlacklisted(sig) || mi != null && IsBlacklisted(mi)) + continue; + + var args = mi?.GetParameters() ?? pi?.GetIndexParameters(); + if (args != null) + { + if (!CacheMember.CanProcessArgs(args)) + continue; + + sig += AppendArgsToSig(args); + } + + if (cachedSigs.Contains(sig)) + continue; + + cachedSigs.Add(sig); + + if (mi != null) + list.Add(new CacheMethod(mi, target, m_scrollContent)); + else if (pi != null) + list.Add(new CacheProperty(pi, target, m_scrollContent)); + else + list.Add(new CacheField(fi, target, m_scrollContent)); + } + catch (Exception e) + { + ExplorerCore.LogWarning($"Exception caching member {member.DeclaringType.FullName}.{member.Name}!"); + ExplorerCore.Log(e.ToString()); + } + } } - m_memberFilter = type; - m_lastActiveMemButton = button; + var typeList = types.ToList(); - var colors = m_lastActiveMemButton.colors; - colors.normalColor = new Color(0.2f, 0.6f, 0.2f); - m_lastActiveMemButton.colors = colors; + var sorted = new List(); + sorted.AddRange(list.Where(it => it is CacheMethod) + .OrderBy(it => typeList.IndexOf(it.DeclaringType)) + .ThenBy(it => it.NameForFiltering)); + sorted.AddRange(list.Where(it => it is CacheProperty) + .OrderBy(it => typeList.IndexOf(it.DeclaringType)) + .ThenBy(it => it.NameForFiltering)); + sorted.AddRange(list.Where(it => it is CacheField) + .OrderBy(it => typeList.IndexOf(it.DeclaringType)) + .ThenBy(it => it.NameForFiltering)); - FilterMembers(null, true); - m_sliderScroller.m_slider.value = 1f; + m_allMembers = sorted.ToArray(); } public override void Update() @@ -178,6 +253,26 @@ namespace UnityExplorer.Inspectors } } + private void OnMemberFilterClicked(MemberTypes type, Button button) + { + if (m_lastActiveMemButton) + { + var lastColors = m_lastActiveMemButton.colors; + lastColors.normalColor = new Color(0.2f, 0.2f, 0.2f); + m_lastActiveMemButton.colors = lastColors; + } + + m_memberFilter = type; + m_lastActiveMemButton = button; + + var colors = m_lastActiveMemButton.colors; + colors.normalColor = new Color(0.2f, 0.6f, 0.2f); + m_lastActiveMemButton.colors = colors; + + FilterMembers(null, true); + m_sliderScroller.m_slider.value = 1f; + } + public void FilterMembers(string nameFilter = null, bool force = false) { int lastCount = m_membersFiltered.Count; @@ -200,7 +295,7 @@ namespace UnityExplorer.Inspectors } // name filter - if (!string.IsNullOrEmpty(nameFilter) && !mem.NameForFiltering.Contains(nameFilter)) + if (!string.IsNullOrEmpty(nameFilter) && !mem.NameForFiltering.Contains(nameFilter)) continue; m_membersFiltered.Add(mem); @@ -266,137 +361,6 @@ namespace UnityExplorer.Inspectors } } - public void CacheMembers(Type type) - { - var list = new List(); - var cachedSigs = new HashSet(); - - var types = ReflectionHelpers.GetAllBaseTypes(type); - - foreach (var declaringType in types) - { - MemberInfo[] infos; - try - { - infos = declaringType.GetMembers(ReflectionHelpers.CommonFlags); - } - catch - { - ExplorerCore.Log($"Exception getting members for type: {declaringType.FullName}"); - continue; - } - - var target = Target; -#if CPP - try - { - target = target.Il2CppCast(declaringType); - } - catch //(Exception e) - { - //ExplorerCore.LogWarning("Excepting casting " + target.GetType().FullName + " to " + declaringType.FullName); - } -#endif - - foreach (var member in infos) - { - try - { - // make sure member type is Field, Method or Property (4 / 8 / 16) - int m = (int)member.MemberType; - if (m < 4 || m > 16) - continue; - - //ExplorerCore.Log($"Trying to cache member {sig}..."); - //ExplorerCore.Log(member.DeclaringType.FullName + "." + member.Name); - - var pi = member as PropertyInfo; - var mi = member as MethodInfo; - - if (this is StaticInspector) - { - if (member is FieldInfo fi && !fi.IsStatic) continue; - else if (pi != null && !pi.GetAccessors(true)[0].IsStatic) continue; - else if (mi != null && !mi.IsStatic) continue; - } - - // check blacklisted members - var sig = $"{member.DeclaringType.Name}.{member.Name}"; - - if (s_typeAndMemberBlacklist.Any(it => sig.Contains(it))) - continue; - - if (s_methodStartsWithBlacklist.Any(it => member.Name.StartsWith(it))) - continue; - - if (mi != null) - AppendParams(mi.GetParameters()); - else if (pi != null) - AppendParams(pi.GetIndexParameters()); - - void AppendParams(ParameterInfo[] _args) - { - sig += " ("; - foreach (var param in _args) - sig += $"{param.ParameterType.Name} {param.Name}, "; - sig += ")"; - } - - if (cachedSigs.Contains(sig)) - continue; - - try - { - CacheMember cached; - if (mi != null && CacheMember.CanProcessArgs(mi.GetParameters())) - cached = new CacheMethod(mi, target); - else if (pi != null && CacheMember.CanProcessArgs(pi.GetIndexParameters())) - cached = new CacheProperty(pi, target); - else if (member is FieldInfo fi) - cached = new CacheField(fi, target); - else - continue; - - cached.m_parentContent = m_scrollContent; - - if (cached != null) - { - cachedSigs.Add(sig); - list.Add(cached); - } - } - catch (Exception e) - { - ExplorerCore.LogWarning($"Exception caching member {sig}!"); - ExplorerCore.Log(e.ToString()); - } - } - catch (Exception e) - { - ExplorerCore.LogWarning($"Exception caching member {member.DeclaringType.FullName}.{member.Name}!"); - ExplorerCore.Log(e.ToString()); - } - } - } - - var typeList = types.ToList(); - - var sorted = new List(); - sorted.AddRange(list.Where(it => it is CacheMethod) - .OrderBy(it => typeList.IndexOf(it.DeclaringType)) - .ThenBy(it => it.NameForFiltering)); - sorted.AddRange(list.Where(it => it is CacheProperty) - .OrderBy(it => typeList.IndexOf(it.DeclaringType)) - .ThenBy(it => it.NameForFiltering)); - sorted.AddRange(list.Where(it => it is CacheField) - .OrderBy(it => typeList.IndexOf(it.DeclaringType)) - .ThenBy(it => it.NameForFiltering)); - - m_allMembers = sorted.ToArray(); - - // ExplorerCore.Log("Cached " + m_allMembers.Length + " members"); - } - #region UI CONSTRUCTION internal void ConstructUI() @@ -578,7 +542,7 @@ namespace UnityExplorer.Inspectors internal void ConstructOptionsArea() { - var optionsRowObj = UIFactory.CreateHorizontalGroup(Content, new Color(1,1,1,0)); + var optionsRowObj = UIFactory.CreateHorizontalGroup(Content, new Color(1, 1, 1, 0)); var optionsLayout = optionsRowObj.AddComponent(); optionsLayout.minHeight = 25; var optionsGroup = optionsRowObj.GetComponent(); @@ -596,7 +560,7 @@ namespace UnityExplorer.Inspectors var updateText = updateButtonObj.GetComponentInChildren(); updateText.text = "Update Values"; var updateBtn = updateButtonObj.GetComponent