1+ using System ;
2+ using System . Collections . Generic ;
3+ using System . Linq ;
4+ using System . Reflection ;
5+ using Mono . Cecil ;
6+ using Mono . Cecil . Cil ;
7+ using NetArchTest . Dependencies . DataStructures ;
8+
9+ namespace NetArchTest . Assemblies
10+ {
11+ internal static class DataLoader
12+ {
13+ private static readonly List < string > exclusionList = new List < string >
14+ {
15+ "System" ,
16+ "Microsoft" ,
17+ "netstandard" ,
18+ "NuGet" ,
19+ "Newtonsoft" ,
20+ "Xunit" ,
21+ "Internal.Microsoft" ,
22+ "Mono.Cecil" ,
23+ "NetArchTest.Assemblies" ,
24+ "NetArchTest.Dependencies" ,
25+ "NetArchTest.Functions" ,
26+ "NetArchTest.Policies" ,
27+ "NetArchTest.RuleEngine" ,
28+ "NetArchTest.Rules" ,
29+ "NetArchTest.Slices" ,
30+ } ;
31+ private static readonly NamespaceTree exclusionTree = new NamespaceTree ( exclusionList ) ;
32+
33+
34+ public static LoadedData LoadFromCurrentDomain ( )
35+ {
36+ var assemblies = AppDomain . CurrentDomain . GetAssemblies ( ) ;
37+ var selectedAssemblies = assemblies . Where ( assembly => assembly . IsDynamic == false ) ;
38+
39+ return LoadFromAssemblies ( selectedAssemblies ) ;
40+ }
41+ public static LoadedData LoadFromAssemblies ( IEnumerable < Assembly > assemblies , IEnumerable < string > searchDirectories = null )
42+ {
43+ var files = assemblies . Select ( x => x . Location ) ;
44+
45+ return LoadFromFiles ( files , searchDirectories ) ;
46+ }
47+ public static LoadedData LoadFromFiles ( IEnumerable < string > fileNames , IEnumerable < string > searchDirectories = null )
48+ {
49+ var assemblies = Load ( fileNames , searchDirectories ) ;
50+
51+ return new LoadedData ( assemblies ) ;
52+ }
53+
54+
55+ private static IEnumerable < AssemblySpec > Load ( IEnumerable < string > fileNames , IEnumerable < string > searchDirectories = null )
56+ {
57+ var readerParameters = CreateReaderParameters ( searchDirectories ) ;
58+
59+ foreach ( var fileName in fileNames )
60+ {
61+ var assemblyDefinition = ReadAssemblyDefinition ( fileName , readerParameters ) ;
62+ if ( assemblyDefinition == null ) continue ;
63+
64+ if ( exclusionTree . GetAllMatchingNames ( assemblyDefinition . FullName ) . Any ( ) == true ) continue ;
65+
66+ var typeDefinitions = ReadTypes ( assemblyDefinition ) ;
67+
68+ yield return new AssemblySpec ( assemblyDefinition , typeDefinitions ) ;
69+ }
70+ }
71+ private static ReaderParameters CreateReaderParameters ( IEnumerable < string > searchDirectories , bool readSymbols = true )
72+ {
73+ DefaultAssemblyResolver assemblyResolver = null ;
74+ if ( searchDirectories ? . Any ( ) == true )
75+ {
76+ assemblyResolver = new DefaultAssemblyResolver ( ) ;
77+ foreach ( var searchDirectory in searchDirectories )
78+ {
79+ assemblyResolver . AddSearchDirectory ( searchDirectory ) ;
80+ }
81+ }
82+
83+ return new ReaderParameters { AssemblyResolver = assemblyResolver , ReadSymbols = readSymbols , SymbolReaderProvider = new DefaultSymbolReaderProvider ( false ) } ;
84+ }
85+ private static AssemblyDefinition ReadAssemblyDefinition ( string path , ReaderParameters readerParameters = null )
86+ {
87+ try
88+ {
89+ return AssemblyDefinition . ReadAssembly ( path , readerParameters ) ;
90+ }
91+ catch ( BadImageFormatException )
92+ {
93+ return null ;
94+ }
95+ }
96+
97+
98+ private static IEnumerable < TypeDefinition > ReadTypes ( AssemblyDefinition assemblyDefinition )
99+ {
100+ foreach ( var module in assemblyDefinition . Modules )
101+ {
102+ foreach ( var type in module . GetTypes ( ) )
103+ {
104+ if ( type . FullName . Equals ( "<Module>" ) ) continue ;
105+ if ( type . FullName . StartsWith ( "<>" ) ) continue ;
106+ if ( type . FullName . StartsWith ( "<PrivateImplementationDetails>" ) ) continue ;
107+
108+ if ( exclusionTree . GetAllMatchingNames ( type . FullName ) . Any ( ) ) continue ;
109+ if ( type . IsCompilerGenerated ( ) ) continue ;
110+
111+ yield return type ;
112+ }
113+ }
114+ }
115+ }
116+
117+
118+ internal sealed class LoadedData
119+ {
120+ public IReadOnlyList < AssemblySpec > Assemblies { get ; }
121+
122+
123+ public LoadedData ( IEnumerable < AssemblySpec > assemblies )
124+ {
125+ Assemblies = assemblies . ToArray ( ) ;
126+ }
127+
128+
129+ public IEnumerable < TypeSpec > GetTypes ( )
130+ {
131+ foreach ( var assembly in Assemblies )
132+ {
133+ foreach ( var type in assembly . GetTypes ( ) )
134+ {
135+ yield return type ;
136+ }
137+ }
138+ }
139+ }
140+ }
0 commit comments