@@ -22,7 +22,7 @@ namespace ICSharpCode.CodeQuality.Engine
2222 /// </summary>
2323 public class AssemblyAnalyzer
2424 {
25- CecilLoader loader = new CecilLoader ( true ) { IncludeInternalMembers = true } ;
25+ Dictionary < object , object > unresolvedTypeSystemToCecilDict = new Dictionary < object , object > ( ) ;
2626 ICompilation compilation ;
2727 internal Dictionary < IAssembly , AssemblyNode > assemblyMappings ;
2828 internal Dictionary < string , NamespaceNode > namespaceMappings ;
@@ -73,7 +73,7 @@ void CreateEdges(NodeBase source)
7373
7474 public ReadOnlyCollection < AssemblyNode > Analyze ( )
7575 {
76- IUnresolvedAssembly [ ] loadedAssemblies = LoadAssemblies ( ) . ToArray ( ) ;
76+ var loadedAssemblies = LoadAssemblies ( ) ;
7777 compilation = new SimpleCompilation ( loadedAssemblies . First ( ) , loadedAssemblies . Skip ( 1 ) ) ;
7878
7979 assemblyMappings = new Dictionary < IAssembly , AssemblyNode > ( ) ;
@@ -92,7 +92,7 @@ public ReadOnlyCollection<AssemblyNode> Analyze()
9292 foreach ( var field in type . Fields ) {
9393 var node = new FieldNode ( field ) ;
9494 fieldMappings . Add ( field , node ) ;
95- var cecilObj = loader . GetCecilObject ( ( IUnresolvedField ) field . UnresolvedMember ) ;
95+ var cecilObj = GetCecilObject ( ( IUnresolvedField ) field . UnresolvedMember ) ;
9696 if ( cecilObj != null )
9797 cecilMappings [ cecilObj ] = field ;
9898 tn . AddChild ( node ) ;
@@ -101,7 +101,7 @@ public ReadOnlyCollection<AssemblyNode> Analyze()
101101 foreach ( var method in type . Methods ) {
102102 var node = new MethodNode ( method ) ;
103103 methodMappings . Add ( method , node ) ;
104- var cecilObj = loader . GetCecilObject ( ( IUnresolvedMethod ) method . UnresolvedMember ) ;
104+ var cecilObj = GetCecilObject ( ( IUnresolvedMethod ) method . UnresolvedMember ) ;
105105 if ( cecilObj != null )
106106 cecilMappings [ cecilObj ] = method ;
107107 tn . AddChild ( node ) ;
@@ -110,16 +110,16 @@ public ReadOnlyCollection<AssemblyNode> Analyze()
110110 foreach ( var property in type . Properties ) {
111111 var node = new PropertyNode ( property ) ;
112112 propertyMappings . Add ( property , node ) ;
113- var cecilPropObj = loader . GetCecilObject ( ( IUnresolvedProperty ) property . UnresolvedMember ) ;
113+ var cecilPropObj = GetCecilObject ( ( IUnresolvedProperty ) property . UnresolvedMember ) ;
114114 if ( cecilPropObj != null )
115115 cecilMappings [ cecilPropObj ] = property ;
116116 if ( property . CanGet ) {
117- var cecilMethodObj = loader . GetCecilObject ( ( IUnresolvedMethod ) property . Getter . UnresolvedMember ) ;
117+ var cecilMethodObj = GetCecilObject ( ( IUnresolvedMethod ) property . Getter . UnresolvedMember ) ;
118118 if ( cecilMethodObj != null )
119119 cecilMappings [ cecilMethodObj ] = property ;
120120 }
121121 if ( property . CanSet ) {
122- var cecilMethodObj = loader . GetCecilObject ( ( IUnresolvedMethod ) property . Setter . UnresolvedMember ) ;
122+ var cecilMethodObj = GetCecilObject ( ( IUnresolvedMethod ) property . Setter . UnresolvedMember ) ;
123123 if ( cecilMethodObj != null )
124124 cecilMappings [ cecilMethodObj ] = property ;
125125 }
@@ -129,29 +129,29 @@ public ReadOnlyCollection<AssemblyNode> Analyze()
129129 foreach ( var @event in type . Events ) {
130130 var node = new EventNode ( @event ) ;
131131 eventMappings . Add ( @event , node ) ;
132- var cecilObj = loader . GetCecilObject ( ( IUnresolvedEvent ) @event . UnresolvedMember ) ;
132+ var cecilObj = GetCecilObject ( ( IUnresolvedEvent ) @event . UnresolvedMember ) ;
133133 if ( cecilObj != null )
134134 cecilMappings [ cecilObj ] = @event ;
135135 if ( @event . CanAdd ) {
136- var cecilMethodObj = loader . GetCecilObject ( ( IUnresolvedMethod ) @event . AddAccessor . UnresolvedMember ) ;
136+ var cecilMethodObj = GetCecilObject ( ( IUnresolvedMethod ) @event . AddAccessor . UnresolvedMember ) ;
137137 if ( cecilMethodObj != null )
138138 cecilMappings [ cecilMethodObj ] = @event ;
139139 }
140140 if ( @event . CanInvoke ) {
141- var cecilMethodObj = loader . GetCecilObject ( ( IUnresolvedMethod ) @event . InvokeAccessor . UnresolvedMember ) ;
141+ var cecilMethodObj = GetCecilObject ( ( IUnresolvedMethod ) @event . InvokeAccessor . UnresolvedMember ) ;
142142 if ( cecilMethodObj != null )
143143 cecilMappings [ cecilMethodObj ] = @event ;
144144 }
145145 if ( @event . CanRemove ) {
146- var cecilMethodObj = loader . GetCecilObject ( ( IUnresolvedMethod ) @event . RemoveAccessor . UnresolvedMember ) ;
146+ var cecilMethodObj = GetCecilObject ( ( IUnresolvedMethod ) @event . RemoveAccessor . UnresolvedMember ) ;
147147 if ( cecilMethodObj != null )
148148 cecilMappings [ cecilMethodObj ] = @event ;
149149 }
150150 tn . AddChild ( node ) ;
151151 }
152152 }
153153
154- ILAnalyzer analyzer = new ILAnalyzer ( loadedAssemblies . Select ( asm => loader . GetCecilObject ( asm ) ) . ToArray ( ) , this ) ;
154+ ILAnalyzer analyzer = new ILAnalyzer ( loadedAssemblies . Select ( asm => GetCecilObject ( asm ) ) . ToArray ( ) , this ) ;
155155 int count = typeMappings . Count + methodMappings . Count + fieldMappings . Count + propertyMappings . Count ;
156156 int i = 0 ;
157157
@@ -164,7 +164,7 @@ public ReadOnlyCollection<AssemblyNode> Analyze()
164164
165165 foreach ( var element in methodMappings ) {
166166 ReportProgress ( ++ i / ( double ) count ) ;
167- var cecilObj = loader . GetCecilObject ( ( IUnresolvedMethod ) element . Key . UnresolvedMember ) ;
167+ var cecilObj = GetCecilObject ( ( IUnresolvedMethod ) element . Key . UnresolvedMember ) ;
168168 if ( cecilObj != null )
169169 analyzer . Analyze ( cecilObj . Body , element . Value ) ;
170170 var node = element . Value ;
@@ -194,12 +194,12 @@ public ReadOnlyCollection<AssemblyNode> Analyze()
194194 var node = element . Value ;
195195 var property = element . Key ;
196196 if ( property . CanGet ) {
197- var cecilObj = loader . GetCecilObject ( ( IUnresolvedMethod ) element . Key . Getter . UnresolvedMember ) ;
197+ var cecilObj = GetCecilObject ( ( IUnresolvedMethod ) element . Key . Getter . UnresolvedMember ) ;
198198 if ( cecilObj != null )
199199 analyzer . Analyze ( cecilObj . Body , node ) ;
200200 }
201201 if ( property . CanSet ) {
202- var cecilObj = loader . GetCecilObject ( ( IUnresolvedMethod ) element . Key . Setter . UnresolvedMember ) ;
202+ var cecilObj = GetCecilObject ( ( IUnresolvedMethod ) element . Key . Setter . UnresolvedMember ) ;
203203 if ( cecilObj != null )
204204 analyzer . Analyze ( cecilObj . Body , node ) ;
205205 }
@@ -213,17 +213,17 @@ public ReadOnlyCollection<AssemblyNode> Analyze()
213213 var node = element . Value ;
214214 var @event = element . Key ;
215215 if ( @event . CanAdd ) {
216- var cecilObj = loader . GetCecilObject ( ( IUnresolvedMethod ) @event . AddAccessor . UnresolvedMember ) ;
216+ var cecilObj = GetCecilObject ( ( IUnresolvedMethod ) @event . AddAccessor . UnresolvedMember ) ;
217217 if ( cecilObj != null )
218218 analyzer . Analyze ( cecilObj . Body , node ) ;
219219 }
220220 if ( @event . CanInvoke ) {
221- var cecilObj = loader . GetCecilObject ( ( IUnresolvedMethod ) @event . InvokeAccessor . UnresolvedMember ) ;
221+ var cecilObj = GetCecilObject ( ( IUnresolvedMethod ) @event . InvokeAccessor . UnresolvedMember ) ;
222222 if ( cecilObj != null )
223223 analyzer . Analyze ( cecilObj . Body , node ) ;
224224 }
225225 if ( @event . CanRemove ) {
226- var cecilObj = loader . GetCecilObject ( ( IUnresolvedMethod ) @event . RemoveAccessor . UnresolvedMember ) ;
226+ var cecilObj = GetCecilObject ( ( IUnresolvedMethod ) @event . RemoveAccessor . UnresolvedMember ) ;
227227 if ( cecilObj != null )
228228 analyzer . Analyze ( cecilObj . Body , node ) ;
229229 }
@@ -295,7 +295,7 @@ public override IType VisitTypeDefinition(ITypeDefinition type)
295295 }
296296 }
297297
298- IEnumerable < IUnresolvedAssembly > LoadAssemblies ( )
298+ IList < IUnresolvedAssembly > LoadAssemblies ( )
299299 {
300300 var resolver = new AssemblyResolver ( ) ;
301301 foreach ( var path in fileNames . Select ( f => Path . GetDirectoryName ( f ) ) . Distinct ( StringComparer . OrdinalIgnoreCase ) )
@@ -305,13 +305,54 @@ IEnumerable<IUnresolvedAssembly> LoadAssemblies()
305305 assemblies . Add ( resolver . LoadAssemblyFile ( file ) ) ;
306306 foreach ( var asm in assemblies . ToArray ( ) )
307307 assemblies . AddRange ( asm . Modules . SelectMany ( m => m . AssemblyReferences ) . Select ( r => resolver . TryResolve ( r ) ) . Where ( r => r != null ) ) ;
308- return assemblies . Distinct ( ) . Select ( asm => loader . LoadAssembly ( asm ) ) ;
308+ CecilLoader loader = new CecilLoader { IncludeInternalMembers = true } ;
309+ // Emulate the old CecilLoader.GetCecilObject() API:
310+ loader . OnEntityLoaded = delegate ( IUnresolvedEntity entity , MemberReference cecilObj ) {
311+ unresolvedTypeSystemToCecilDict [ entity ] = cecilObj ;
312+ } ;
313+ var loadedAssemblies = new List < IUnresolvedAssembly > ( ) ;
314+ foreach ( var asm in assemblies . Distinct ( ) ) {
315+ var loadedAssembly = loader . LoadAssembly ( asm ) ;
316+ loadedAssemblies . Add ( loadedAssembly ) ;
317+ unresolvedTypeSystemToCecilDict [ loadedAssembly ] = asm ;
318+ }
319+ return loadedAssemblies ;
320+ }
321+
322+ AssemblyDefinition GetCecilObject ( IUnresolvedAssembly assembly )
323+ {
324+ object cecilObj ;
325+ if ( unresolvedTypeSystemToCecilDict . TryGetValue ( assembly , out cecilObj ) ) {
326+ return cecilObj as AssemblyDefinition ;
327+ } else {
328+ return null ;
329+ }
330+ }
331+
332+ MemberReference GetCecilObject ( IUnresolvedEntity entity )
333+ {
334+ object cecilObj ;
335+ if ( unresolvedTypeSystemToCecilDict . TryGetValue ( entity , out cecilObj ) ) {
336+ return cecilObj as MemberReference ;
337+ } else {
338+ return null ;
339+ }
340+ }
341+
342+ MethodDefinition GetCecilObject ( IUnresolvedMethod method )
343+ {
344+ object cecilObj ;
345+ if ( unresolvedTypeSystemToCecilDict . TryGetValue ( method , out cecilObj ) ) {
346+ return cecilObj as MethodDefinition ;
347+ } else {
348+ return null ;
349+ }
309350 }
310351
311352 NamespaceNode GetOrCreateNamespace ( AssemblyNode assembly , string namespaceName )
312353 {
313354 NamespaceNode result ;
314- var asmDef = loader . GetCecilObject ( assembly . AssemblyInfo . UnresolvedAssembly ) ;
355+ var asmDef = GetCecilObject ( assembly . AssemblyInfo . UnresolvedAssembly ) ;
315356 if ( ! namespaceMappings . TryGetValue ( namespaceName + "," + asmDef . FullName , out result ) ) {
316357 result = new NamespaceNode ( namespaceName ) ;
317358 assembly . AddChild ( result ) ;
@@ -343,7 +384,7 @@ TypeNode ReadType(ITypeDefinition type)
343384 throw new Exception ( "TypeNode not found: " + type . DeclaringTypeDefinition . FullName ) ;
344385 } else
345386 ns . AddChild ( node ) ;
346- cecilMappings [ loader . GetCecilObject ( type . Parts . First ( ) ) ] = type ;
387+ cecilMappings [ GetCecilObject ( type . Parts . First ( ) ) ] = type ;
347388 typeMappings . Add ( type , node ) ;
348389 return node ;
349390 }
0 commit comments