Merge pull request #2535 from lambdageek/monoerror-reflection-bubble
[mono.git] / mcs / tools / corcompare / mono-api-diff.cs
index 3e94529f1b36f144302595f42210f526d40f3772..322e4c883b7ddc56ac39c62c9c19695b2180587c 100644 (file)
@@ -4,10 +4,13 @@
 //
 // Authors:
 //     Gonzalo Paniagua Javier (gonzalo@ximian.com)
-//     Marek Safar                             (marek.safar@gmail.com)
+//     Marek Safar             (marek.safar@gmail.com)
 //
-// (C) 2003 Novell, Inc (http://www.novell.com)
+// Maintainer:
+//     C.J. Adams-Collier      (cjac@colliertech.org)
 //
+// (C) 2003 Novell, Inc (http://www.novell.com)
+// (C) 2009,2010 Collier Technologies (http://www.colliertech.org)
 
 using System;
 using System.Collections;
@@ -180,6 +183,15 @@ namespace Mono.AssemblyCompare
                        return (object []) list.ToArray (type);
                }
 
+               public static bool IsMeaninglessAttribute (string s)
+               {
+                       if (s == null)
+                               return false;
+                       if (s == "System.Runtime.CompilerServices.CompilerGeneratedAttribute")
+                               return true;
+                       return false;
+               }
+
                public static bool IsMonoTODOAttribute (string s)
                {
                        if (s == null)
@@ -283,14 +295,14 @@ namespace Mono.AssemblyCompare
                public bool HaveWarnings {
                        get { return haveWarnings; }
                }
-               
+
                public Counters Counters {
                        get { return counters; }
                }
-               
+
                public abstract void CompareTo (XmlDocument doc, XmlNode parent, object other);
        }
-       
+
        abstract class XMLNameGroup : XMLData
        {
                protected XmlNode group;
@@ -518,7 +530,7 @@ namespace Mono.AssemblyCompare
                        this.document = doc;
                        XmlNode parent = doc.CreateElement ("assemblies", null);
                        doc.AppendChild (parent);
-                       
+
                        CompareTo (doc, parent, other);
 
                        XmlNode decl = doc.CreateXmlDeclaration ("1.0", null, null);
@@ -648,7 +660,7 @@ namespace Mono.AssemblyCompare
                XMLEvents events;
                XMLMethods methods;
                XMLClass [] nested;
-               
+
                public override void LoadData (XmlNode node)
                {
                        if (node == null)
@@ -682,7 +694,7 @@ namespace Mono.AssemblyCompare
                                // Console.Error.WriteLine ("Empty class {0} {1}", name, type);
                                return;
                        }
-                               
+
                        if (child.Name == "attributes") {
                                attributes = new XMLAttributes ();
                                attributes.LoadData (child);
@@ -731,6 +743,12 @@ namespace Mono.AssemblyCompare
                                child = child.NextSibling;
                        }
 
+                       if (child != null && child.Name == "generic-parameters") {
+                               // HACK: ignore this tag as it doesn't seem to
+                               // add any value when checking for differences
+                               return;
+                       }
+
                        if (child == null)
                                return;
 
@@ -889,6 +907,7 @@ namespace Mono.AssemblyCompare
                                        node = document.CreateElement ("class", null);
                                        newNodes.Add (node);
                                        AddAttribute (node, "name", c.Name);
+                                       AddAttribute (node, "type", c.Type);
                                        AddExtra (node);
                                        counters.Extra++;
                                        counters.ExtraTotal++;
@@ -976,7 +995,7 @@ namespace Mono.AssemblyCompare
 
                        if (type != oparm.type)
                                AddWarning (parent, "Parameter type is wrong: {0} != {1}", type, oparm.type);
-                       
+
                        if (attrib != oparm.attrib)
                                AddWarning (parent, "Parameter attributes wrong: {0} != {1}", attrib, oparm.attrib);
 
@@ -1082,7 +1101,7 @@ namespace Mono.AssemblyCompare
                                if (de.Value.Equals (other_value))
                                        continue;
 
-                               AddWarning (parent, "Property '{0}' is '{1}' and should be '{2}'", 
+                               AddWarning (parent, "Property '{0}' is '{1}' and should be '{2}'",
                                        de.Key, de.Value, other_value == null ? "null" : other_value);
                        }
                }
@@ -1119,7 +1138,7 @@ namespace Mono.AssemblyCompare
                                return false;
                        }
 
-                       return true;
+                       return !IsMeaninglessAttribute (value);
                }
 
                protected override void CompareToInner (string name, XmlNode node, XMLNameGroup other)
@@ -1137,7 +1156,7 @@ namespace Mono.AssemblyCompare
                {
                        string key = null;
 
-                       // if multiple attributes with the same name (type) exist, then we 
+                       // if multiple attributes with the same name (type) exist, then we
                        // cannot be sure which attributes correspond, so we must use the
                        // name of the attribute (type) and the name/value of its properties
                        // as key
@@ -1156,7 +1175,7 @@ namespace Mono.AssemblyCompare
                                        }
                                }
 
-                               // sort properties by name, as order of properties in XML is 
+                               // sort properties by name, as order of properties in XML is
                                // undefined
                                keyParts.Sort ();
 
@@ -1275,7 +1294,7 @@ namespace Mono.AssemblyCompare
                        XmlAttribute xatt = node.Attributes ["attrib"];
                        if (xatt != null)
                                access [name] = xatt.Value;
-                       
+
                        XmlNode orig = node;
 
                        node = node.FirstChild;
@@ -1345,7 +1364,7 @@ namespace Mono.AssemblyCompare
                        return null;
                }
        }
-       
+
        class XMLFields : XMLMember
        {
                Hashtable fieldTypes;
@@ -1548,9 +1567,11 @@ namespace Mono.AssemblyCompare
                public override string GetNodeKey (string name, XmlNode node)
                {
                        XmlAttributeCollection atts = node.Attributes;
-                       return String.Format ("{0}:{1}:{2}", atts ["name"].Value,
-                                                               atts ["ptype"].Value,
-                                                               atts ["params"].Value);
+                       return String.Format ("{0}:{1}:{2}",
+                                             (atts["name"]   != null ? atts["name"].Value   : ""),
+                                             (atts["ptype"]  != null ? atts["ptype"].Value  : ""),
+                                             (atts["params"] != null ? atts["params"].Value : "")
+                                             );
                }
 
                public override string GroupName {
@@ -1565,6 +1586,7 @@ namespace Mono.AssemblyCompare
        class XMLEvents : XMLMember
        {
                Hashtable eventTypes;
+               Hashtable nameToMethod = new Hashtable ();
 
                protected override void LoadExtraData (string name, XmlNode node)
                {
@@ -1576,6 +1598,19 @@ namespace Mono.AssemblyCompare
                                eventTypes [name] = xatt.Value;
                        }
 
+                       XmlNode child = node.FirstChild;
+                       while (child != null) {
+                               if (child != null && child.Name == "methods") {
+                                       XMLMethods m = new XMLMethods ();
+                                       XmlNode parent = child.ParentNode;
+                                       string key = GetNodeKey (name, parent);
+                                       m.LoadData (child);
+                                       nameToMethod [key] = m;
+                                       break;
+                               }
+                               child = child.NextSibling;
+                       }
+
                        base.LoadExtraData (name, node);
                }
 
@@ -1598,6 +1633,16 @@ namespace Mono.AssemblyCompare
 
                                if (etype != oetype)
                                        AddWarning (parent, "Event type is {0} and should be {1}", oetype, etype);
+
+                               XMLMethods m = nameToMethod [name] as XMLMethods;
+                               XMLMethods om = evt.nameToMethod [name] as XMLMethods;
+                               if (m != null || om != null) {
+                                       if (m == null)
+                                               m = new XMLMethods ();
+
+                                       m.CompareTo (document, parent, om);
+                                       counters.AddPartialToPartial (m.Counters);
+                               }
                        } finally {
                                AddCountersAttributes (parent);
                                copy.AddPartialToPartial (counters);
@@ -1774,7 +1819,7 @@ namespace Mono.AssemblyCompare
                        if ((ma & MethodAttributes.RequireSecObject) != 0)
                                ma = (MethodAttributes) (att - (int) MethodAttributes.RequireSecObject);
 
-                       // we don't care if the implementation is forwarded through PInvoke 
+                       // we don't care if the implementation is forwarded through PInvoke
                        if ((ma & MethodAttributes.PinvokeImpl) != 0)
                                ma = (MethodAttributes) (att - (int) MethodAttributes.PinvokeImpl);