@@ -1604,7 +1604,7 @@ public void DoUpdateType2 (string message, XmlDocument basefile, TypeDefinition
16041604 Console . WriteLine ( message + ": " + type . FullName ) ;
16051605 StringToXmlNodeMap seenmembers = new StringToXmlNodeMap ( ) ;
16061606 StringToXmlNodeMap seenmembersdocid = new StringToXmlNodeMap ( ) ;
1607-
1607+ var allTypeEiimembers = GetTypeEiiMembers ( type ) ;
16081608 // Update type metadata
16091609 UpdateType ( basefile . DocumentElement , type , typeEntry ) ;
16101610
@@ -1751,7 +1751,7 @@ public void DoUpdateType2 (string message, XmlDocument basefile, TypeDefinition
17511751 }
17521752
17531753 // Update signature information
1754- UpdateMember ( info , typeEntry , implementedMembers ) ;
1754+ UpdateMember ( info , typeEntry , implementedMembers , allTypeEiimembers ) ;
17551755 memberSet . Add ( info . Member . FullName ) ;
17561756
17571757 // get all apistyles of sig from info.Node
@@ -1809,7 +1809,7 @@ public void DoUpdateType2 (string message, XmlDocument basefile, TypeDefinition
18091809 . ToArray ( ) ;
18101810 foreach ( MemberReference m in typemembers )
18111811 {
1812- XmlElement mm = MakeMember ( basefile , new DocsNodeInfo ( null , m ) , members , typeEntry , implementedMembers ) ;
1812+ XmlElement mm = MakeMember ( basefile , new DocsNodeInfo ( null , m ) , members , typeEntry , implementedMembers , allTypeEiimembers ) ;
18131813 if ( mm == null ) continue ;
18141814
18151815 if ( MDocUpdater . SwitchingToMagicTypes || MDocUpdater . HasDroppedNamespace ( m ) )
@@ -2494,7 +2494,7 @@ internal static IEnumerable<T> Sort<T> (IEnumerable<T> list)
24942494 return l ;
24952495 }
24962496
2497- private void UpdateMember ( DocsNodeInfo info , FrameworkTypeEntry typeEntry , Dictionary < string , List < MemberReference > > implementedMembers )
2497+ private void UpdateMember ( DocsNodeInfo info , FrameworkTypeEntry typeEntry , Dictionary < string , List < MemberReference > > implementedMembers , IEnumerable < Eiimembers > eiiMenbers )
24982498 {
24992499 XmlElement me = ( XmlElement ) info . Node ;
25002500 MemberReference mi = info . Member ;
@@ -2505,7 +2505,7 @@ private void UpdateMember (DocsNodeInfo info, FrameworkTypeEntry typeEntry, Dict
25052505 me . SetAttribute ( "MemberName" , memberName ) ;
25062506
25072507 WriteElementText ( me , "MemberType" , GetMemberType ( mi ) ) ;
2508- AddImplementedMembers ( typeEntry , mi , implementedMembers , me ) ;
2508+ AddImplementedMembers ( typeEntry , mi , implementedMembers , me , eiiMenbers ) ;
25092509
25102510 if ( ! no_assembly_versions )
25112511 {
@@ -2797,7 +2797,7 @@ private static void GetUpdateXmlMethods(MemberFormatter formatter, XmlElement xm
27972797 }
27982798
27992799
2800- private static void AddImplementedMembers ( FrameworkTypeEntry typeEntry , MemberReference mi , Dictionary < string , List < MemberReference > > allImplementedMembers , XmlElement root )
2800+ public static void AddImplementedMembers ( FrameworkTypeEntry typeEntry , MemberReference mi , Dictionary < string , List < MemberReference > > allImplementedMembers , XmlElement root , IEnumerable < Eiimembers > eiiMembers )
28012801 {
28022802 if ( typeEntry . TimesProcessed > 1 )
28032803 return ;
@@ -2836,6 +2836,45 @@ private static void AddImplementedMembers(FrameworkTypeEntry typeEntry, MemberRe
28362836 }
28372837 }
28382838
2839+ if ( ! isExplicitlyImplemented )
2840+ {
2841+ eiiMembers . Where ( x => x . Fingerprint == fingerprint ) . ToList ( ) . ForEach ( t =>
2842+ {
2843+ t . Interfaces . ForEach ( u =>
2844+ {
2845+ var delitem = implementedMembers . FirstOrDefault ( i =>
2846+ {
2847+ if ( mi is MethodDefinition )
2848+ {
2849+ MethodDefinition methodDefinition = ( MethodDefinition ) i ;
2850+ if ( methodDefinition . FullName == u . FullName )
2851+ return true ;
2852+ }
2853+
2854+ if ( mi is PropertyDefinition )
2855+ {
2856+ PropertyDefinition propertyDefinition = ( PropertyDefinition ) i ;
2857+ if ( propertyDefinition . GetMethod ? . FullName == u . FullName
2858+ || propertyDefinition . SetMethod ? . FullName == u . FullName )
2859+ return true ;
2860+ }
2861+
2862+ if ( mi is EventDefinition )
2863+ {
2864+ EventDefinition evendDefinition = ( EventDefinition ) i ;
2865+ if ( evendDefinition . AddMethod ? . FullName == u . FullName
2866+ || evendDefinition . RemoveMethod ? . FullName == u . FullName )
2867+ return true ;
2868+ }
2869+ return false ;
2870+ } ) ;
2871+
2872+ if ( delitem != null )
2873+ implementedMembers . Remove ( delitem ) ;
2874+ } ) ;
2875+ } ) ;
2876+ }
2877+
28392878 if ( ! implementedMembers . Any ( ) )
28402879 return ;
28412880
@@ -4463,7 +4502,7 @@ private void MakeReturnValue (FrameworkTypeEntry typeEntry, XmlElement root, Mem
44634502 throw new ArgumentException ( mi + " is a " + mi . GetType ( ) . FullName ) ;
44644503 }
44654504
4466- private XmlElement MakeMember ( XmlDocument doc , DocsNodeInfo info , XmlNode members , FrameworkTypeEntry typeEntry , Dictionary < string , List < MemberReference > > iplementedMembers )
4505+ private XmlElement MakeMember ( XmlDocument doc , DocsNodeInfo info , XmlNode members , FrameworkTypeEntry typeEntry , Dictionary < string , List < MemberReference > > iplementedMembers , IEnumerable < Eiimembers > eiiMenbers )
44674506 {
44684507 MemberReference mi = info . Member ;
44694508 if ( mi is TypeDefinition ) return null ;
@@ -4482,7 +4521,7 @@ private XmlElement MakeMember (XmlDocument doc, DocsNodeInfo info, XmlNode membe
44824521 AddEiiNameAsAttribute ( mi , me , memberName ) ;
44834522
44844523 info . Node = me ;
4485- UpdateMember ( info , typeEntry , iplementedMembers ) ;
4524+ UpdateMember ( info , typeEntry , iplementedMembers , eiiMenbers ) ;
44864525 if ( exceptions . HasValue &&
44874526 ( exceptions . Value & ExceptionLocations . AddedMembers ) != 0 )
44884527 UpdateExceptions ( info . Node , info . Member ) ;
@@ -4682,6 +4721,32 @@ public static string GetXPathForMember (MemberReference member)
46824721 private static IEnumerable < XmlElement > QueryXmlElementsByXpath ( XmlElement parentNode , string xPath )
46834722 {
46844723 return parentNode . SelectNodes ( xPath ) . SafeCast < XmlElement > ( ) . ToArray ( ) ;
4724+ }
4725+
4726+ public static IEnumerable < Eiimembers > GetTypeEiiMembers ( TypeDefinition type )
4727+ {
4728+ if ( ! DocUtils . IsDelegate ( type ) )
4729+ {
4730+ var eiiTypeMembers = type . GetMembers ( )
4731+ . Where ( m =>
4732+ {
4733+ if ( m is TypeDefinition ) return false ;
4734+ string cssig = memberFormatters [ 0 ] . GetDeclaration ( m ) ;
4735+ if ( cssig == null ) return false ;
4736+
4737+ string sig = memberFormatters [ 1 ] . GetDeclaration ( m ) ;
4738+ if ( sig == null ) return false ;
4739+
4740+ if ( ! IsMemberNotPrivateEII ( m ) )
4741+ return false ;
4742+ return true ;
4743+ } )
4744+ . Where ( t => DocUtils . IsExplicitlyImplemented ( t ) )
4745+ . Select ( t => new Eiimembers { Fingerprint = DocUtils . GetFingerprint ( t ) , Interfaces = DocUtils . GetOverrides ( t ) . ToList < MemberReference > ( ) } ) ;
4746+ return eiiTypeMembers ;
4747+ }
4748+ else
4749+ { return new List < Eiimembers > ( ) ; }
46854750 }
46864751 }
46874752}
0 commit comments