Skip to content

Commit a5cce92

Browse files
authored
Merge pull request #525 from ElektroKill/fix-reference-compare-sigcomparer
Resolve `SigComparer` regression introduced in 4.0
2 parents aa9ac47 + 552d570 commit a5cce92

File tree

1 file changed

+34
-9
lines changed

1 file changed

+34
-9
lines changed

src/DotNet/SigComparer.cs

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ public sealed class TypeEqualityComparer : IEqualityComparer<IType>, IEqualityCo
2121
/// </summary>
2222
public static readonly TypeEqualityComparer CaseInsensitive = new TypeEqualityComparer(SigComparerOptions.CaseInsensitiveAll);
2323

24+
/// <summary>
25+
/// Compares definitions in same module using reference comparison instead of comparing them by name, signature, etc.
26+
/// </summary>
27+
public static readonly TypeEqualityComparer CompareReferenceInSameModule = new TypeEqualityComparer(SigComparerOptions.ReferenceCompareForMemberDefsInSameModule);
28+
2429
/// <summary>
2530
/// Constructor
2631
/// </summary>
@@ -96,6 +101,11 @@ public sealed class FieldEqualityComparer : IEqualityComparer<IField>, IEquality
96101
/// </summary>
97102
public static readonly FieldEqualityComparer CaseInsensitiveDontCompareDeclaringTypes = new FieldEqualityComparer(SigComparerOptions.CaseInsensitiveAll);
98103

104+
/// <summary>
105+
/// Compares definitions in same module using reference comparison instead of comparing them by name, signature, etc.
106+
/// </summary>
107+
public static readonly FieldEqualityComparer CompareReferenceInSameModule = new FieldEqualityComparer(SigComparerOptions.ReferenceCompareForMemberDefsInSameModule);
108+
99109
/// <summary>
100110
/// Constructor
101111
/// </summary>
@@ -147,6 +157,11 @@ public sealed class MethodEqualityComparer : IEqualityComparer<IMethod>, IEquali
147157
/// </summary>
148158
public static readonly MethodEqualityComparer CaseInsensitiveDontCompareDeclaringTypes = new MethodEqualityComparer(SigComparerOptions.CaseInsensitiveAll);
149159

160+
/// <summary>
161+
/// Compares definitions in same module using reference comparison instead of comparing them by name, signature, etc.
162+
/// </summary>
163+
public static readonly MethodEqualityComparer CompareReferenceInSameModule = new MethodEqualityComparer(SigComparerOptions.ReferenceCompareForMemberDefsInSameModule);
164+
150165
/// <summary>
151166
/// Constructor
152167
/// </summary>
@@ -210,6 +225,11 @@ public sealed class PropertyEqualityComparer : IEqualityComparer<PropertyDef> {
210225
/// </summary>
211226
public static readonly PropertyEqualityComparer CaseInsensitiveDontCompareDeclaringTypes = new PropertyEqualityComparer(SigComparerOptions.CaseInsensitiveAll);
212227

228+
/// <summary>
229+
/// Compares definitions in same module using reference comparison instead of comparing them by name, signature, etc.
230+
/// </summary>
231+
public static readonly PropertyEqualityComparer CompareReferenceInSameModule = new PropertyEqualityComparer(SigComparerOptions.ReferenceCompareForMemberDefsInSameModule);
232+
213233
/// <summary>
214234
/// Constructor
215235
/// </summary>
@@ -249,6 +269,11 @@ public sealed class EventEqualityComparer : IEqualityComparer<EventDef> {
249269
/// </summary>
250270
public static readonly EventEqualityComparer CaseInsensitiveDontCompareDeclaringTypes = new EventEqualityComparer(SigComparerOptions.CaseInsensitiveAll);
251271

272+
/// <summary>
273+
/// Compares definitions in same module using reference comparison instead of comparing them by name, signature, etc.
274+
/// </summary>
275+
public static readonly EventEqualityComparer CompareReferenceInSameModule = new EventEqualityComparer(SigComparerOptions.ReferenceCompareForMemberDefsInSameModule);
276+
252277
/// <summary>
253278
/// Constructor
254279
/// </summary>
@@ -487,10 +512,10 @@ public enum SigComparerOptions : uint {
487512
IgnoreMultiDimensionalArrayLowerBoundsAndSizes = 0x800000,
488513

489514
/// <summary>
490-
/// When comparing MemberDefs in same module, comparing reference only can avoid conflict when members have same signature.
491-
/// If this flag is set, these members are compared just like any other members.
515+
/// When comparing MemberDefs in same module, use regular reference comparison instead
516+
/// comparing the signature, name, and other properties.
492517
/// </summary>
493-
DisableCompareReferenceOnlyForMemberDefsInSameModule = 0x1000000,
518+
ReferenceCompareForMemberDefsInSameModule = 0x1000000,
494519
}
495520

496521
/// <summary>
@@ -541,7 +566,7 @@ public struct SigComparer {
541566
bool DontProjectWinMDRefs => (options & SigComparerOptions.DontProjectWinMDRefs) != 0;
542567
bool DontCheckTypeEquivalence => (options & SigComparerOptions.DontCheckTypeEquivalence) != 0;
543568
bool IgnoreMultiDimensionalArrayLowerBoundsAndSizes => (options & SigComparerOptions.IgnoreMultiDimensionalArrayLowerBoundsAndSizes) != 0;
544-
bool CompareReferenceOnlyForMemberDefsInSameModule => (options & SigComparerOptions.DisableCompareReferenceOnlyForMemberDefsInSameModule) == 0;
569+
bool ReferenceCompareForMemberDefsInSameModule => (options & SigComparerOptions.ReferenceCompareForMemberDefsInSameModule) != 0;
545570

546571
/// <summary>
547572
/// Constructor
@@ -1482,7 +1507,7 @@ public bool Equals(TypeDef a, TypeDef b) {
14821507
return true;
14831508
if (a is null || b is null)
14841509
return false;
1485-
if (CompareReferenceOnlyForMemberDefsInSameModule && InSameModule(a, b))
1510+
if (ReferenceCompareForMemberDefsInSameModule && InSameModule(a, b))
14861511
return false;
14871512
if (!recursionCounter.Increment())
14881513
return false;
@@ -2614,7 +2639,7 @@ public bool Equals(MethodDef a, MethodDef b) {
26142639
return true;
26152640
if (a is null || b is null)
26162641
return false;
2617-
if (CompareReferenceOnlyForMemberDefsInSameModule && InSameModule(a, b))
2642+
if (ReferenceCompareForMemberDefsInSameModule && InSameModule(a, b))
26182643
return false;
26192644
if (!recursionCounter.Increment())
26202645
return false;
@@ -2944,7 +2969,7 @@ public bool Equals(FieldDef a, FieldDef b) {
29442969
return true;
29452970
if (a is null || b is null)
29462971
return false;
2947-
if (CompareReferenceOnlyForMemberDefsInSameModule && InSameModule(a, b))
2972+
if (ReferenceCompareForMemberDefsInSameModule && InSameModule(a, b))
29482973
return false;
29492974
if (!recursionCounter.Increment())
29502975
return false;
@@ -2991,7 +3016,7 @@ public bool Equals(PropertyDef a, PropertyDef b) {
29913016
return true;
29923017
if (a is null || b is null)
29933018
return false;
2994-
if (CompareReferenceOnlyForMemberDefsInSameModule && InSameModule(a, b))
3019+
if (ReferenceCompareForMemberDefsInSameModule && InSameModule(a, b))
29953020
return false;
29963021
if (!recursionCounter.Increment())
29973022
return false;
@@ -3039,7 +3064,7 @@ public bool Equals(EventDef a, EventDef b) {
30393064
return true;
30403065
if (a is null || b is null)
30413066
return false;
3042-
if (CompareReferenceOnlyForMemberDefsInSameModule && InSameModule(a, b))
3067+
if (ReferenceCompareForMemberDefsInSameModule && InSameModule(a, b))
30433068
return false;
30443069
if (!recursionCounter.Increment())
30453070
return false;

0 commit comments

Comments
 (0)