@@ -46,7 +46,17 @@ public static void Analyze(INameService service, ICollection<ModuleDefMD> module
4646 // case here.
4747 if ( ! TypeEqualityComparer . Instance . Equals ( slot . MethodDef . DeclaringType , type ) ) {
4848 SetupOverwriteReferences ( service , modules , slot , type ) ;
49- //CreateOverrideReference(service, slot.MethodDef, slot.Overrides.MethodDef);
49+
50+ // If required, create the sibling references, so the names of the interfaces line up correctly.
51+ var existingReferences = service . GetReferences ( slot . MethodDef ) ;
52+ var overrideDef = existingReferences
53+ . OfType < MemberOverrideReference > ( )
54+ . FirstOrDefault ( r => ! MethodEqualityComparer . CompareDeclaringTypes . Equals ( r . BaseMemberDef as MethodDef , slot . Overrides . MethodDef ) ) ;
55+
56+ if ( ! ( overrideDef is null ) ) {
57+ var baseMemberDef = overrideDef . BaseMemberDef ;
58+ CreateSiblingReference ( slot . Overrides . MethodDef , ref baseMemberDef , service ) ;
59+ }
5060 }
5161
5262 // For the case when method in base type implements an interface method for a derived type
@@ -67,9 +77,6 @@ public static void Analyze(INameService service, ICollection<ModuleDefMD> module
6777 if ( ! method . IsVirtual )
6878 return ;
6979
70- var vTbl = service . GetVTables ( ) [ method . DeclaringType ] ;
71- var slots = vTbl . FindSlots ( method ) . ToArray ( ) ;
72-
7380 IMemberDef discoveredBaseMemberDef = null ;
7481 MethodDef discoveredBaseMethodDef = null ;
7582
@@ -118,6 +125,9 @@ public static void Analyze(INameService service, ICollection<ModuleDefMD> module
118125 }
119126
120127 if ( ! method . IsAbstract ) {
128+ var vTbl = service . GetVTables ( ) [ method . DeclaringType ] ;
129+ var slots = vTbl . FindSlots ( method ) . ToArray ( ) ;
130+
121131 foreach ( var slot in slots ) {
122132 if ( slot . Overrides == null )
123133 continue ;
@@ -132,9 +142,9 @@ public static void Analyze(INameService service, ICollection<ModuleDefMD> module
132142 }
133143 }
134144
135- static void CreateSiblingReference < T > ( T basePropDef , ref T discoveredBaseMemberDef , INameService service ) where T : class , IMemberDef {
145+ static void CreateSiblingReference < T > ( T baseMemberDef , ref T discoveredBaseMemberDef , INameService service ) where T : class , IMemberDef {
136146 if ( discoveredBaseMemberDef is null )
137- discoveredBaseMemberDef = basePropDef ;
147+ discoveredBaseMemberDef = baseMemberDef ;
138148 else {
139149 var references = service . GetReferences ( discoveredBaseMemberDef )
140150 . OfType < MemberSiblingReference > ( )
@@ -148,12 +158,12 @@ static void CreateSiblingReference<T>(T basePropDef, ref T discoveredBaseMemberD
148158 }
149159
150160 // Check if the discovered base type is the current type. If so, nothing needs to be done.
151- if ( ReferenceEquals ( basePropDef , discoveredBaseMemberDef ) ) return ;
161+ if ( ReferenceEquals ( baseMemberDef , discoveredBaseMemberDef ) ) return ;
152162
153- var reference = new MemberSiblingReference ( basePropDef , discoveredBaseMemberDef ) ;
154- service . AddReference ( basePropDef , reference ) ;
163+ var reference = new MemberSiblingReference ( baseMemberDef , discoveredBaseMemberDef ) ;
164+ service . AddReference ( baseMemberDef , reference ) ;
155165 service . AddReference ( discoveredBaseMemberDef , reference ) ;
156- UpdateOldestSiblingReference ( discoveredBaseMemberDef , basePropDef , service ) ;
166+ UpdateOldestSiblingReference ( discoveredBaseMemberDef , baseMemberDef , service ) ;
157167 }
158168 }
159169
0 commit comments