Merge pull request #2366 from xmcclure/scripts-babysitter
[mono.git] / mcs / tools / corcompare / mono-api-info.cs
index e9018e2555504459acbe2964449de9ef74bd2ea0..c43437fe40d869165c5b7d20f02eaa036c58a85f 100644 (file)
@@ -35,18 +35,31 @@ namespace CorCompare
                        var acoll = new AssemblyCollection ();
 
                        var options = new Mono.Options.OptionSet {
-                               { "h|help", "Show this help", v => showHelp = true },
-                               { "abi", _ => AbiMode = true},
-                               { "f|follow-forwarders", _ => FollowForwarders = true },
-                               { "d|search-directory=", v => TypeHelper.Resolver.AddSearchDirectory (v) },
+                               "usage: mono-api-info [OPTIONS+] ASSEMBLY+",
+                               "",
+                               "Expose IL structure of CLR assemblies as XML.",
+                               "",
+                               "Available Options:",
+                               { "abi",
+                                       "Generate ABI, not API; contains only classes with instance fields which are not [NonSerialized].",
+                                       v => AbiMode = v != null },
+                               { "f|follow-forwarders",
+                                       "Follow type forwarders.",
+                                       v => FollowForwarders = v != null },
+                               { "d|L|lib|search-directory=",
+                                       "Check for assembly references in {DIRECTORY}.",
+                                       v => TypeHelper.Resolver.AddSearchDirectory (v) },
+                               { "r=",
+                                       "Read and register the file {ASSEMBLY}, and add the directory containing ASSEMBLY to the search path.",
+                                       v => TypeHelper.Resolver.ResolveFile (v) },
+                               { "h|?|help",
+                                       "Show this message and exit.",
+                                       v => showHelp = v != null },
                        };
 
                        var asms = options.Parse (args);
 
                        if (showHelp || asms.Count == 0) {
-                               Console.WriteLine (@"Usage: mono-api-info [options] <assemblies>");
-                               Console.WriteLine ();
-                               Console.WriteLine ("Available options:");
                                options.WriteOptionDescriptions (Console.Out);
                                Console.WriteLine ();
                                return showHelp? 0 :1;
@@ -483,7 +496,7 @@ namespace CorCompare
 
                                PropertyDefinition[] properties = GetProperties (type);
                                if (properties.Length > 0) {
-                                       Array.Sort (properties, MemberReferenceComparer.Default);
+                                       Array.Sort (properties, PropertyDefinitionComparer.Default);
                                        members.Add (new PropertyData (document, nclass, properties));
                                }
 
@@ -1031,9 +1044,7 @@ namespace CorCompare
                                parent.AppendChild (natts);
                        }
 
-                       for (int i = 0; i < atts.Count; ++i) {
-                               CustomAttribute att = atts [i];
-
+                       foreach (var att in atts.OrderBy ((a) => a.Constructor.DeclaringType.FullName)) {
                                string attName = Utils.CleanupTypeName (att.Constructor.DeclaringType);
                                if (SkipAttribute (att))
                                        continue;
@@ -1397,6 +1408,29 @@ namespace CorCompare
                }
        }
 
+       class PropertyDefinitionComparer : IComparer<PropertyDefinition>
+       {
+               public static PropertyDefinitionComparer Default = new PropertyDefinitionComparer ();
+
+               public int Compare (PropertyDefinition ma, PropertyDefinition mb)
+               {
+                       int res = String.Compare (ma.Name, mb.Name);
+                       if (res != 0)
+                               return res;
+
+                       if (!ma.HasParameters && !mb.HasParameters)
+                               return 0;
+
+                       if (!ma.HasParameters)
+                               return -1;
+
+                       if (!mb.HasParameters)
+                               return 1;
+
+                       return MethodDefinitionComparer.Compare (ma.Parameters, mb.Parameters);
+               }
+       }
+
        class MethodDefinitionComparer : IComparer
        {
                public static MethodDefinitionComparer Default = new MethodDefinitionComparer ();
@@ -1418,9 +1452,17 @@ namespace CorCompare
                        if (!mb.HasParameters)
                                return 1;
 
-                       IList<ParameterDefinition> pia = ma.Parameters ;
-                       IList<ParameterDefinition> pib = mb.Parameters;
-                       res = pia.Count - pib.Count;
+                       res = Compare (ma.Parameters, mb.Parameters);
+                       if (res != 0)
+                               return res;
+
+                       // operators can differ by only return type
+                       return string.CompareOrdinal (ma.ReturnType.FullName, mb.ReturnType.FullName);
+               }
+
+               public static int Compare (IList<ParameterDefinition> pia, IList<ParameterDefinition> pib)
+               {
+                       var res = pia.Count - pib.Count;
                        if (res != 0)
                                return res;