Example #1
0
        public override bool Equals(XElement source, XElement target, ApiChanges changes)
        {
            RenderAttributes(source, target, changes);

            // We don't want to compare attributes.
            RemoveAttributes(source);
            RemoveAttributes(target);

            return(base.Equals(source, target, changes));
        }
Example #2
0
        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");
            var rm = $"{State.Namespace}.{State.Type}: Modified base type: '{sb}' to '{tb}'";

            State.LogDebugMessage($"Possible -r value: {rm}");
            if (sb != tb &&
                !State.IgnoreRemoved.Any(re => re.IsMatch(rm)) &&
                !(State.IgnoreNonbreaking && IsBaseChangeCompatible(sb, tb)))
            {
                Formatter.BeginMemberModification(Output, "Modified base type");
                var apichange = new ApiChange($"{State.Namespace}.{State.Type}").AppendModified(sb, tb, true);
                Formatter.Diff(Output, apichange);
                Formatter.EndMemberModification(Output);
            }

            ccomparer.Compare(source, target);
            icomparer.Compare(source, target);
            fcomparer.Compare(source, target);
            pcomparer.Compare(source, target);
            ecomparer.Compare(source, target);
            mcomparer.Compare(source, target);

            var si = source.Element("classes");

            if (si != null)
            {
                var ti = target.Element("classes");
                kcomparer    = new NestedClassComparer();
                State.Parent = State.Type;
                kcomparer.Compare(si.Elements("class"), ti == null ? null : ti.Elements("class"));
                State.Type = State.Parent;
            }

            var s = (Output as StringWriter).ToString();

            State.Output = output;
            if (s.Length > 0)
            {
                SetContext(target);
                Formatter.BeginTypeModification(Output);
                Output.WriteLine(s);
                Formatter.EndTypeModification(Output);
            }
        }
        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");
            var rm = $"{State.Namespace}.{State.Type}: Modified base type: '{sb}' to '{tb}'";

            State.LogDebugMessage($"Possible -r value: {rm}");
            if (sb != tb &&
                !State.IgnoreRemoved.Any(re => re.IsMatch(rm)) &&
                !(State.IgnoreNonbreaking && IsBaseChangeCompatible(sb, tb)))
            {
                Output.Write("Modified base type: ");
                Output.WriteLine(new ApiChange($"{State.Namespace}.{State.Type}").AppendModified(sb, tb, true).Member.ToString());
            }

            ccomparer.Compare(source, target);
            icomparer.Compare(source, target);
            fcomparer.Compare(source, target);
            pcomparer.Compare(source, target);
            ecomparer.Compare(source, target);
            mcomparer.Compare(source, target);

            var si = source.Element("classes");

            if (si != null)
            {
                var ti = target.Element("classes");
                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)
            {
                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);
            }
        }
Example #4
0
        public override void Modified(XElement source, XElement target, ApiChanges diff)
        {
            SourceAssembly = source.GetAttribute("name");
            TargetAssembly = target.GetAttribute("name");

            var sb = source.GetAttribute("version");
            var tb = target.GetAttribute("version");

            if (sb != tb)
            {
                Output.WriteLine("<h4>Assembly Version Changed: {0} vs {1}</h4>", tb, sb);
            }

            // ? custom attributes ?
            comparer.Compare(source, target);
        }
Example #5
0
 void Modify(ApiChanges modified)
 {
     foreach (var changes in modified)
     {
         Output.WriteLine("<p>{0}:</p>", changes.Key);
         Output.WriteLine("<pre>");
         foreach (var element in changes.Value)
         {
             foreach (var line in element.Member.ToString().Split('\n'))
             {
                 Output.WriteLine("\t{0}", line);
             }
         }
         Output.WriteLine("</pre>");
     }
 }
Example #6
0
        public override void Modified(XElement source, XElement target, ApiChanges differences)
        {
            var output = Output;

            State.Output = new StringWriter();
            comparer.Compare(source, target);

            var s = Output.ToString();

            State.Output = output;
            if (s.Length > 0)
            {
                Output.WriteLine("<h2>Namespace {0}</h2>", target.Attribute("name").Value);
                Output.WriteLine(s);
            }
        }
Example #7
0
 void Modify(ApiChanges modified)
 {
     foreach (var changes in modified)
     {
         Output.WriteLine("<p>{0}:</p>", changes.Key);
         Output.WriteLine("<pre>");
         foreach (var element in changes.Value)
         {
             Output.Write("<div {0}>", element.Breaking ? "data-is-breaking" : "data-is-non-breaking");
             foreach (var line in element.Member.ToString().Split('\n'))
             {
                 Output.WriteLine("\t{0}", line);
             }
             Output.Write("</div>");
         }
         Output.WriteLine("</pre>");
     }
 }
Example #8
0
        public override void Modified(XElement source, XElement target, ApiChanges differences)
        {
            var output = Output;

            State.Output = new StringWriter();
            comparer.Compare(source, target);

            var s = Output.ToString();

            State.Output = output;
            if (s.Length > 0)
            {
                var name = target.Attribute("name").Value;
                Formatter.BeginNamespace(Output);
                Output.WriteLine(s);
                Formatter.EndNamespace(Output);
            }
        }
Example #9
0
        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);
            pcomparer.Compare(source, target);
            ecomparer.Compare(source, target);
            mcomparer.Compare(source, target);

            var si = source.Element("classes");

            if (si != null)
            {
                var ti = target.Element("classes");
                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)
            {
                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);
            }
        }
Example #10
0
        public override bool Equals(XElement source, XElement target, ApiChanges changes)
        {
            if (base.Equals(source, target, changes))
            {
                return(true);
            }

            XElement srcGetter, srcSetter;
            XElement tgtGetter, tgtSetter;

            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(GetDescription(source));

            change.Header = "Modified " + GroupName;
            RenderMethodAttributes(GetMethodAttributes(srcGetter, srcSetter), GetMethodAttributes(tgtGetter, tgtSetter), change);
            RenderPropertyType(source, target, change);
            if (isIndexer)
            {
                RenderIndexers(srcIndexers, tgtIndexers, change);
            }
            else
            {
                RenderName(source, target, change);
            }
            RenderGenericParameters(source, target, change);
            RenderAccessors(srcGetter, tgtGetter, srcSetter, tgtSetter, change);

            changes.Add(source, target, change);

            return(false);
        }
Example #11
0
        protected void RenderAttributes(XElement source, XElement target, ApiChanges changes)
        {
            var srcObsolete = source.GetObsoleteMessage();
            var tgtObsolete = target.GetObsoleteMessage();

            if (srcObsolete == tgtObsolete)
            {
                return;                 // nothing changed
            }
            if (srcObsolete == null)
            {
                if (tgtObsolete == null)
                {
                    return;                     // neither is obsolete
                }
                var change = new ApiChange();
                change.Header = "Obsoleted " + GroupName;
                if (State.Colorize)
                {
                    change.Append("<span style='color:gray'>");
                }
                change.Append("[Obsolete (");
                if (tgtObsolete != string.Empty)
                {
                    change.Append("\"").Append(tgtObsolete).Append("\"");
                }
                change.Append(")]\n");
                change.Append(GetDescription(target));
                if (State.Colorize)
                {
                    change.Append("</span>");
                }
                change.AnyChange = true;
                changes.Add(source, target, change);
            }
            else if (tgtObsolete == null)
            {
                // Made non-obsolete. Do we care to report this?
            }
            else
            {
                // Obsolete message changed. Do we care to report this?
            }
        }
Example #12
0
        public override bool Equals(XElement source, XElement target, ApiChanges changes)
        {
            if (base.Equals(source, target, changes))
            {
                return(true);
            }

            var change = new ApiChange(GetDescription(source));

            change.Header = "Modified " + GroupName;
            RenderMethodAttributes(source, target, change);
            RenderReturnType(source, target, change);
            RenderName(source, target, change);
            RenderGenericParameters(source, target, change);
            RenderParameters(source, target, change);

            changes.Add(source, target, change);

            return(false);
        }
Example #13
0
 void Modify(ApiChanges modified)
 {
     foreach (var changes in modified)
     {
         if (State.IgnoreNonbreaking && changes.Value.All(c => !c.Breaking))
         {
             continue;
         }
         Formatter.BeginMemberModification(Output, changes.Key);
         foreach (var element in changes.Value)
         {
             if (State.IgnoreNonbreaking && !element.Breaking)
             {
                 continue;
             }
             Formatter.Diff(Output, element);
         }
         Formatter.EndMemberModification(Output);
     }
 }
Example #14
0
        protected void RenderAttributes(XElement source, XElement target, ApiChanges changes)
        {
            var srcObsolete = source.GetObsoleteMessage();
            var tgtObsolete = target.GetObsoleteMessage();

            if (srcObsolete == tgtObsolete)
            {
                return;                 // nothing changed
            }
            if (srcObsolete == null)
            {
                if (tgtObsolete == null)
                {
                    return;                     // neither is obsolete
                }
                var change = new ApiChange(GetDescription(source));
                change.Header = "Obsoleted " + GroupName;
                change.Append(string.Format("<span class='obsolete obsolete-{0}' data-is-non-breaking>", ElementName));
                change.Append("[Obsolete (");
                if (tgtObsolete != string.Empty)
                {
                    change.Append("\"").Append(tgtObsolete).Append("\"");
                }
                change.Append(")]\n");
                change.Append(GetDescription(target));
                change.Append("</span>");
                change.AnyChange = true;
                changes.Add(source, target, change);
            }
            else if (tgtObsolete == null)
            {
                // Made non-obsolete. Do we care to report this?
            }
            else
            {
                // Obsolete message changed. Do we care to report this?
            }
        }
Example #15
0
        public override bool Equals(XElement source, XElement target, ApiChanges changes)
        {
            if (base.Equals(source, target, changes))
            {
                return(true);
            }

            var name     = source.GetAttribute("name");
            var srcValue = source.GetAttribute("value");
            var tgtValue = target.GetAttribute("value");
            var change   = new ApiChange();

            change.Header = "Modified " + GroupName;

            if (State.BaseType == "System.Enum")
            {
                change.Append(name).Append(" = ");
                if (srcValue != tgtValue)
                {
                    change.AppendModified(srcValue, tgtValue, true);
                }
                else
                {
                    change.Append(srcValue);
                }
            }
            else
            {
                RenderFieldAttributes(source.GetFieldAttributes(), target.GetFieldAttributes(), change);

                var srcType = source.GetTypeName("fieldtype");
                var tgtType = target.GetTypeName("fieldtype");

                if (srcType != tgtType)
                {
                    change.AppendModified(srcType, tgtType, true);
                }
                else
                {
                    change.Append(srcType);
                }
                change.Append(" ");
                change.Append(name);

                if (srcType == "string" && srcValue != null)
                {
                    srcValue = "\"" + srcValue + "\"";
                }

                if (tgtType == "string" && tgtValue != null)
                {
                    tgtValue = "\"" + tgtValue + "\"";
                }

                if (srcValue != tgtValue)
                {
                    change.Append(" = ");
                    if (srcValue == null)
                    {
                        srcValue = "null";
                    }
                    if (tgtValue == null)
                    {
                        tgtValue = "null";
                    }
                    change.AppendModified(srcValue, tgtValue, true);
                }
                else if (srcValue != null)
                {
                    change.Append(" = ");
                    change.Append(srcValue);
                }
                change.Append(";");
            }

            changes.Add(source, target, change);

            return(false);
        }
Example #16
0
 public virtual bool Equals(XElement source, XElement target, ApiChanges changes)
 {
     return(XNode.DeepEquals(source, target));
 }
Example #17
0
 public abstract void Modified(XElement source, XElement target, ApiChanges changes);
Example #18
0
 public override void Modified(XElement source, XElement target, ApiChanges change)
 {
 }