Skip to content
This repository was archived by the owner on May 9, 2023. It is now read-only.

Commit 2a3df5d

Browse files
committed
cleanup CacheMembers a bit
1 parent 44ac431 commit 2a3df5d

File tree

6 files changed

+123
-156
lines changed

6 files changed

+123
-156
lines changed

src/Inspectors/Reflection/CacheObject/CacheField.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Reflection;
66
using UnityExplorer.UI;
77
using UnityExplorer.Helpers;
8+
using UnityEngine;
89

910
namespace UnityExplorer.Inspectors.Reflection
1011
{
@@ -14,7 +15,7 @@ public class CacheField : CacheMember
1415

1516
public override Type FallbackType => (MemInfo as FieldInfo).FieldType;
1617

17-
public CacheField(FieldInfo fieldInfo, object declaringInstance) : base(fieldInfo, declaringInstance)
18+
public CacheField(FieldInfo fieldInfo, object declaringInstance, GameObject parent) : base(fieldInfo, declaringInstance, parent)
1819
{
1920
CreateIValue(null, fieldInfo.FieldType);
2021
}

src/Inspectors/Reflection/CacheObject/CacheMember.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,12 @@ public abstract class CacheMember : CacheObjectBase
4343
public string RichTextName => m_richTextName ?? GetRichTextName();
4444
private string m_richTextName;
4545

46-
public CacheMember(MemberInfo memberInfo, object declaringInstance)
46+
public CacheMember(MemberInfo memberInfo, object declaringInstance, GameObject parentContent)
4747
{
4848
MemInfo = memberInfo;
4949
DeclaringType = memberInfo.DeclaringType;
5050
DeclaringInstance = declaringInstance;
51+
this.m_parentContent = parentContent;
5152
#if CPP
5253
if (DeclaringInstance != null)
5354
DeclaringInstance = DeclaringInstance.Il2CppCast(DeclaringType);

src/Inspectors/Reflection/CacheObject/CacheMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class CacheMethod : CacheMember
2626

2727
public string[] m_genericArgInput = new string[0];
2828

29-
public CacheMethod(MethodInfo methodInfo, object declaringInstance) : base(methodInfo, declaringInstance)
29+
public CacheMethod(MethodInfo methodInfo, object declaringInstance, GameObject parent) : base(methodInfo, declaringInstance, parent)
3030
{
3131
GenericArgs = methodInfo.GetGenericArguments();
3232

src/Inspectors/Reflection/CacheObject/CacheProperty.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Reflection;
66
using UnityExplorer.UI;
77
using UnityExplorer.Helpers;
8+
using UnityEngine;
89

910
namespace UnityExplorer.Inspectors.Reflection
1011
{
@@ -14,7 +15,7 @@ public class CacheProperty : CacheMember
1415

1516
public override bool IsStatic => (MemInfo as PropertyInfo).GetAccessors(true)[0].IsStatic;
1617

17-
public CacheProperty(PropertyInfo propertyInfo, object declaringInstance) : base(propertyInfo, declaringInstance)
18+
public CacheProperty(PropertyInfo propertyInfo, object declaringInstance, GameObject parent) : base(propertyInfo, declaringInstance, parent)
1819
{
1920
this.m_arguments = propertyInfo.GetIndexParameters();
2021
this.m_argumentInput = new string[m_arguments.Length];

src/Inspectors/Reflection/ReflectionInspector.cs

Lines changed: 113 additions & 149 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ private static void OnContainerResized()
3434
}
3535

3636
// Blacklists
37-
private static readonly HashSet<string> s_typeAndMemberBlacklist = new HashSet<string>
37+
private static readonly HashSet<string> bl_typeAndMember = new HashSet<string>
3838
{
3939
#if CPP
4040
// these cause a crash in IL2CPP
@@ -45,14 +45,14 @@ private static void OnContainerResized()
4545
"Texture2D.SetPixelDataImpl",
4646
#endif
4747
};
48-
private static readonly HashSet<string> s_methodStartsWithBlacklist = new HashSet<string>
48+
private static readonly HashSet<string> bl_memberNameStartsWith = new HashSet<string>
4949
{
5050
// these are redundant
5151
"get_",
5252
"set_",
5353
};
5454

55-
#endregion
55+
#endregion
5656

5757
#region INSTANCE
5858

@@ -132,24 +132,99 @@ private void OnPageTurned()
132132
RefreshDisplay();
133133
}
134134

135-
private void OnMemberFilterClicked(MemberTypes type, Button button)
135+
internal bool IsBlacklisted(string sig) => bl_typeAndMember.Any(it => sig.Contains(it));
136+
internal bool IsBlacklisted(MethodInfo method) => bl_memberNameStartsWith.Any(it => method.Name.StartsWith(it));
137+
138+
internal string GetSig(MemberInfo member) => $"{member.DeclaringType.Name}.{member.Name}";
139+
internal string AppendArgsToSig(ParameterInfo[] args)
136140
{
137-
if (m_lastActiveMemButton)
141+
string ret = " (";
142+
foreach (var param in args)
143+
ret += $"{param.ParameterType.Name} {param.Name}, ";
144+
ret += ")";
145+
return ret;
146+
}
147+
148+
public void CacheMembers(Type type)
149+
{
150+
var list = new List<CacheMember>();
151+
var cachedSigs = new HashSet<string>();
152+
153+
var types = ReflectionHelpers.GetAllBaseTypes(type);
154+
155+
var flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static;
156+
if (this is InstanceInspector)
157+
flags |= BindingFlags.Instance;
158+
159+
foreach (var declaringType in types)
138160
{
139-
var lastColors = m_lastActiveMemButton.colors;
140-
lastColors.normalColor = new Color(0.2f, 0.2f, 0.2f);
141-
m_lastActiveMemButton.colors = lastColors;
161+
var target = Target;
162+
#if CPP
163+
target = target.Il2CppCast(declaringType);
164+
#endif
165+
IEnumerable<MemberInfo> infos = declaringType.GetMethods(flags);
166+
infos = infos.Concat(declaringType.GetProperties(flags));
167+
infos = infos.Concat(declaringType.GetFields(flags));
168+
169+
foreach (var member in infos)
170+
{
171+
try
172+
{
173+
//ExplorerCore.Log($"Trying to cache member {sig}...");
174+
//ExplorerCore.Log(member.DeclaringType.FullName + "." + member.Name);
175+
176+
var sig = GetSig(member);
177+
178+
var mi = member as MethodInfo;
179+
var pi = member as PropertyInfo;
180+
var fi = member as FieldInfo;
181+
182+
if (IsBlacklisted(sig) || mi != null && IsBlacklisted(mi))
183+
continue;
184+
185+
var args = mi?.GetParameters() ?? pi?.GetIndexParameters();
186+
if (args != null)
187+
{
188+
if (!CacheMember.CanProcessArgs(args))
189+
continue;
190+
191+
sig += AppendArgsToSig(args);
192+
}
193+
194+
if (cachedSigs.Contains(sig))
195+
continue;
196+
197+
cachedSigs.Add(sig);
198+
199+
if (mi != null)
200+
list.Add(new CacheMethod(mi, target, m_scrollContent));
201+
else if (pi != null)
202+
list.Add(new CacheProperty(pi, target, m_scrollContent));
203+
else
204+
list.Add(new CacheField(fi, target, m_scrollContent));
205+
}
206+
catch (Exception e)
207+
{
208+
ExplorerCore.LogWarning($"Exception caching member {member.DeclaringType.FullName}.{member.Name}!");
209+
ExplorerCore.Log(e.ToString());
210+
}
211+
}
142212
}
143213

144-
m_memberFilter = type;
145-
m_lastActiveMemButton = button;
214+
var typeList = types.ToList();
146215

147-
var colors = m_lastActiveMemButton.colors;
148-
colors.normalColor = new Color(0.2f, 0.6f, 0.2f);
149-
m_lastActiveMemButton.colors = colors;
216+
var sorted = new List<CacheMember>();
217+
sorted.AddRange(list.Where(it => it is CacheMethod)
218+
.OrderBy(it => typeList.IndexOf(it.DeclaringType))
219+
.ThenBy(it => it.NameForFiltering));
220+
sorted.AddRange(list.Where(it => it is CacheProperty)
221+
.OrderBy(it => typeList.IndexOf(it.DeclaringType))
222+
.ThenBy(it => it.NameForFiltering));
223+
sorted.AddRange(list.Where(it => it is CacheField)
224+
.OrderBy(it => typeList.IndexOf(it.DeclaringType))
225+
.ThenBy(it => it.NameForFiltering));
150226

151-
FilterMembers(null, true);
152-
m_sliderScroller.m_slider.value = 1f;
227+
m_allMembers = sorted.ToArray();
153228
}
154229

155230
public override void Update()
@@ -178,6 +253,26 @@ public override void Update()
178253
}
179254
}
180255

256+
private void OnMemberFilterClicked(MemberTypes type, Button button)
257+
{
258+
if (m_lastActiveMemButton)
259+
{
260+
var lastColors = m_lastActiveMemButton.colors;
261+
lastColors.normalColor = new Color(0.2f, 0.2f, 0.2f);
262+
m_lastActiveMemButton.colors = lastColors;
263+
}
264+
265+
m_memberFilter = type;
266+
m_lastActiveMemButton = button;
267+
268+
var colors = m_lastActiveMemButton.colors;
269+
colors.normalColor = new Color(0.2f, 0.6f, 0.2f);
270+
m_lastActiveMemButton.colors = colors;
271+
272+
FilterMembers(null, true);
273+
m_sliderScroller.m_slider.value = 1f;
274+
}
275+
181276
public void FilterMembers(string nameFilter = null, bool force = false)
182277
{
183278
int lastCount = m_membersFiltered.Count;
@@ -200,7 +295,7 @@ public void FilterMembers(string nameFilter = null, bool force = false)
200295
}
201296

202297
// name filter
203-
if (!string.IsNullOrEmpty(nameFilter) && !mem.NameForFiltering.Contains(nameFilter))
298+
if (!string.IsNullOrEmpty(nameFilter) && !mem.NameForFiltering.Contains(nameFilter))
204299
continue;
205300

206301
m_membersFiltered.Add(mem);
@@ -266,137 +361,6 @@ internal void UpdateWidths()
266361
}
267362
}
268363

269-
public void CacheMembers(Type type)
270-
{
271-
var list = new List<CacheMember>();
272-
var cachedSigs = new HashSet<string>();
273-
274-
var types = ReflectionHelpers.GetAllBaseTypes(type);
275-
276-
foreach (var declaringType in types)
277-
{
278-
MemberInfo[] infos;
279-
try
280-
{
281-
infos = declaringType.GetMembers(ReflectionHelpers.CommonFlags);
282-
}
283-
catch
284-
{
285-
ExplorerCore.Log($"Exception getting members for type: {declaringType.FullName}");
286-
continue;
287-
}
288-
289-
var target = Target;
290-
#if CPP
291-
try
292-
{
293-
target = target.Il2CppCast(declaringType);
294-
}
295-
catch //(Exception e)
296-
{
297-
//ExplorerCore.LogWarning("Excepting casting " + target.GetType().FullName + " to " + declaringType.FullName);
298-
}
299-
#endif
300-
301-
foreach (var member in infos)
302-
{
303-
try
304-
{
305-
// make sure member type is Field, Method or Property (4 / 8 / 16)
306-
int m = (int)member.MemberType;
307-
if (m < 4 || m > 16)
308-
continue;
309-
310-
//ExplorerCore.Log($"Trying to cache member {sig}...");
311-
//ExplorerCore.Log(member.DeclaringType.FullName + "." + member.Name);
312-
313-
var pi = member as PropertyInfo;
314-
var mi = member as MethodInfo;
315-
316-
if (this is StaticInspector)
317-
{
318-
if (member is FieldInfo fi && !fi.IsStatic) continue;
319-
else if (pi != null && !pi.GetAccessors(true)[0].IsStatic) continue;
320-
else if (mi != null && !mi.IsStatic) continue;
321-
}
322-
323-
// check blacklisted members
324-
var sig = $"{member.DeclaringType.Name}.{member.Name}";
325-
326-
if (s_typeAndMemberBlacklist.Any(it => sig.Contains(it)))
327-
continue;
328-
329-
if (s_methodStartsWithBlacklist.Any(it => member.Name.StartsWith(it)))
330-
continue;
331-
332-
if (mi != null)
333-
AppendParams(mi.GetParameters());
334-
else if (pi != null)
335-
AppendParams(pi.GetIndexParameters());
336-
337-
void AppendParams(ParameterInfo[] _args)
338-
{
339-
sig += " (";
340-
foreach (var param in _args)
341-
sig += $"{param.ParameterType.Name} {param.Name}, ";
342-
sig += ")";
343-
}
344-
345-
if (cachedSigs.Contains(sig))
346-
continue;
347-
348-
try
349-
{
350-
CacheMember cached;
351-
if (mi != null && CacheMember.CanProcessArgs(mi.GetParameters()))
352-
cached = new CacheMethod(mi, target);
353-
else if (pi != null && CacheMember.CanProcessArgs(pi.GetIndexParameters()))
354-
cached = new CacheProperty(pi, target);
355-
else if (member is FieldInfo fi)
356-
cached = new CacheField(fi, target);
357-
else
358-
continue;
359-
360-
cached.m_parentContent = m_scrollContent;
361-
362-
if (cached != null)
363-
{
364-
cachedSigs.Add(sig);
365-
list.Add(cached);
366-
}
367-
}
368-
catch (Exception e)
369-
{
370-
ExplorerCore.LogWarning($"Exception caching member {sig}!");
371-
ExplorerCore.Log(e.ToString());
372-
}
373-
}
374-
catch (Exception e)
375-
{
376-
ExplorerCore.LogWarning($"Exception caching member {member.DeclaringType.FullName}.{member.Name}!");
377-
ExplorerCore.Log(e.ToString());
378-
}
379-
}
380-
}
381-
382-
var typeList = types.ToList();
383-
384-
var sorted = new List<CacheMember>();
385-
sorted.AddRange(list.Where(it => it is CacheMethod)
386-
.OrderBy(it => typeList.IndexOf(it.DeclaringType))
387-
.ThenBy(it => it.NameForFiltering));
388-
sorted.AddRange(list.Where(it => it is CacheProperty)
389-
.OrderBy(it => typeList.IndexOf(it.DeclaringType))
390-
.ThenBy(it => it.NameForFiltering));
391-
sorted.AddRange(list.Where(it => it is CacheField)
392-
.OrderBy(it => typeList.IndexOf(it.DeclaringType))
393-
.ThenBy(it => it.NameForFiltering));
394-
395-
m_allMembers = sorted.ToArray();
396-
397-
// ExplorerCore.Log("Cached " + m_allMembers.Length + " members");
398-
}
399-
400364
#region UI CONSTRUCTION
401365

402366
internal void ConstructUI()
@@ -578,7 +542,7 @@ private void AddFilterButton(GameObject parent, MemberTypes type, bool setEnable
578542

579543
internal void ConstructOptionsArea()
580544
{
581-
var optionsRowObj = UIFactory.CreateHorizontalGroup(Content, new Color(1,1,1,0));
545+
var optionsRowObj = UIFactory.CreateHorizontalGroup(Content, new Color(1, 1, 1, 0));
582546
var optionsLayout = optionsRowObj.AddComponent<LayoutElement>();
583547
optionsLayout.minHeight = 25;
584548
var optionsGroup = optionsRowObj.GetComponent<HorizontalLayoutGroup>();
@@ -596,7 +560,7 @@ internal void ConstructOptionsArea()
596560
var updateText = updateButtonObj.GetComponentInChildren<Text>();
597561
updateText.text = "Update Values";
598562
var updateBtn = updateButtonObj.GetComponent<Button>();
599-
updateBtn.onClick.AddListener(() =>
563+
updateBtn.onClick.AddListener(() =>
600564
{
601565
bool orig = m_autoUpdate;
602566
m_autoUpdate = true;

0 commit comments

Comments
 (0)