4 using System.Collections.Generic;
6 using SiliconStudio.Assets.Visitors;
8 namespace SiliconStudio.Assets.Diff
12 private static readonly Func<Diff3Node, bool> StaticCheckVisitChildren = CheckVisitChildren;
13 private static readonly Func<Diff3Node, bool> StaticCheckVisitNode = CheckVisitNode;
22 Asset1Node = asset1Node;
23 Asset2Node = asset2Node;
40 public Type InstanceType {
get; set; }
44 return this.Children(StaticCheckVisitNode, StaticCheckVisitChildren);
47 private static bool CheckVisitChildren(
Diff3Node diff3)
49 return diff3.ChangeType == Diff3ChangeType.Children || diff3.ChangeType != Diff3ChangeType.None;
52 private static bool CheckVisitNode(Diff3Node diff3)
54 return diff3.ChangeType != Diff3ChangeType.Children;
57 public bool HasConflict
61 return ChangeType >= Diff3ChangeType.Conflict;
69 public bool HasMembers
73 return Members != null;
89 public List<Diff3Node> Members {
get; set; }
91 public List<Diff3Node> Items {
get; set; }
99 public void ReplaceValue(
object dataInstance, Func<Diff3Node, DataVisitNode> selector,
bool isRemoved)
101 if (selector == null)
throw new ArgumentNullException(
"selector");
102 var node = this.Asset1Node ?? this.BaseNode ?? this.Asset2Node;
104 var dataNode = selector(
this);
105 var parentNode = Parent;
109 ((DataVisitMember)dataNode).SetValue(dataInstance);
113 var descriptor = ((DataVisitListItem)node).Descriptor;
116 var listNode = (DataVisitListItem)node;
117 descriptor.RemoveAt(selector(parentNode).Instance, listNode.Index);
121 descriptor.Add(selector(parentNode).Instance, dataInstance);
126 var dictItem = (DataVisitDictionaryItem)node;
127 var descriptor = dictItem.Descriptor;
129 if (dataInstance == null)
131 descriptor.Remove(selector(parentNode).Instance, dictItem.Key);
135 descriptor.SetValue(selector(parentNode).Instance, dictItem.Key, dataInstance);
140 var arrayItem = (DataVisitArrayItem)node;
141 ((Array)selector(parentNode).Instance).SetValue(dataInstance, arrayItem.Index);
148 var text =
new StringBuilder();
149 text.Append(
"Diff = ");
150 text.Append(ChangeType);
153 text.AppendFormat(
" Members = {0}", Members.Count);
157 text.AppendFormat(
" Items = {0}", Items.Count);
160 text.AppendFormat(
" Type = {0}", InstanceType == null ?
"unknown" : InstanceType.FullName);
162 return text.ToString();
A diff element for a member (field or property) of a class.
void ReplaceValue(object dataInstance, Func< Diff3Node, DataVisitNode > selector, bool isRemoved)
Replace the value for the asset1 for this data node.
Defines an item in a list.
Diff3Node(DataVisitNode baseNode, DataVisitNode asset1Node, DataVisitNode asset2Node)
IEnumerable< Diff3Node > FindDifferences()
Base class for all items in a collection (array, list or dictionary)
Defines a dictionary item (key-value).
override string ToString()
Defines an item in an array.