//
// 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;
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)
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;
this.document = doc;
XmlNode parent = doc.CreateElement ("assemblies", null);
doc.AppendChild (parent);
-
+
CompareTo (doc, parent, other);
XmlNode decl = doc.CreateXmlDeclaration ("1.0", null, null);
XMLEvents events;
XMLMethods methods;
XMLClass [] nested;
-
+
public override void LoadData (XmlNode node)
{
if (node == null)
// Console.Error.WriteLine ("Empty class {0} {1}", name, type);
return;
}
-
+
if (child.Name == "attributes") {
attributes = new XMLAttributes ();
attributes.LoadData (child);
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;
node = document.CreateElement ("class", null);
newNodes.Add (node);
AddAttribute (node, "name", c.Name);
+ AddAttribute (node, "type", c.Type);
AddExtra (node);
counters.Extra++;
counters.ExtraTotal++;
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);
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);
}
}
return false;
}
- return true;
+ return !IsMeaninglessAttribute (value);
}
protected override void CompareToInner (string name, XmlNode node, XMLNameGroup other)
{
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
}
}
- // 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 ();
XmlAttribute xatt = node.Attributes ["attrib"];
if (xatt != null)
access [name] = xatt.Value;
-
+
XmlNode orig = node;
node = node.FirstChild;
return null;
}
}
-
+
class XMLFields : XMLMember
{
Hashtable fieldTypes;
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 {
class XMLEvents : XMLMember
{
Hashtable eventTypes;
+ Hashtable nameToMethod = new Hashtable ();
protected override void LoadExtraData (string name, XmlNode node)
{
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);
}
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);
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);