public static void WriteNodes(Stream output, IEnumerable <BaseNode> nodes, ILogger logger) { Contract.Requires(output != null); Contract.Requires(nodes != null); Contract.Requires(Contract.ForAll(nodes, n => n != null)); Contract.Requires(logger != null); using (var project = new ReClassNetProject()) { Action <BaseReferenceNode> recursiveAddReferences = null; recursiveAddReferences = delegate(BaseReferenceNode referenceNode) { if (project.ContainsClass(referenceNode.InnerNode.Uuid)) { return; } project.AddClass(referenceNode.InnerNode); foreach (var reference in referenceNode.InnerNode.Nodes.OfType <BaseReferenceNode>()) { recursiveAddReferences(reference); } }; var serialisationClass = new ClassNode(false) { Name = SerialisationClassName }; project.AddClass(serialisationClass); foreach (var node in nodes) { var classNode = node as ClassNode; if (classNode != null) { project.AddClass(classNode); continue; } var referenceNode = node as BaseReferenceNode; if (referenceNode != null) { recursiveAddReferences(referenceNode); } serialisationClass.AddNode(node); } var file = new ReClassNetFile(project); file.Save(output, logger); } }
public static void SerializeNodesToStream(Stream output, IEnumerable <BaseNode> nodes, ILogger logger) { Contract.Requires(output != null); Contract.Requires(nodes != null); Contract.Requires(Contract.ForAll(nodes, n => n != null)); Contract.Requires(logger != null); using var project = new ReClassNetProject(); void RecursiveAddClasses(BaseNode node) { ClassNode classNode = null; switch (node) { case ClassNode c1: classNode = c1; break; case BaseWrapperNode wrapperNode when wrapperNode.ResolveMostInnerNode() is ClassNode c2: classNode = c2; break; } if (classNode == null || project.ContainsClass(classNode.Uuid)) { return; } project.AddClass(classNode); foreach (var wrapperNodeChild in classNode.Nodes.OfType <BaseWrapperNode>()) { RecursiveAddClasses(wrapperNodeChild); } } var serialisationClass = new ClassNode(false) { Name = SerializationClassName }; var needsSerialisationClass = true; foreach (var node in nodes) { RecursiveAddClasses(node); if (!(node is ClassNode)) { if (needsSerialisationClass) { needsSerialisationClass = false; project.AddClass(serialisationClass); } serialisationClass.AddNode(node); } } var file = new ReClassNetFile(project); file.Save(output, logger); }