[mono-api-html] Ignore non-important attribute differences and other improvements.
authorRolf Bjarne Kvinge <rolf@xamarin.com>
Thu, 23 Apr 2015 09:56:50 +0000 (11:56 +0200)
committerRolf Bjarne Kvinge <rolf@xamarin.com>
Thu, 23 Apr 2015 10:23:21 +0000 (12:23 +0200)
* Properly colorize removed types (as red).
* Print 'NotSerialized' field attribute change (as not breaking).
* Ignore 'HasSecurity' and 'PInvokeImpl' method attribute differences.
* Render property indexers (and detect name change in property indexer parameters).
* Improve debug spew to print proper method/field attributes.

mcs/tools/corcompare/mono-api-html/ApiChange.cs
mcs/tools/corcompare/mono-api-html/ClassComparer.cs
mcs/tools/corcompare/mono-api-html/FieldComparer.cs
mcs/tools/corcompare/mono-api-html/MemberComparer.cs
mcs/tools/corcompare/mono-api-html/PropertyComparer.cs

index a50197439918bd280557f4a0613c8d719111411a..8097edbd4ab9a2f884ea09afa1910657ac4bb4ee 100644 (file)
@@ -68,8 +68,14 @@ namespace Xamarin.ApiDiff
                {
                        if (!change.AnyChange) {
                                // This is most likely because the rendering doesn't take into account something that's different (solution: fix rendering).
-                               if (!change.HasIgnoredChanges)
-                                       Console.WriteLine ("Comparison resulting in no changes (src: {2} dst: {3}) :\n{0}\n{1}\n\n", source.ToString (), target.ToString (), source.GetMethodAttributes (), target.GetMethodAttributes ());
+                               if (!change.HasIgnoredChanges) {
+                                       var isField = source.Name.LocalName == "field";
+                                       if (isField) {
+                                               Console.WriteLine ("Comparison resulting in no changes (src: {2} dst: {3}) :\n{0}\n{1}\n\n", source.ToString (), target.ToString (), source.GetFieldAttributes (), target.GetFieldAttributes ());
+                                       } else {
+                                               Console.WriteLine ("Comparison resulting in no changes (src: {2} dst: {3}) :\n{0}\n{1}\n\n", source.ToString (), target.ToString (), source.GetMethodAttributes (), target.GetMethodAttributes ());
+                                       }
+                               }
                                return;
                        }
 
index dae6c09ca49111cd27e99f4ac5c96d6cb612f134..730203145e507c89ee44d2dc15f3ee5e3060b28d 100644 (file)
@@ -237,7 +237,10 @@ namespace Xamarin.ApiDiff {
 
                public override void Removed (XElement source)
                {
-                       Output.WriteLine ("<h3>Removed Type {0}.{1}", State.Namespace, GetTypeName (source));
+                       var style = string.Empty;
+                       if (State.Colorize)
+                               style = "style='color: red'";
+                       Output.Write ("<h3>Removed Type <span {0}>{1}.{2}</span></h3>", style, State.Namespace, GetTypeName (source));
                }
 
                public virtual string GetTypeName (XElement type)
index c8a6e0a777262a1b43807f0decb5a5a58d315484..3fc1d85553503dee40a74dd360767c05118833ab 100644 (file)
@@ -45,6 +45,17 @@ namespace Xamarin.ApiDiff {
 
                void RenderFieldAttributes (FieldAttributes source, FieldAttributes target, ApiChange change)
                {
+                       var srcNotSerialized = (source & FieldAttributes.NotSerialized) == FieldAttributes.NotSerialized;
+                       var tgtNotSerialized = (target & FieldAttributes.NotSerialized) == FieldAttributes.NotSerialized;
+                       if (srcNotSerialized != tgtNotSerialized) {
+                               // this is not a breaking change, so only render it if it changed.
+                               if (srcNotSerialized) {
+                                       change.AppendRemoved ("[NonSerialized]\n");
+                               } else {
+                                       change.AppendAdded ("[NonSerialized]\n");
+                               }
+                       }
+
                        // the visibility values are the same for MethodAttributes and FieldAttributes, so just use the same method.
                        RenderVisibility ((MethodAttributes) source, (MethodAttributes) target, change);
                        // same for the static flag
index a3a0e57d8c9490aa189890c621c24c29d902a826..7352b5d907400156d50083a2bbc2e41378a61894 100644 (file)
@@ -427,6 +427,17 @@ namespace Xamarin.ApiDiff {
                                change.AnyChange = false;
                                change.HasIgnoredChanges = true;
                        }
+
+                       var tgtSecurity = (source & MethodAttributes.HasSecurity) == MethodAttributes.HasSecurity;
+                       var srcSecurity = (target & MethodAttributes.HasSecurity) == MethodAttributes.HasSecurity;
+
+                       if (tgtSecurity != srcSecurity)
+                               change.HasIgnoredChanges = true;
+
+                       var srcPInvoke = (source & MethodAttributes.PinvokeImpl) == MethodAttributes.PinvokeImpl;
+                       var tgtPInvoke = (target & MethodAttributes.PinvokeImpl) == MethodAttributes.PinvokeImpl;
+                       if (srcPInvoke != tgtPInvoke)
+                               change.HasIgnoredChanges = true;
                }
 
                protected string GetVisibility (MethodAttributes attr)
index 4fbd864d994a858fd0b151698bb74c134d2e4637..f51dd231bb9297696a629b6590cd87974c1aeeb6 100644 (file)
@@ -136,6 +136,36 @@ namespace Xamarin.ApiDiff {
                        }
                }
 
+               void RenderIndexers (List<XElement> srcIndexers, List<XElement> tgtIndexers, ApiChange change)
+               {
+                       change.Append ("this [");
+                       for (int i = 0; i < srcIndexers.Count; i++) {
+                               var source = srcIndexers [i];
+                               var target = tgtIndexers [i];
+
+                               if (i > 0)
+                                       change.Append (", ");
+
+                               var srcType = source.GetTypeName ("type");
+                               var tgtType = target.GetTypeName ("type");
+                               if (srcType == tgtType) {
+                                       change.Append (tgtType);
+                               } else {
+                                       change.AppendModified (srcType, tgtType, true);
+                               }
+                               change.Append (" ");
+
+                               var srcName = source.GetAttribute ("name");
+                               var tgtName = target.GetAttribute ("name");
+                               if (srcName == tgtName) {
+                                       change.Append (tgtName);
+                               } else {
+                                       change.AppendModified (srcName, tgtName, true);
+                               }
+                       }
+                       change.Append ("]");
+               }
+
                public override bool Equals (XElement source, XElement target, ApiChanges changes)
                {
                        if (base.Equals (source, target, changes))
@@ -146,11 +176,24 @@ namespace Xamarin.ApiDiff {
                        GetAccessors (source, out srcGetter, out srcSetter);
                        GetAccessors (target, out tgtGetter, out tgtSetter);
 
+                       List<XElement> srcIndexers = null;
+                       List<XElement> tgtIndexers = null;
+                       bool isIndexer = false;
+                       if (srcGetter != null) {
+                               srcIndexers = srcGetter.DescendantList ("parameters", "parameter");
+                               tgtIndexers = tgtGetter.DescendantList ("parameters", "parameter");
+                               isIndexer = srcIndexers != null && srcIndexers.Count > 0;
+                       }
+
                        var change = new ApiChange ();
                        change.Header = "Modified " + GroupName;
                        RenderMethodAttributes (GetMethodAttributes (srcGetter, srcSetter), GetMethodAttributes (tgtGetter, tgtSetter), change);
                        RenderPropertyType (source, target, change);
-                       RenderName (source, target, change);
+                       if (isIndexer) {
+                               RenderIndexers (srcIndexers, tgtIndexers, change);
+                       } else {
+                               RenderName (source, target, change);
+                       }
                        RenderGenericParameters (source, target, change);
                        RenderAccessors (srcGetter, tgtGetter, srcSetter, tgtSetter, change);