diff --git a/ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs b/ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs index 8180985f1..63b71f6bb 100644 --- a/ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs +++ b/ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs @@ -46,7 +46,7 @@ namespace ICSharpCode.Decompiler.TypeSystem IUnresolvedAssembly mainAssembly = cecilLoader.LoadModule(moduleDefinition); var referencedAssemblies = new List(); var assemblyReferenceQueue = new Queue(moduleDefinition.AssemblyReferences); - var processedAssemblyReferences = new HashSet(AssemblyNameReferenceComparer.Instance); + var processedAssemblyReferences = new HashSet(KeyComparer.Create((AssemblyNameReference reference) => reference.FullName)); while (assemblyReferenceQueue.Count > 0) { var asmRef = assemblyReferenceQueue.Dequeue(); if (!processedAssemblyReferences.Add(asmRef)) @@ -68,25 +68,6 @@ namespace ICSharpCode.Decompiler.TypeSystem context = new SimpleTypeResolveContext(compilation.MainAssembly); } - class AssemblyNameReferenceComparer : IEqualityComparer - { - public static readonly AssemblyNameReferenceComparer Instance = new AssemblyNameReferenceComparer(); - - public bool Equals(AssemblyNameReference x, AssemblyNameReference y) - { - if (x == y) - return true; - if (x == null || y == null) - return false; - return x.FullName.Equals(y.FullName); - } - - public int GetHashCode(AssemblyNameReference obj) - { - return obj.FullName.GetHashCode(); - } - } - public ICompilation Compilation { get { return compilation; } } diff --git a/ICSharpCode.Decompiler/Util/KeyComparer.cs b/ICSharpCode.Decompiler/Util/KeyComparer.cs new file mode 100644 index 000000000..3191c1ac1 --- /dev/null +++ b/ICSharpCode.Decompiler/Util/KeyComparer.cs @@ -0,0 +1,81 @@ +// Copyright (c) 2010-2013 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; + +namespace ICSharpCode.Decompiler.Util +{ + public static class KeyComparer + { + public static KeyComparer Create(Func keySelector) + { + return new KeyComparer(keySelector, Comparer.Default, EqualityComparer.Default); + } + + public static KeyComparer Create(Func keySelector, IComparer comparer, IEqualityComparer equalityComparer) + { + return new KeyComparer(keySelector, comparer, equalityComparer); + } + + public static IComparer Create(Func keySelector, IComparer comparer) + { + return new KeyComparer(keySelector, comparer, EqualityComparer.Default); + } + + public static IEqualityComparer Create(Func keySelector, IEqualityComparer equalityComparer) + { + return new KeyComparer(keySelector, Comparer.Default, equalityComparer); + } + } + + public class KeyComparer : IComparer, IEqualityComparer + { + readonly Func keySelector; + readonly IComparer keyComparer; + readonly IEqualityComparer keyEqualityComparer; + + public KeyComparer(Func keySelector, IComparer keyComparer, IEqualityComparer keyEqualityComparer) + { + if (keySelector == null) + throw new ArgumentNullException("keySelector"); + if (keyComparer == null) + throw new ArgumentNullException("keyComparer"); + if (keyEqualityComparer == null) + throw new ArgumentNullException("keyEqualityComparer"); + this.keySelector = keySelector; + this.keyComparer = keyComparer; + this.keyEqualityComparer = keyEqualityComparer; + } + + public int Compare(TElement x, TElement y) + { + return keyComparer.Compare(keySelector(x), keySelector(y)); + } + + public bool Equals(TElement x, TElement y) + { + return keyEqualityComparer.Equals(keySelector(x), keySelector(y)); + } + + public int GetHashCode(TElement obj) + { + return keyEqualityComparer.GetHashCode(keySelector(obj)); + } + } +}