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()) { void RecursiveAddReferences(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) { if (node is ClassNode classNode) { project.AddClass(classNode); continue; } if (node is BaseReferenceNode referenceNode) { 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); }