14
14
using UnityExplorer . UI . Widgets ;
15
15
using UniverseLib . Utility ;
16
16
using UniverseLib . UI . ObjectPool ;
17
+ using System . Collections ;
18
+ using HarmonyLib ;
17
19
18
20
namespace UnityExplorer . CacheObject
19
21
{
@@ -34,9 +36,12 @@ public abstract class CacheMember : CacheObjectBase
34
36
public virtual void SetInspectorOwner ( ReflectionInspector inspector , MemberInfo member )
35
37
{
36
38
this . Owner = inspector ;
37
- this . NameLabelText = this is CacheMethod
38
- ? SignatureHighlighter . HighlightMethod ( member as MethodInfo )
39
- : SignatureHighlighter . Parse ( member . DeclaringType , false , member ) ;
39
+ this . NameLabelText = this switch
40
+ {
41
+ CacheMethod => SignatureHighlighter . HighlightMethod ( member as MethodInfo ) ,
42
+ CacheConstructor => SignatureHighlighter . HighlightConstructor ( member as ConstructorInfo ) ,
43
+ _ => SignatureHighlighter . Parse ( member . DeclaringType , false , member ) ,
44
+ } ;
40
45
41
46
this . NameForFiltering = SignatureHighlighter . RemoveHighlighting ( NameLabelText ) ;
42
47
this . NameLabelTextRaw = NameForFiltering ;
@@ -167,56 +172,61 @@ public void OnEvaluateClicked()
167
172
168
173
#region Cache Member Util
169
174
170
- public static List < CacheMember > GetCacheMembers ( object inspectorTarget , Type _type , ReflectionInspector _inspector )
175
+ public static List < CacheMember > GetCacheMembers ( object inspectorTarget , Type type , ReflectionInspector inspector )
171
176
{
172
- var list = new List < CacheMember > ( ) ;
173
- var cachedSigs = new HashSet < string > ( ) ;
177
+ //var list = new List<CacheMember>();
178
+ HashSet < string > cachedSigs = new ( ) ;
179
+ List < CacheMember > props = new ( ) ;
180
+ List < CacheMember > fields = new ( ) ;
181
+ List < CacheMember > ctors = new ( ) ;
182
+ List < CacheMember > methods = new ( ) ;
174
183
175
- var types = ReflectionUtility . GetAllBaseTypes ( _type ) ;
184
+ var types = ReflectionUtility . GetAllBaseTypes ( type ) ;
176
185
177
186
var flags = BindingFlags . NonPublic | BindingFlags . Public | BindingFlags . Static ;
178
- if ( ! _inspector . StaticOnly )
187
+ if ( ! inspector . StaticOnly )
179
188
flags |= BindingFlags . Instance ;
180
189
181
- var infos = new List < MemberInfo > ( ) ;
190
+ // Get non-static constructors of the main type.
191
+ // There's no reason to get the static cctor, it will be invoked when we inspect the class.
192
+ // Also no point getting ctors on inherited types.
193
+ foreach ( var ctor in type . GetConstructors ( BindingFlags . Public | BindingFlags . NonPublic | BindingFlags . Instance ) )
194
+ TryCacheMember ( ctor , ctors , cachedSigs , type , inspector ) ;
182
195
183
196
foreach ( var declaringType in types )
184
197
{
185
198
var target = inspectorTarget ;
186
- if ( ! _inspector . StaticOnly )
199
+ if ( ! inspector . StaticOnly )
187
200
target = target . TryCast ( declaringType ) ;
188
201
189
- infos . Clear ( ) ;
190
- infos . AddRange ( declaringType . GetProperties ( flags ) ) ;
191
- infos . AddRange ( declaringType . GetFields ( flags ) ) ;
192
- infos . AddRange ( declaringType . GetMethods ( flags ) ) ;
202
+ foreach ( var prop in declaringType . GetProperties ( flags ) )
203
+ if ( prop . DeclaringType == declaringType )
204
+ TryCacheMember ( prop , props , cachedSigs , declaringType , inspector ) ;
193
205
194
- foreach ( var member in infos )
195
- {
196
- if ( member . DeclaringType != declaringType )
197
- continue ;
198
- TryCacheMember ( member , list , cachedSigs , declaringType , _inspector ) ;
199
- }
200
- }
206
+ foreach ( var field in declaringType . GetFields ( flags ) )
207
+ if ( field . DeclaringType == declaringType )
208
+ TryCacheMember ( field , fields , cachedSigs , declaringType , inspector ) ;
201
209
202
- var typeList = types . ToList ( ) ;
210
+ foreach ( var method in declaringType . GetMethods ( flags ) )
211
+ if ( method . DeclaringType == declaringType )
212
+ TryCacheMember ( method , methods , cachedSigs , declaringType , inspector ) ;
203
213
204
- var sorted = new List < CacheMember > ( ) ;
205
- sorted . AddRange ( list . Where ( it => it is CacheProperty )
206
- . OrderBy ( it => typeList . IndexOf ( it . DeclaringType ) )
207
- . ThenBy ( it => it . NameForFiltering ) ) ;
208
- sorted . AddRange ( list . Where ( it => it is CacheField )
209
- . OrderBy ( it => typeList . IndexOf ( it . DeclaringType ) )
210
- . ThenBy ( it => it . NameForFiltering ) ) ;
211
- sorted . AddRange ( list . Where ( it => it is CacheMethod )
212
- . OrderBy ( it => typeList . IndexOf ( it . DeclaringType ) )
213
- . ThenBy ( it => it . NameForFiltering ) ) ;
214
+ }
214
215
216
+ var sorted = new List < CacheMember > ( ) ;
217
+ sorted . AddRange ( props . OrderBy ( it => Array . IndexOf ( types , it . DeclaringType ) )
218
+ . ThenBy ( it => it . NameForFiltering ) ) ;
219
+ sorted . AddRange ( fields . OrderBy ( it => Array . IndexOf ( types , it . DeclaringType ) )
220
+ . ThenBy ( it => it . NameForFiltering ) ) ;
221
+ sorted . AddRange ( ctors . OrderBy ( it => Array . IndexOf ( types , it . DeclaringType ) )
222
+ . ThenBy ( it => it . NameForFiltering ) ) ;
223
+ sorted . AddRange ( methods . OrderBy ( it => Array . IndexOf ( types , it . DeclaringType ) )
224
+ . ThenBy ( it => it . NameForFiltering ) ) ;
215
225
return sorted ;
216
226
}
217
227
218
- private static void TryCacheMember ( MemberInfo member , List < CacheMember > list , HashSet < string > cachedSigs ,
219
- Type declaringType , ReflectionInspector _inspector , bool ignorePropertyMethodInfos = true )
228
+ private static void TryCacheMember ( MemberInfo member , IList list , HashSet < string > cachedSigs ,
229
+ Type declaringType , ReflectionInspector inspector , bool ignorePropertyMethodInfos = true )
220
230
{
221
231
try
222
232
{
@@ -231,22 +241,29 @@ private static void TryCacheMember(MemberInfo member, List<CacheMember> list, Ha
231
241
Type returnType ;
232
242
switch ( member . MemberType )
233
243
{
244
+ case MemberTypes . Constructor :
245
+ {
246
+ var ci = member as ConstructorInfo ;
247
+ sig += GetArgumentString ( ci . GetParameters ( ) ) ;
248
+ if ( cachedSigs . Contains ( sig ) )
249
+ return ;
250
+ cached = new CacheConstructor ( ci ) ;
251
+ returnType = ci . DeclaringType ;
252
+ }
253
+ break ;
254
+
234
255
case MemberTypes . Method :
235
256
{
236
257
var mi = member as MethodInfo ;
237
258
if ( ignorePropertyMethodInfos
238
259
&& ( mi . Name . StartsWith ( "get_" ) || mi . Name . StartsWith ( "set_" ) ) )
239
260
return ;
240
261
241
- //var args = mi.GetParameters();
242
- //if (!CanParseArgs(args))
243
- // return;
244
-
245
262
sig += GetArgumentString ( mi . GetParameters ( ) ) ;
246
263
if ( cachedSigs . Contains ( sig ) )
247
264
return ;
248
265
249
- cached = new CacheMethod ( ) { MethodInfo = mi } ;
266
+ cached = new CacheMethod ( mi ) ;
250
267
returnType = mi . ReturnType ;
251
268
break ;
252
269
}
@@ -255,32 +272,28 @@ private static void TryCacheMember(MemberInfo member, List<CacheMember> list, Ha
255
272
{
256
273
var pi = member as PropertyInfo ;
257
274
258
- //var args = pi.GetIndexParameters();
259
- //if (!CanParseArgs(args))
260
- // return;
261
-
262
275
if ( ! pi . CanRead && pi . CanWrite )
263
276
{
264
277
// write-only property, cache the set method instead.
265
278
var setMethod = pi . GetSetMethod ( true ) ;
266
279
if ( setMethod != null )
267
- TryCacheMember ( setMethod , list , cachedSigs , declaringType , _inspector , false ) ;
280
+ TryCacheMember ( setMethod , list , cachedSigs , declaringType , inspector , false ) ;
268
281
return ;
269
282
}
270
283
271
284
sig += GetArgumentString ( pi . GetIndexParameters ( ) ) ;
272
285
if ( cachedSigs . Contains ( sig ) )
273
286
return ;
274
287
275
- cached = new CacheProperty ( ) { PropertyInfo = pi } ;
288
+ cached = new CacheProperty ( pi ) ;
276
289
returnType = pi . PropertyType ;
277
290
break ;
278
291
}
279
292
280
293
case MemberTypes . Field :
281
294
{
282
295
var fi = member as FieldInfo ;
283
- cached = new CacheField ( ) { FieldInfo = fi } ;
296
+ cached = new CacheField ( fi ) ;
284
297
returnType = fi . FieldType ;
285
298
break ;
286
299
}
@@ -291,7 +304,7 @@ private static void TryCacheMember(MemberInfo member, List<CacheMember> list, Ha
291
304
cachedSigs . Add ( sig ) ;
292
305
293
306
cached . SetFallbackType ( returnType ) ;
294
- cached . SetInspectorOwner ( _inspector , member ) ;
307
+ cached . SetInspectorOwner ( inspector , member ) ;
295
308
296
309
list . Add ( cached ) ;
297
310
}
0 commit comments