using System;
using System.Collections.Generic;
using System.IO;
+using System.Linq;
using System.Xml.Linq;
namespace Xamarin.ApiDiff {
Compare (s.Elements ("class"), t.Elements ("class"));
}
- public override void Added (XElement target)
+ public override void Added (XElement target, bool wasParentAdded)
{
- Output.WriteLine ("<h3>New Type {0}.{1}</h3>", State.Namespace, target.Attribute ("name").Value);
- Output.WriteLine ("<pre>");
+ string name = target.Attribute ("name").Value;
+ if (State.IgnoreNew.Any (re => re.IsMatch (name)))
+ return;
+ Output.WriteLine ("<div> <!-- start type {0} -->", name);
+ Output.WriteLine ("<h3>New Type {0}.{1}</h3>", State.Namespace, name);
+ Output.WriteLine ("<pre class='added' data-is-non-breaking>");
State.Indent = 0;
AddedInner (target);
Output.WriteLine ("</pre>");
+ Output.WriteLine ("</div> <!-- end type {0} -->", name);
}
public void AddedInner (XElement target)
Output.Write (target.GetAttribute ("name"));
var baseclass = target.GetAttribute ("base");
- if (baseclass != null) {
- if (baseclass == "System.Object") {
- // while true we do not need to be reminded every time...
- baseclass = null;
- } else {
- Output.Write (" : ");
- Output.Write (baseclass);
+ if ((type != "enum") && (type != "struct")) {
+ if (baseclass != null) {
+ if (baseclass == "System.Object") {
+ // while true we do not need to be reminded every time...
+ baseclass = null;
+ } else {
+ Output.Write (" : ");
+ Output.Write (baseclass);
+ }
}
}
if (t != null) {
Indent ().WriteLine ("\t// constructors");
foreach (var ctor in t.Elements ("constructor"))
- ccomparer.Added (ctor);
+ ccomparer.Added (ctor, true);
}
t = target.Element ("fields");
else
SetContext (target);
foreach (var field in t.Elements ("field"))
- fcomparer.Added (field);
+ fcomparer.Added (field, true);
}
t = target.Element ("properties");
if (t != null) {
Indent ().WriteLine ("\t// properties");
foreach (var property in t.Elements ("property"))
- pcomparer.Added (property);
+ pcomparer.Added (property, true);
}
t = target.Element ("events");
if (t != null) {
Indent ().WriteLine ("\t// events");
foreach (var evnt in t.Elements ("event"))
- ecomparer.Added (evnt);
+ ecomparer.Added (evnt, true);
}
t = target.Element ("methods");
if (t != null) {
Indent ().WriteLine ("\t// methods");
foreach (var method in t.Elements ("method"))
- mcomparer.Added (method);
+ mcomparer.Added (method, true);
}
t = target.Element ("classes");
if (t != null) {
Output.WriteLine ();
Indent ().WriteLine ("\t// inner types");
- kcomparer = new ClassComparer ();
+ kcomparer = new NestedClassComparer ();
State.Indent++;
foreach (var inner in t.Elements ("class"))
kcomparer.AddedInner (inner);
Indent ().WriteLine ("}");
}
- public override void Modified (XElement source, XElement target)
+ public override void Modified (XElement source, XElement target, ApiChanges diff)
{
// hack - there could be changes that we're not monitoring (e.g. attributes properties)
var output = Output;
State.Output = new StringWriter ();
+ var sb = source.GetAttribute ("base");
+ var tb = target.GetAttribute ("base");
+ if (sb != tb) {
+ Output.Write ("Modified base type: ");
+ Output.WriteLine (new ApiChange ().AppendModified (sb, tb, true).Member.ToString ());
+ }
+
ccomparer.Compare (source, target);
icomparer.Compare (source, target);
fcomparer.Compare (source, target);
var si = source.Element ("classes");
if (si != null) {
var ti = target.Element ("classes");
- kcomparer = new ClassComparer ();
+ kcomparer = new NestedClassComparer ();
kcomparer.Compare (si.Elements ("class"), ti == null ? null : ti.Elements ("class"));
}
var s = (Output as StringWriter).ToString ();
State.Output = output;
if (s.Length > 0) {
- Output.WriteLine ("<h3>Type Changed: {0}.{1}</h3>", State.Namespace, target.Attribute ("name").Value);
+ var tn = GetTypeName (target);
+ Output.WriteLine ("<!-- start type {0} --> <div>", tn);
+ Output.WriteLine ("<h3>Type Changed: {0}.{1}</h3>", State.Namespace, GetTypeName (target));
Output.WriteLine (s);
+ Output.WriteLine ("</div> <!-- end type {0} -->", tn);
}
}
public override void Removed (XElement source)
{
- Output.WriteLine ("<h3>Removed Type {0}.{1}", State.Namespace, source.Attribute ("name").Value);
+ Output.Write ("<h3>Removed Type <span class='breaking' data-is-breaking>{0}.{1}</span></h3>", State.Namespace, GetTypeName (source));
+ }
+
+ public virtual string GetTypeName (XElement type)
+ {
+ return type.GetAttribute ("name");
+ }
+ }
+
+ public class NestedClassComparer : ClassComparer {
+
+ public override void SetContext (XElement current)
+ {
+ }
+
+ public override string GetTypeName (XElement type)
+ {
+ return State.Type + "." + base.GetTypeName (type);
}
}
}
\ No newline at end of file