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;
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));
}
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;
}
}
+ 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 ();
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;