{
if (!change.AnyChange) {
// This is most likely because the rendering doesn't take into account something that's different (solution: fix rendering).
- if (!change.HasIgnoredChanges)
- Console.WriteLine ("Comparison resulting in no changes (src: {2} dst: {3}) :\n{0}\n{1}\n\n", source.ToString (), target.ToString (), source.GetMethodAttributes (), target.GetMethodAttributes ());
+ if (!change.HasIgnoredChanges) {
+ var isField = source.Name.LocalName == "field";
+ if (isField) {
+ Console.WriteLine ("Comparison resulting in no changes (src: {2} dst: {3}) :\n{0}\n{1}\n\n", source.ToString (), target.ToString (), source.GetFieldAttributes (), target.GetFieldAttributes ());
+ } else {
+ Console.WriteLine ("Comparison resulting in no changes (src: {2} dst: {3}) :\n{0}\n{1}\n\n", source.ToString (), target.ToString (), source.GetMethodAttributes (), target.GetMethodAttributes ());
+ }
+ }
return;
}
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");
+ }
+ }
+
// the visibility values are the same for MethodAttributes and FieldAttributes, so just use the same method.
RenderVisibility ((MethodAttributes) source, (MethodAttributes) target, change);
// same for the static flag
change.AnyChange = false;
change.HasIgnoredChanges = true;
}
+
+ var tgtSecurity = (source & MethodAttributes.HasSecurity) == MethodAttributes.HasSecurity;
+ var srcSecurity = (target & MethodAttributes.HasSecurity) == MethodAttributes.HasSecurity;
+
+ if (tgtSecurity != srcSecurity)
+ change.HasIgnoredChanges = true;
+
+ var srcPInvoke = (source & MethodAttributes.PinvokeImpl) == MethodAttributes.PinvokeImpl;
+ var tgtPInvoke = (target & MethodAttributes.PinvokeImpl) == MethodAttributes.PinvokeImpl;
+ if (srcPInvoke != tgtPInvoke)
+ change.HasIgnoredChanges = true;
}
protected string GetVisibility (MethodAttributes attr)
}
}
+ void RenderIndexers (List<XElement> srcIndexers, List<XElement> tgtIndexers, ApiChange change)
+ {
+ change.Append ("this [");
+ for (int i = 0; i < srcIndexers.Count; i++) {
+ var source = srcIndexers [i];
+ var target = tgtIndexers [i];
+
+ if (i > 0)
+ change.Append (", ");
+
+ var srcType = source.GetTypeName ("type");
+ var tgtType = target.GetTypeName ("type");
+ if (srcType == tgtType) {
+ change.Append (tgtType);
+ } else {
+ change.AppendModified (srcType, tgtType, true);
+ }
+ change.Append (" ");
+
+ var srcName = source.GetAttribute ("name");
+ var tgtName = target.GetAttribute ("name");
+ if (srcName == tgtName) {
+ change.Append (tgtName);
+ } else {
+ change.AppendModified (srcName, tgtName, true);
+ }
+ }
+ change.Append ("]");
+ }
+
public override bool Equals (XElement source, XElement target, ApiChanges changes)
{
if (base.Equals (source, target, changes))
GetAccessors (source, out srcGetter, out srcSetter);
GetAccessors (target, out tgtGetter, out tgtSetter);
+ List<XElement> srcIndexers = null;
+ List<XElement> tgtIndexers = null;
+ bool isIndexer = false;
+ if (srcGetter != null) {
+ srcIndexers = srcGetter.DescendantList ("parameters", "parameter");
+ tgtIndexers = tgtGetter.DescendantList ("parameters", "parameter");
+ isIndexer = srcIndexers != null && srcIndexers.Count > 0;
+ }
+
var change = new ApiChange ();
change.Header = "Modified " + GroupName;
RenderMethodAttributes (GetMethodAttributes (srcGetter, srcSetter), GetMethodAttributes (tgtGetter, tgtSetter), change);
RenderPropertyType (source, target, change);
- RenderName (source, target, change);
+ if (isIndexer) {
+ RenderIndexers (srcIndexers, tgtIndexers, change);
+ } else {
+ RenderName (source, target, change);
+ }
RenderGenericParameters (source, target, change);
RenderAccessors (srcGetter, tgtGetter, srcSetter, tgtSetter, change);