[mono-api-html] Add option to ignore breaking changes
authorMikayla Hutchinson <m.j.hutchinson@gmail.com>
Wed, 6 Jul 2016 18:00:04 +0000 (14:00 -0400)
committerMarek Safar <marek.safar@gmail.com>
Wed, 13 Jul 2016 08:55:46 +0000 (10:55 +0200)
mcs/tools/mono-api-html/ApiDiff.cs
mcs/tools/mono-api-html/ClassComparer.cs
mcs/tools/mono-api-html/FieldComparer.cs
mcs/tools/mono-api-html/MemberComparer.cs

index 8fe2784485220399c0646210de60a119268d78bc..0f4cd7c2d9586858916282c108fd1890ae2fb3a0 100644 (file)
@@ -78,10 +78,11 @@ namespace Xamarin.ApiDiff {
                public  static  bool    IgnoreVirtualChanges        { get; set; }
                public  static  bool    IgnoreAddedPropertySetters  { get; set; }
 
+               public static bool IgnoreNonbreaking { get; set; }
+
                public static bool Lax;
                public static bool Colorize = true;
        }
-
        class Program {
 
                public static int Main (string[] args)
@@ -120,7 +121,8 @@ namespace Xamarin.ApiDiff {
                                        v => State.IgnoreVirtualChanges = v != null
                                },
                                { "c|colorize:", "Colorize HTML output", v => State.Colorize = string.IsNullOrEmpty (v) ? true : bool.Parse (v) },
-                               { "x|lax", "Ignore duplicate XML entries", v => State.Lax = true }
+                               { "x|lax", "Ignore duplicate XML entries", v => State.Lax = true },
+                               { "ignore-nonbreaking", "Ignore all nonbreaking changes", v => State.IgnoreNonbreaking = true }
                        };
 
                        try {
@@ -130,6 +132,13 @@ namespace Xamarin.ApiDiff {
                                showHelp = true;
                        }
 
+                       if (State.IgnoreNonbreaking) {
+                               State.IgnoreAddedPropertySetters = true;
+                               State.IgnoreVirtualChanges = true;
+                               State.IgnoreNew.Add (new Regex (".*"));
+                               State.IgnoreAdded.Add (new Regex (".*"));
+                       }
+
                        if (showHelp || extra == null || extra.Count < 2 || extra.Count > 3) {
                                Console.WriteLine (@"Usage: mono-api-html [options] <reference.xml> <assembly.xml> [diff.html]");
                                Console.WriteLine ();
@@ -253,9 +262,11 @@ namespace Xamarin.ApiDiff {
                                                        } else {
                                                                file.WriteLine ("<h1>{0}.dll vs {1}.dll</h1>", ac.SourceAssembly, ac.TargetAssembly);
                                                        }
-                                                       file.WriteLine ("<a href='javascript: hideNonBreakingChanges (); ' class='hide-nonbreaking'>Hide non-breaking changes</a>");
-                                                       file.WriteLine ("<a href='javascript: showNonBreakingChanges (); ' class='restore-nonbreaking' style='display: none;'>Show non-breaking changes</a>");
-                                                       file.WriteLine ("<br/>");
+                                                       if (!State.IgnoreNonbreaking) {
+                                                               file.WriteLine ("<a href='javascript: hideNonBreakingChanges (); ' class='hide-nonbreaking'>Hide non-breaking changes</a>");
+                                                               file.WriteLine ("<a href='javascript: showNonBreakingChanges (); ' class='restore-nonbreaking' style='display: none;'>Show non-breaking changes</a>");
+                                                               file.WriteLine ("<br/>");
+                                                       }
                                                        file.WriteLine ("<div data-is-topmost>");
                                                        file.Write (diffHtml);
                                                        file.WriteLine ("</div> <!-- end topmost div -->");
index a3399fbef04e5b731cfeb8277176f2a0705752e5..f6cf940c9e41c63eeb8ad5f6cb9f0fae6a16c52d 100644 (file)
@@ -198,6 +198,20 @@ namespace Xamarin.ApiDiff {
                        Indent ().WriteLine ("}");
                }
 
+               //HACK: we don't have hierarchy information here so just check some basic heuristics for now
+               bool IsBaseChangeCompatible (string source, string target)
+               {
+                       if (source == "System.Object")
+                               return true;
+                       if (source == "System.Exception" && target.EndsWith ("Exception", StringComparison.Ordinal))
+                               return true;
+                       if (source == "System.EventArgs" && target.EndsWith ("EventArgs", StringComparison.Ordinal))
+                               return true;
+                       if (source == "System.Runtime.InteropServices.SafeHandle" && target.StartsWith ("Microsoft.Win32.SafeHandles.SafeHandle", StringComparison.Ordinal))
+                               return true;
+                       return false;
+               }
+
                public override void Modified (XElement source, XElement target, ApiChanges diff)
                {
                        // hack - there could be changes that we're not monitoring (e.g. attributes properties)
@@ -206,7 +220,7 @@ namespace Xamarin.ApiDiff {
 
                        var sb = source.GetAttribute ("base");
                        var tb = target.GetAttribute ("base");
-                       if (sb != tb) {
+                       if (sb != tb && !(State.IgnoreNonbreaking && IsBaseChangeCompatible (sb, tb))) {
                                Output.Write ("Modified base type: ");
                                Output.WriteLine (new ApiChange ().AppendModified (sb, tb, true).Member.ToString ());
                        }
index a2b0225b4480856d2c1497bcb761c67b1abb2a33..f292eee22ddadfdbb051439c9e11c5a205ddd5f2 100644 (file)
@@ -45,14 +45,16 @@ 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");
+                       if (!State.IgnoreNonbreaking) {
+                               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");
+                                       }
                                }
                        }
 
index d12d86625c2ea7a0af1b5d4bbb8067bd32ed04e1..9da6edc106d5e91eedaef5e5c4c59e295d8ef8cc 100644 (file)
@@ -138,9 +138,13 @@ namespace Xamarin.ApiDiff {
                void Modify (ApiChanges modified)
                {
                        foreach (var changes in modified) {
+                               if (State.IgnoreNonbreaking && changes.Value.All (c => !c.Breaking))
+                                       continue;
                                Output.WriteLine ("<p>{0}:</p>", changes.Key);
                                Output.WriteLine ("<pre>");
                                foreach (var element in changes.Value) {
+                                       if (State.IgnoreNonbreaking && !element.Breaking)
+                                               continue;
                                        Output.Write ("<div {0}>", element.Breaking ? "data-is-breaking" : "data-is-non-breaking");
                                        foreach (var line in element.Member.ToString ().Split ('\n'))
                                                Output.WriteLine ("\t{0}", line);
@@ -158,6 +162,8 @@ namespace Xamarin.ApiDiff {
                                if (State.IgnoreRemoved.Any (re => re.IsMatch (GetDescription (item))))
                                        continue;
                                SetContext (item);
+                               if (State.IgnoreNonbreaking && !IsBreakingRemoval (item))
+                                       continue;
                                if (!r) {
                                        BeforeRemoving (elements);
                                        r = true;