diff --git a/src/Components/Ignitor/src/ComponentNode.cs b/src/Components/Ignitor/src/ComponentNode.cs index a6829bb307..f10a75b0ba 100644 --- a/src/Components/Ignitor/src/ComponentNode.cs +++ b/src/Components/Ignitor/src/ComponentNode.cs @@ -11,5 +11,7 @@ namespace Ignitor { _componentId = componentId; } + + public int ComponentId => _componentId; } } diff --git a/src/Components/Ignitor/src/Node.cs b/src/Components/Ignitor/src/Node.cs index 04b2559333..8ce08e8463 100644 --- a/src/Components/Ignitor/src/Node.cs +++ b/src/Components/Ignitor/src/Node.cs @@ -3,11 +3,16 @@ #nullable enable +using System.Diagnostics; + namespace Ignitor { + [DebuggerDisplay("{SerializedValue}")] public abstract class Node { public virtual ContainerNode? Parent { get; set; } + + public string SerializedValue => NodeSerializer.Serialize(this); } } diff --git a/src/Components/Ignitor/src/NodeSerializer.cs b/src/Components/Ignitor/src/NodeSerializer.cs index 4d5919ce94..814635f6d5 100644 --- a/src/Components/Ignitor/src/NodeSerializer.cs +++ b/src/Components/Ignitor/src/NodeSerializer.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.IO; #nullable enable @@ -20,11 +21,22 @@ namespace Ignitor } } + public static string Serialize(Node node) + { + using (var writer = new StringWriter()) + { + var serializer = new Serializer(writer); + serializer.Serialize(node); + return writer.ToString(); + } + } + private class Serializer { private readonly TextWriter _writer; private int _depth; private bool _atStartOfLine; + private HashSet _visited = new HashSet(); public Serializer(TextWriter writer) { @@ -35,14 +47,25 @@ namespace Ignitor { foreach (var kvp in hive.Components) { - SerializeComponent(kvp.Key, kvp.Value); + Serialize(kvp.Value); } } - private void Serialize(Node node) + public void Serialize(Node node) { + if (!_visited.Add(node)) + { + // This is a child component of a previously seen component. Don't repeat it + return; + } + switch (node) { + case ComponentNode componentNode: + { + SerializeComponent(componentNode); + break; + } case ElementNode elementNode: { SerializeElement(elementNode); @@ -155,10 +178,10 @@ namespace Ignitor } } - private void SerializeComponent(int id, ComponentNode component) + private void SerializeComponent(ComponentNode component) { Write("[Component ( "); - Write(id.ToString()); + Write(component.ComponentId.ToString()); WriteLine(" )]"); _depth++; SerializeChildren(component);