[sgen] Fix logging of major heap size with concurrent sweep
[mono.git] / mcs / tools / corcompare / AssemblyResolver.cs
index 3996fefd2d82a356d620a3c6c6e732ca53f84346..56000ca67775dca2b5f4439bc2fd5c3831da2458 100644 (file)
@@ -1,6 +1,10 @@
 //
-// (C) 2003 - 2008 Novell, Inc. (http://www.novell.com)
-// (C) 2007 Mainsoft, Inc. (http://www.mainsoft.com)
+// AssemblyResolver.cs
+//
+// Author:
+//   Jb Evain (jbevain@novell.com)
+//
+// (C) 2007 Novell, Inc.
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -28,153 +32,22 @@ using System.IO;
 
 using Mono.Cecil;
 
-namespace Mono.Util.CorCompare.Cecil {
+namespace GuiCompare {
 
-       public class AssemblyResolver : IAssemblyResolver {
+       public class AssemblyResolver : DefaultAssemblyResolver {
 
-               DefaultAssemblyResolver resolver = new DefaultAssemblyResolver ();
-
-               public AssemblyResolver ()
+               public AssemblyDefinition ResolveFile (string file)
                {
-               }
-
-               public AssemblyDefinition Resolve (string fullName)
-               {
-                       if (File.Exists (fullName))
-                               return ProcessFile (fullName);
-
-                       return resolver.Resolve (fullName);
+                       return ProcessFile (file);
                }
 
                AssemblyDefinition ProcessFile (string file)
                {
-                       resolver.AddSearchDirectory (Path.GetDirectoryName (file));
-                       return AssemblyFactory.GetAssembly (file);
-               }
-
-               public AssemblyDefinition Resolve (AssemblyNameReference name)
-               {
-                       return resolver.Resolve (name);
-               }
-
-               public TypeDefinition Resolve (TypeReference type)
-               {
-                       type = type.GetOriginalType ();
-
-                       if (type is TypeDefinition)
-                               return (TypeDefinition) type;
-
-                       AssemblyNameReference reference = type.Scope as AssemblyNameReference;
-                       if (reference != null) {
-                               AssemblyDefinition assembly = Resolve (reference);
-                               return assembly.MainModule.Types [type.FullName];
-                       }
-
-                       ModuleDefinition module = type.Scope as ModuleDefinition;
-                       if (module != null)
-                               return module.Types [type.FullName];
-
-                       throw new NotImplementedException ();
-               }
-
-               public FieldDefinition Resolve (FieldReference field)
-               {
-                       TypeDefinition type = Resolve (field.DeclaringType);
-                       return GetField (type.Fields, field);
-               }
-
-               static FieldDefinition GetField (ICollection collection, FieldReference reference)
-               {
-                       foreach (FieldDefinition field in collection) {
-                               if (field.Name != reference.Name)
-                                       continue;
-
-                               if (!AreSame (field.FieldType, reference.FieldType))
-                                       continue;
-
-                               return field;
-                       }
-
-                       return null;
-               }
-
-               public MethodDefinition Resolve (MethodReference method)
-               {
-                       TypeDefinition type = Resolve (method.DeclaringType);
-                       method = method.GetOriginalMethod ();
-                       if (method.Name == MethodDefinition.Cctor || method.Name == MethodDefinition.Ctor)
-                               return GetMethod (type.Constructors, method);
-                       else
-                               return GetMethod (type, method);
-               }
-
-               MethodDefinition GetMethod (TypeDefinition type, MethodReference reference)
-               {
-                       while (type != null) {
-                               MethodDefinition method = GetMethod (type.Methods, reference);
-                               if (method == null)
-                                       type = Resolve (type.BaseType);
-                               else
-                                       return method;
-                       }
-
-                       return null;
-               }
-
-               static MethodDefinition GetMethod (ICollection collection, MethodReference reference)
-               {
-                       foreach (MethodDefinition meth in collection) {
-                               if (meth.Name != reference.Name)
-                                       continue;
-
-                               if (!AreSame (meth.ReturnType.ReturnType, reference.ReturnType.ReturnType))
-                                       continue;
-
-                               if (!AreSame (meth.Parameters, reference.Parameters))
-                                       continue;
-
-                               return meth;
-                       }
-
-                       return null;
-               }
-
-               static bool AreSame (ParameterDefinitionCollection a, ParameterDefinitionCollection b)
-               {
-                       if (a.Count != b.Count)
-                               return false;
-
-                       if (a.Count == 0)
-                               return true;
-
-                       for (int i = 0; i < a.Count; i++)
-                               if (!AreSame (a [i].ParameterType, b [i].ParameterType))
-                                       return false;
-
-                       return true;
-               }
-
-               static bool AreSame (TypeReference a, TypeReference b)
-               {
-                       while (a is TypeSpecification || b is TypeSpecification) {
-                               if (a.GetType () != b.GetType ())
-                                       return false;
-
-                               a = ((TypeSpecification) a).ElementType;
-                               b = ((TypeSpecification) b).ElementType;
-                       }
-
-                       if (a is GenericParameter || b is GenericParameter) {
-                               if (a.GetType () != b.GetType ())
-                                       return false;
-
-                               GenericParameter pa = (GenericParameter) a;
-                               GenericParameter pb = (GenericParameter) b;
-
-                               return pa.Position == pb.Position;
-                       }
+                       AddSearchDirectory (Path.GetDirectoryName (file));
+                       var assembly = AssemblyDefinition.ReadAssembly (file, new ReaderParameters { AssemblyResolver = this });
+                       RegisterAssembly (assembly);
 
-                       return a.FullName == b.FullName;
+                       return assembly;
                }
        }
 }