@@ -1493,8 +1493,8 @@ public void DoUpdateType2 (string message, XmlDocument basefile, TypeDefinition
14931493 {
14941494 Console . WriteLine ( message + ": " + type . FullName ) ;
14951495 StringToXmlNodeMap seenmembers = new StringToXmlNodeMap ( ) ;
1496- StringToXmlNodeMap seenmembersdocid = new StringToXmlNodeMap ( ) ;
1497-
1496+ StringToXmlNodeMap seenmembersdocid = new StringToXmlNodeMap ( ) ;
1497+ var allTypeEiimembers = GetTypeEiiMembers ( type ) ;
14981498 // Update type metadata
14991499 UpdateType ( basefile . DocumentElement , type , typeEntry ) ;
15001500
@@ -1649,7 +1649,7 @@ public void DoUpdateType2 (string message, XmlDocument basefile, TypeDefinition
16491649 }
16501650
16511651 // Update signature information
1652- UpdateMember ( info , typeEntry , implementedMembers ) ;
1652+ UpdateMember ( info , typeEntry , implementedMembers , allTypeEiimembers ) ;
16531653 memberSet . Add ( info . Member . FullName ) ;
16541654
16551655 // get all apistyles of sig from info.Node
@@ -1707,7 +1707,7 @@ public void DoUpdateType2 (string message, XmlDocument basefile, TypeDefinition
17071707 . ToArray ( ) ;
17081708 foreach ( MemberReference m in typemembers )
17091709 {
1710- XmlElement mm = MakeMember ( basefile , new DocsNodeInfo ( null , m ) , members , typeEntry , implementedMembers ) ;
1710+ XmlElement mm = MakeMember ( basefile , new DocsNodeInfo ( null , m ) , members , typeEntry , implementedMembers , allTypeEiimembers ) ;
17111711 if ( mm == null ) continue ;
17121712
17131713 if ( MDocUpdater . SwitchingToMagicTypes || MDocUpdater . HasDroppedNamespace ( m ) )
@@ -2400,7 +2400,7 @@ internal static IEnumerable<T> Sort<T> (IEnumerable<T> list)
24002400 return l ;
24012401 }
24022402
2403- private void UpdateMember ( DocsNodeInfo info , FrameworkTypeEntry typeEntry , Dictionary < string , List < MemberReference > > implementedMembers )
2403+ private void UpdateMember ( DocsNodeInfo info , FrameworkTypeEntry typeEntry , Dictionary < string , List < MemberReference > > implementedMembers , IEnumerable < Eiimembers > eiiMenbers )
24042404 {
24052405 XmlElement me = ( XmlElement ) info . Node ;
24062406 MemberReference mi = info . Member ;
@@ -2411,7 +2411,7 @@ private void UpdateMember (DocsNodeInfo info, FrameworkTypeEntry typeEntry, Dict
24112411 me . SetAttribute ( "MemberName" , memberName ) ;
24122412
24132413 WriteElementText ( me , "MemberType" , GetMemberType ( mi ) ) ;
2414- AddImplementedMembers ( typeEntry , mi , implementedMembers , me ) ;
2414+ AddImplementedMembers ( typeEntry , mi , implementedMembers , me , eiiMenbers ) ;
24152415
24162416 if ( ! no_assembly_versions )
24172417 {
@@ -2703,7 +2703,7 @@ private static void GetUpdateXmlMethods(MemberFormatter formatter, XmlElement xm
27032703 }
27042704
27052705
2706- private static void AddImplementedMembers ( FrameworkTypeEntry typeEntry , MemberReference mi , Dictionary < string , List < MemberReference > > allImplementedMembers , XmlElement root )
2706+ public static void AddImplementedMembers ( FrameworkTypeEntry typeEntry , MemberReference mi , Dictionary < string , List < MemberReference > > allImplementedMembers , XmlElement root , IEnumerable < Eiimembers > eiiMembers )
27072707 {
27082708 if ( typeEntry . TimesProcessed > 1 )
27092709 return ;
@@ -2742,6 +2742,45 @@ private static void AddImplementedMembers(FrameworkTypeEntry typeEntry, MemberRe
27422742 }
27432743 }
27442744
2745+ if ( ! isExplicitlyImplemented )
2746+ {
2747+ eiiMembers . Where ( x => x . Fingerprint == fingerprint ) . ToList ( ) . ForEach ( t =>
2748+ {
2749+ t . Interfaces . ForEach ( u =>
2750+ {
2751+ var delitem = implementedMembers . FirstOrDefault ( i =>
2752+ {
2753+ if ( mi is MethodDefinition )
2754+ {
2755+ MethodDefinition methodDefinition = ( MethodDefinition ) i ;
2756+ if ( methodDefinition . FullName == u . FullName )
2757+ return true ;
2758+ }
2759+
2760+ if ( mi is PropertyDefinition )
2761+ {
2762+ PropertyDefinition propertyDefinition = ( PropertyDefinition ) i ;
2763+ if ( propertyDefinition . GetMethod ? . FullName == u . FullName
2764+ || propertyDefinition . SetMethod ? . FullName == u . FullName )
2765+ return true ;
2766+ }
2767+
2768+ if ( mi is EventDefinition )
2769+ {
2770+ EventDefinition evendDefinition = ( EventDefinition ) i ;
2771+ if ( evendDefinition . AddMethod ? . FullName == u . FullName
2772+ || evendDefinition . RemoveMethod ? . FullName == u . FullName )
2773+ return true ;
2774+ }
2775+ return false ;
2776+ } ) ;
2777+
2778+ if ( delitem != null )
2779+ implementedMembers . Remove ( delitem ) ;
2780+ } ) ;
2781+ } ) ;
2782+ }
2783+
27452784 if ( ! implementedMembers . Any ( ) )
27462785 return ;
27472786
@@ -4201,7 +4240,7 @@ private void MakeReturnValue (FrameworkTypeEntry typeEntry, XmlElement root, Mem
42014240 throw new ArgumentException ( mi + " is a " + mi . GetType ( ) . FullName ) ;
42024241 }
42034242
4204- private XmlElement MakeMember ( XmlDocument doc , DocsNodeInfo info , XmlNode members , FrameworkTypeEntry typeEntry , Dictionary < string , List < MemberReference > > iplementedMembers )
4243+ private XmlElement MakeMember ( XmlDocument doc , DocsNodeInfo info , XmlNode members , FrameworkTypeEntry typeEntry , Dictionary < string , List < MemberReference > > iplementedMembers , IEnumerable < Eiimembers > eiiMenbers )
42054244 {
42064245 MemberReference mi = info . Member ;
42074246 if ( mi is TypeDefinition ) return null ;
@@ -4220,7 +4259,7 @@ private XmlElement MakeMember (XmlDocument doc, DocsNodeInfo info, XmlNode membe
42204259 AddEiiNameAsAttribute ( mi , me , memberName ) ;
42214260
42224261 info . Node = me ;
4223- UpdateMember ( info , typeEntry , iplementedMembers ) ;
4262+ UpdateMember ( info , typeEntry , iplementedMembers , eiiMenbers ) ;
42244263 if ( exceptions . HasValue &&
42254264 ( exceptions . Value & ExceptionLocations . AddedMembers ) != 0 )
42264265 UpdateExceptions ( info . Node , info . Member ) ;
@@ -4420,6 +4459,32 @@ public static string GetXPathForMember (MemberReference member)
44204459 private static IEnumerable < XmlElement > QueryXmlElementsByXpath ( XmlElement parentNode , string xPath )
44214460 {
44224461 return parentNode . SelectNodes ( xPath ) . SafeCast < XmlElement > ( ) . ToArray ( ) ;
4462+ }
4463+
4464+ public static IEnumerable < Eiimembers > GetTypeEiiMembers ( TypeDefinition type )
4465+ {
4466+ if ( ! DocUtils . IsDelegate ( type ) )
4467+ {
4468+ var eiiTypeMembers = type . GetMembers ( )
4469+ . Where ( m =>
4470+ {
4471+ if ( m is TypeDefinition ) return false ;
4472+ string cssig = FormatterManager . MemberFormatters [ 0 ] . GetDeclaration ( m ) ;
4473+ if ( cssig == null ) return false ;
4474+
4475+ string sig = FormatterManager . MemberFormatters [ 1 ] . GetDeclaration ( m ) ;
4476+ if ( sig == null ) return false ;
4477+
4478+ if ( ! IsMemberNotPrivateEII ( m ) )
4479+ return false ;
4480+ return true ;
4481+ } )
4482+ . Where ( t => DocUtils . IsExplicitlyImplemented ( t ) )
4483+ . Select ( t => new Eiimembers { Fingerprint = DocUtils . GetFingerprint ( t ) , Interfaces = DocUtils . GetOverrides ( t ) . ToList < MemberReference > ( ) } ) ;
4484+ return eiiTypeMembers ;
4485+ }
4486+ else
4487+ { return new List < Eiimembers > ( ) ; }
44234488 }
44244489 }
44254490}
0 commit comments