//
-// (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
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;
}
}
}