Skip to content

Commit 565c6f8

Browse files
committed
Changed parent node type.
Added default handler for custon node converter.
1 parent bdcc908 commit 565c6f8

4 files changed

Lines changed: 23 additions & 17 deletions

File tree

ReClass.NET/DataExchange/ReClass/CustomNodeConverter.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
namespace ReClassNET.DataExchange.ReClass
1010
{
11+
public delegate BaseNode CreateNodeFromElementHandler(XElement element, ClassNode parent, ILogger logger);
12+
public delegate XElement CreateElementFromNodeHandler(BaseNode node, ILogger logger);
13+
1114
[ContractClass(typeof(CustomNodeConverterContract))]
1215
public interface ICustomNodeConverter
1316
{
@@ -26,15 +29,17 @@ public interface ICustomNodeConverter
2629
/// <param name="parent">The parent of the node.</param>
2730
/// <param name="classes">The list of classes which correspond to the node.</param>
2831
/// <param name="logger">The logger used to output messages.</param>
32+
/// <param name="defaultHandler">The default method which creates a node from an element. Should be called to resolve nodes for wrapped inner nodes.</param>
2933
/// <param name="node">[out] The node for the xml element.</param>
3034
/// <returns>True if a node was created, otherwise false.</returns>
31-
bool TryCreateNodeFromElement(XElement element, ClassNode parent, IEnumerable<ClassNode> classes, ILogger logger, out BaseNode node);
35+
bool TryCreateNodeFromElement(XElement element, BaseNode parent, IEnumerable<ClassNode> classes, ILogger logger, CreateNodeFromElementHandler defaultHandler, out BaseNode node);
3236

3337
/// <summary>Creates a xml element from the node. This method gets only called if <see cref="CanHandleNode(BaseNode)"/> returned true.</summary>
3438
/// <param name="node">The node to create the xml element from.</param>
3539
/// <param name="logger">The logger used to output messages.</param>
40+
/// <param name="defaultHandler">The default method which creates an element for a node. Should be called to resolve elements for wrapped inner nodes.</param>
3641
/// <returns>The xml element for the node.</returns>
37-
XElement CreateElementFromNode(BaseNode node, ILogger logger);
42+
XElement CreateElementFromNode(BaseNode node, ILogger logger, CreateElementFromNodeHandler defaultHandler);
3843
}
3944

4045
[ContractClassFor(typeof(ICustomNodeConverter))]
@@ -54,23 +59,25 @@ public bool CanHandleNode(BaseNode node)
5459
throw new NotImplementedException();
5560
}
5661

57-
public bool TryCreateNodeFromElement(XElement element, ClassNode parent, IEnumerable<ClassNode> classes, ILogger logger, out BaseNode node)
62+
public bool TryCreateNodeFromElement(XElement element, BaseNode parent, IEnumerable<ClassNode> classes, ILogger logger, CreateNodeFromElementHandler defaultHandler, out BaseNode node)
5863
{
5964
Contract.Requires(element != null);
6065
Contract.Requires(CanHandleElement(element));
6166
Contract.Requires(parent != null);
6267
Contract.Requires(classes != null);
6368
Contract.Requires(Contract.ForAll(classes, c => c != null));
6469
Contract.Requires(logger != null);
70+
Contract.Requires(defaultHandler != null);
6571

6672
throw new NotImplementedException();
6773
}
6874

69-
public XElement CreateElementFromNode(BaseNode node, ILogger logger)
75+
public XElement CreateElementFromNode(BaseNode node, ILogger logger, CreateElementFromNodeHandler defaultHandler)
7076
{
7177
Contract.Requires(node != null);
7278
Contract.Requires(CanHandleNode(node));
7379
Contract.Requires(logger != null);
80+
Contract.Requires(defaultHandler != null);
7481
Contract.Ensures(Contract.Result<XElement>() != null);
7582

7683
throw new NotImplementedException();

ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.Diagnostics.Contracts;
44
using System.IO;
@@ -97,28 +97,27 @@ public void Load(Stream input, ILogger logger)
9797
}
9898
}
9999

100-
private IEnumerable<BaseNode> ReadNodeElements(IEnumerable<XElement> elements, ClassNode parent, ILogger logger)
100+
private IEnumerable<BaseNode> ReadNodeElements(IEnumerable<XElement> elements, BaseNode parent, ILogger logger)
101101
{
102102
Contract.Requires(elements != null);
103103
Contract.Requires(Contract.ForAll(elements, e => e != null));
104104
Contract.Requires(logger != null);
105105

106106
foreach (var element in elements)
107107
{
108-
yield return ReadNodeElement(element, parent, logger);
108+
yield return CreateNodeFromElement(element, parent, logger);
109109
}
110110
}
111111

112-
private BaseNode ReadNodeElement(XElement element, ClassNode parent, ILogger logger)
112+
private BaseNode CreateNodeFromElement(XElement element, BaseNode parent, ILogger logger)
113113
{
114114
Contract.Requires(element != null);
115115
Contract.Requires(logger != null);
116116

117117
var converter = CustomNodeConvert.GetReadConverter(element);
118118
if (converter != null)
119119
{
120-
// TODO 5
121-
if (converter.TryCreateNodeFromElement(element, parent, project.Classes, logger, out var customNode))
120+
if (converter.TryCreateNodeFromElement(element, parent, project.Classes, logger, CreateNodeFromElement, out var customNode))
122121
{
123122
return customNode;
124123
}
@@ -140,6 +139,8 @@ private BaseNode ReadNodeElement(XElement element, ClassNode parent, ILogger log
140139
return null;
141140
}
142141

142+
node.ParentNode = parent;
143+
143144
node.Name = element.Attribute(XmlNameAttribute)?.Value ?? string.Empty;
144145
node.Comment = element.Attribute(XmlCommentAttribute)?.Value ?? string.Empty;
145146
node.IsHidden = bool.TryParse(element.Attribute(XmlHiddenAttribute)?.Value, out var val) && val;
@@ -167,7 +168,7 @@ private BaseNode ReadNodeElement(XElement element, ClassNode parent, ILogger log
167168
var innerElement = element.Elements().FirstOrDefault();
168169
if (innerElement != null)
169170
{
170-
innerNode = ReadNodeElement(innerElement, null, logger);
171+
innerNode = CreateNodeFromElement(innerElement, node, logger);
171172
}
172173
}
173174

ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,24 +69,23 @@ private static IEnumerable<XElement> CreateNodeElements(IEnumerable<BaseNode> no
6969

7070
foreach (var node in nodes)
7171
{
72-
var element = CreateNodeElement(node, logger);
72+
var element = CreateElementFromNode(node, logger);
7373
if (element != null)
7474
{
7575
yield return element;
7676
}
7777
}
7878
}
7979

80-
private static XElement CreateNodeElement(BaseNode node, ILogger logger)
80+
private static XElement CreateElementFromNode(BaseNode node, ILogger logger)
8181
{
8282
Contract.Requires(node != null);
8383
Contract.Requires(logger != null);
8484

8585
var converter = CustomNodeConvert.GetWriteConverter(node);
8686
if (converter != null)
8787
{
88-
// TODO 5
89-
return converter.CreateElementFromNode(node, logger);
88+
return converter.CreateElementFromNode(node, logger, CreateElementFromNode);
9089
}
9190

9291
if (!buildInTypeToStringMap.TryGetValue(node.GetType(), out var typeString))
@@ -113,7 +112,7 @@ private static XElement CreateNodeElement(BaseNode node, ILogger logger)
113112
}
114113
else if (wrapperNode.InnerNode != null)
115114
{
116-
element.Add(CreateNodeElement(wrapperNode.InnerNode, logger));
115+
element.Add(CreateElementFromNode(wrapperNode.InnerNode, logger));
117116
}
118117
}
119118

TODO.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
1 BaseWrapperNode CodeGenerator
22
3 NodeTypesBuilder Plugin support
3-
5 Custom data exchange needs access to the build in node handling for wrapped nodes
43
6 Should BaseContainerNode be rebuild?

0 commit comments

Comments
 (0)