@@ -17,7 +17,7 @@ internal static class DataLoader
1717 "netstandard" ,
1818 "NuGet" ,
1919 "Newtonsoft" ,
20- "Xunit " ,
20+ "xunit " ,
2121 "Internal.Microsoft" ,
2222 "Mono.Cecil" ,
2323 "NetArchTest.Assemblies" ,
@@ -38,36 +38,65 @@ public static LoadedData LoadFromCurrentDomain()
3838
3939 return LoadFromAssemblies ( selectedAssemblies ) ;
4040 }
41- public static LoadedData LoadFromAssemblies ( IEnumerable < Assembly > assemblies , IEnumerable < string > searchDirectories = null )
41+ public static LoadedData LoadFromAssemblies ( IEnumerable < Assembly > assemblies , IEnumerable < string > searchDirectories = null , bool loadReferencedAssemblies = false )
4242 {
4343 var files = assemblies . Select ( x => x . Location ) ;
4444
45- return LoadFromFiles ( files , searchDirectories ) ;
45+ return LoadFromFiles ( files , searchDirectories , loadReferencedAssemblies ) ;
4646 }
47- public static LoadedData LoadFromFiles ( IEnumerable < string > fileNames , IEnumerable < string > searchDirectories = null )
47+ public static LoadedData LoadFromFiles ( IEnumerable < string > fileNames , IEnumerable < string > searchDirectories = null , bool loadReferencedAssemblies = false )
4848 {
49- var assemblies = Load ( fileNames , searchDirectories ) ;
49+ var assemblies = Load ( fileNames , searchDirectories , loadReferencedAssemblies ) ;
5050
5151 return new LoadedData ( assemblies ) ;
5252 }
5353
5454
55- private static IEnumerable < AssemblySpec > Load ( IEnumerable < string > fileNames , IEnumerable < string > searchDirectories = null )
55+ private static IEnumerable < AssemblySpec > Load ( IEnumerable < string > fileNames , IEnumerable < string > searchDirectories , bool loadReferencedAssemblies )
5656 {
5757 var readerParameters = CreateReaderParameters ( searchDirectories ) ;
58+ var definitions = new Dictionary < string , AssemblySpec > ( ) ;
5859
5960 foreach ( var fileName in fileNames )
6061 {
6162 var assemblyDefinition = ReadAssemblyDefinition ( fileName , readerParameters ) ;
62- if ( assemblyDefinition == null ) continue ;
63+ ProcessAssemblyDefinition ( null , assemblyDefinition ) ;
64+ }
6365
64- if ( exclusionTree . GetAllMatchingNames ( assemblyDefinition . Name . Name ) . Any ( ) == true ) continue ;
66+ void ProcessAssemblyDefinition ( AssemblySpec parent , AssemblyDefinition assemblyDefinition )
67+ {
68+ if ( assemblyDefinition == null ) return ;
69+ if ( exclusionTree . GetAllMatchingNames ( assemblyDefinition . Name . Name ) . Any ( ) == true ) return ;
70+ if ( definitions . TryGetValue ( assemblyDefinition . FullName , out var existingSpec ) )
71+ {
72+ parent ? . AddRef ( existingSpec ) ;
73+ return ;
74+ }
6575
6676 var typeDefinitions = ReadTypes ( assemblyDefinition ) ;
77+ var spec = new AssemblySpec ( assemblyDefinition , typeDefinitions ) ;
78+
79+ definitions . Add ( assemblyDefinition . FullName , spec ) ;
80+ parent ? . AddRef ( spec ) ;
6781
68- yield return new AssemblySpec ( assemblyDefinition , typeDefinitions ) ;
82+ if ( loadReferencedAssemblies == false ) return ;
83+
84+ foreach ( var module in assemblyDefinition . Modules )
85+ {
86+ if ( module . HasAssemblyReferences )
87+ {
88+ foreach ( var reference in module . AssemblyReferences )
89+ {
90+ var refAssembly = module . AssemblyResolver . Resolve ( reference ) ;
91+ ProcessAssemblyDefinition ( spec , refAssembly ) ;
92+ }
93+ }
94+ }
6995 }
96+
97+ return definitions . Values ;
7098 }
99+
71100 private static ReaderParameters CreateReaderParameters ( IEnumerable < string > searchDirectories , bool readSymbols = true )
72101 {
73102 DefaultAssemblyResolver assemblyResolver = null ;
0 commit comments