[mono-api-info] Add an is-override attribute to determine if a method is overriding...
[mono.git] / mcs / tools / corcompare / mono-api-html / ApiChange.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Xml.Linq;
5
6 namespace Xamarin.ApiDiff
7 {
8         public class ApiChange
9         {
10                 public string Header;
11                 public StringBuilder Member = new StringBuilder ();
12                 public bool Breaking;
13                 public bool AnyChange;
14                 public bool HasIgnoredChanges;
15
16                 public ApiChange Append (string text)
17                 {
18                         Member.Append (text);
19                         return this;
20                 }
21
22                 public ApiChange AppendAdded (string text, bool breaking = false)
23                 {
24                         if (breaking)
25                                 Member.Append ("<span style='text-decoration: underline'>");
26                         if (State.Colorize)
27                                 Member.Append ("<span style='color:green'>");
28                         Member.Append (text);
29                         if (State.Colorize)
30                                 Member.Append ("</span>");
31                         if (breaking)
32                                 Member.Append ("</span>");
33                         Breaking |= breaking;
34                         AnyChange = true;
35                         return this;
36                 }
37
38                 public ApiChange AppendRemoved (string text, bool breaking = true)
39                 {
40                         Member.Append ("<span style='text-decoration: line-through'>");
41                         if (State.Colorize && breaking)
42                                 Member.Append ("<span style='color:red'>");
43                         Member.Append (text);
44                         if (State.Colorize && breaking)
45                                 Member.Append ("</span>");
46                         Member.Append ("</span>");
47                         Breaking |= breaking;
48                         AnyChange = true;
49                         return this;
50                 }
51
52                 public ApiChange AppendModified (string old, string @new, bool breaking = true)
53                 {
54                         if (old.Length > 0)
55                                 AppendRemoved (old, breaking);
56                         if (old.Length > 0 && @new.Length > 0)
57                                 Append (" ");
58                         if (@new.Length > 0)
59                                 AppendAdded (@new);
60                         Breaking |= breaking;
61                         AnyChange = true;
62                         return this;
63                 }
64         }
65
66         public class ApiChanges : Dictionary<string, List<ApiChange>> {
67                 public void Add (XElement source, XElement target, ApiChange change)
68                 {
69                         if (!change.AnyChange) {
70                                 // This is most likely because the rendering doesn't take into account something that's different (solution: fix rendering).
71                                 if (!change.HasIgnoredChanges) {
72                                         var isField = source.Name.LocalName == "field";
73                                         if (isField) {
74                                                 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 ());
75                                         } else {
76                                                 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 ());
77                                         }
78                                 }
79                                 return;
80                         }
81
82                         List<ApiChange> list;
83                         if (!TryGetValue (change.Header, out list)) {
84                                 list = new List<ApiChange> ();
85                                 base.Add (change.Header, list);
86                         }
87                         list.Add (change);
88                 }
89         }
90 }
91