1313 /// </summary>
1414 internal static class TypeCollector
1515 {
16+ private static readonly HashSet < string > _systemAssemblyNames = new HashSet < string > { "mscorlib" , "System" , "System.Core" } ;
17+
1618 /// <summary>
1719 /// Collects assemblies the type has access to: the type's native assembly and all its referenced assemblies.
1820 /// </summary>
@@ -25,92 +27,38 @@ internal static class TypeCollector
2527 /// Additional assemblies may be added using <see cref="TypeOptionsAttribute.IncludeAdditionalAssemblies"/>,
2628 /// hence the List return type.
2729 /// </remarks>
28- public static List < Assembly > GetAssembliesTypeHasAccessTo ( Type type )
29- {
30- Assembly typeAssembly ;
31-
32- try
33- {
34- typeAssembly = type == null ? Assembly . Load ( "Assembly-CSharp" ) : type . Assembly ;
35- }
36- catch ( FileNotFoundException )
37- {
38- return GetAllAssemblies ( ) ;
39- }
40-
41- var referencedAssemblies = typeAssembly . GetReferencedAssemblies ( ) ;
42- var assemblies = new List < Assembly > ( referencedAssemblies . Length + 1 ) ;
43-
44- for ( int i = 0 ; i < referencedAssemblies . Length ; i ++ )
45- {
46- assemblies [ i ] = Assembly . Load ( referencedAssemblies [ i ] ) ;
47- }
48-
49- assemblies [ referencedAssemblies . Length ] = typeAssembly ;
50- return assemblies ;
51- }
52-
53- public static List < Assembly > GetAssembliesTypeHasAccessTo ( Type type , out bool containsMscorlib )
30+ public static IEnumerable < Assembly > GetAssembliesTypeHasAccessTo ( Type type , out bool containsSystemAssembly )
5431 {
5532 if ( type == null )
5633 {
57- containsMscorlib = true ;
34+ containsSystemAssembly = true ;
5835 return GetAllAssemblies ( ) ;
5936 }
6037
61- containsMscorlib = false ;
38+ containsSystemAssembly = false ;
6239 Assembly typeAssembly = type . Assembly ;
6340
6441 var referencedAssemblies = typeAssembly . GetReferencedAssemblies ( ) ;
65- var assemblies = new List < Assembly > ( referencedAssemblies . Length + 1 ) ;
66-
67- for ( int i = 0 ; i < referencedAssemblies . Length ; i ++ )
68- {
69- var assemblyName = referencedAssemblies [ i ] ;
70-
71- if ( ! containsMscorlib && assemblyName . Name == "mscorlib" )
72- {
73- containsMscorlib = true ;
74- }
75-
76- assemblies . Add ( Assembly . Load ( assemblyName ) ) ;
77- }
78-
79- if ( ! containsMscorlib && typeAssembly . FullName . Contains ( "mscorlib" ) )
80- {
81- containsMscorlib = true ;
82- }
8342
84- assemblies . Add ( typeAssembly ) ;
85-
86- return assemblies ;
43+ containsSystemAssembly = IsSystemAssembly ( typeAssembly ) || referencedAssemblies . Any ( IsSystemAssembly ) ;
44+ return referencedAssemblies . Select ( Assembly . Load ) . Append ( typeAssembly ) ;
8745 }
8846
89- private static List < Assembly > GetAllAssemblies ( )
47+ private static bool IsSystemAssembly ( Assembly assembly )
9048 {
91- return new List < Assembly > ( AppDomain . CurrentDomain . GetAssemblies ( ) ) ;
49+ return IsSystemAssembly ( assembly . GetName ( ) ) ;
9250 }
93-
94- public static List < Type > GetFilteredTypesFromAssemblies (
95- List < Assembly > assemblies ,
96- TypeOptionsAttribute filter )
51+
52+ private static bool IsSystemAssembly ( AssemblyName assemblyName )
9753 {
98- int assembliesCount = assemblies . Count ;
99-
100- var types = new List < Type > ( assembliesCount * 20 ) ;
101-
102- for ( int i = 0 ; i < assembliesCount ; i ++ )
103- {
104- var filteredTypes = GetFilteredTypesFromAssembly ( assemblies [ i ] , filter ) ;
105- int filteredTypesCount = filteredTypes . Count ;
54+ return _systemAssemblyNames . Contains ( assemblyName . Name ) ;
55+ }
10656
107- for ( int j = 0 ; j < filteredTypesCount ; j ++ )
108- {
109- types . Add ( filteredTypes [ j ] ) ;
110- }
111- }
57+ public static IEnumerable < Assembly > GetAllAssemblies ( ) => AppDomain . CurrentDomain . GetAssemblies ( ) ;
11258
113- return types ;
59+ public static IEnumerable < Type > GetFilteredTypesFromAssemblies ( IEnumerable < Assembly > assemblies , TypeOptionsAttribute filter )
60+ {
61+ return assemblies . SelectMany ( assembly => GetFilteredTypesFromAssembly ( assembly , filter ) ) ;
11462 }
11563
11664 public static Assembly TryLoadAssembly ( string assemblyName )
@@ -140,66 +88,37 @@ public static Assembly TryLoadAssembly(string assemblyName)
14088 return assembly ;
14189 }
14290
143- private static List < Type > GetFilteredTypesFromAssembly ( Assembly assembly , TypeOptionsAttribute filter )
91+ private static IEnumerable < Type > GetFilteredTypesFromAssembly ( Assembly assembly , TypeOptionsAttribute filter )
14492 {
145- List < Type > assemblyTypes ;
146-
147- assemblyTypes = filter . AllowInternal
148- ? GetAllTypesFromAssembly ( assembly )
149- : GetVisibleTypesFromAssembly ( assembly ) ;
150-
151- var filteredTypes = new List < Type > ( ) ;
152- int visibleTypesCount = assemblyTypes . Count ;
93+ var assemblyTypes = GetAllTypesFromAssembly ( assembly ) ;
15394
154- for ( int i = 0 ; i < visibleTypesCount ; i ++ )
155- {
156- Type type = assemblyTypes [ i ] ;
157- if ( FilterConstraintIsSatisfied ( filter , type ) )
158- {
159- filteredTypes . Add ( type ) ;
160- }
161- }
95+ // Don't allow internal types of mscorlib even if the AllowInternal property is set to true because it leads
96+ // to a lot of garbage in the dropdown while it's almost impossible users will need a System internal class.
97+ bool allowInternal = filter . AllowInternal && ! IsSystemAssembly ( assembly ) ;
16298
163- return filteredTypes ;
99+ return assemblyTypes . Where ( type => ( allowInternal || type . IsVisible ) && FilterConstraintIsSatisfied ( filter , type ) ) ;
164100 }
165101
166- private static List < Type > GetVisibleTypesFromAssembly ( Assembly assembly )
102+ private static IEnumerable < Type > GetAllTypesFromAssembly ( Assembly assembly )
167103 {
168104 try
169105 {
170- var assemblyTypes = assembly . GetTypes ( ) ;
171- var visibleTypes = new List < Type > ( assemblyTypes . Length ) ;
172-
173- foreach ( Type type in assemblyTypes )
174- {
175- if ( type . IsVisible )
176- visibleTypes . Add ( type ) ;
177- }
178-
179- return visibleTypes ;
180- }
181- catch ( ReflectionTypeLoadException e )
182- {
183- Debug . LogError ( $ "Types could not be extracted from assembly { assembly } : { e . Message } ") ;
184- return new List < Type > ( 0 ) ;
185- }
186- }
187-
188- private static List < Type > GetAllTypesFromAssembly ( Assembly assembly )
189- {
190- try
191- {
192- return assembly . GetTypes ( ) . ToList ( ) ;
106+ return assembly . GetTypes ( ) ;
193107 }
194108 catch ( ReflectionTypeLoadException e )
195109 {
196110 Debug . LogError ( $ "Types could not be extracted from assembly { assembly } : { e . Message } ") ;
197- return new List < Type > ( 0 ) ;
111+ return Enumerable . Empty < Type > ( ) ;
198112 }
199113 }
200114
201115 private static bool FilterConstraintIsSatisfied ( TypeOptionsAttribute filter , Type type )
202116 {
117+ string typeFullName = type . FullName ;
118+
119+ if ( typeFullName == null || typeFullName . StartsWith ( "<" ) || type . Name . StartsWith ( "<" ) )
120+ return false ;
121+
203122 return filter == null || filter . MatchesRequirements ( type ) ;
204123 }
205124 }
0 commit comments