private DataMatch MatchInternal(DataVisitNode node1, DataVisitNode node2) { // Check if nodes are null if ((ReferenceEquals(node1, null) || ReferenceEquals(node2, null) || node1.GetType() != node2.GetType())) { return(node1 == node2 ? DataMatch.Empty : UnMatched(node1, node2)); } var match = new DataMatch(); if (node1 is DataVisitRootNode) { if (node1.Instance == null || node2.Instance == null || node1.Instance.GetType() != node2.Instance.GetType()) { return(ReferenceEquals(node1.Instance, node2.Instance) ? DataMatch.MatchOne : UnMatched(node1, node2)); } } else if (node1 is DataVisitMember) { match += MatchValue(node1, ((DataVisitMember)node1).Value, node2, ((DataVisitMember)node2).Value); } else if (node1 is DataVisitListItem) { match += MatchValue(node1, ((DataVisitListItem)node1).Item, node2, ((DataVisitListItem)node2).Item); } match += MatchValues(node1, node1.Members, node2, node2.Members, true); match += MatchValues(node1, node1.Items, node2, node2.Items, false); return(match); }
private Diff3Node DiffNode(DataVisitNode baseNode, DataVisitNode asset1Node, DataVisitNode asset2Node) { var diff3 = new Diff3Node(baseNode, asset1Node, asset2Node); var baseNodeDesc = GetNodeDescription(baseNode); var asset1NodeDesc = GetNodeDescription(asset1Node); var asset2NodeDesc = GetNodeDescription(asset2Node); bool hasMembers = false; Type type = null; Type nodeType = null; if (baseNodeDesc.Type != null) { type = baseNodeDesc.Type; hasMembers = baseNode.HasMembers; nodeType = baseNode.GetType(); } if (asset1NodeDesc.Type != null) { if (type == null) { type = asset1NodeDesc.Type; hasMembers = asset1Node.HasMembers; nodeType = asset1Node.GetType(); } else { if (nodeType != asset1Node.GetType()) { diff3.ChangeType = Diff3ChangeType.InvalidNodeType; return(diff3); } if (type != asset1NodeDesc.Type) { diff3.ChangeType = Diff3ChangeType.ConflictType; return(diff3); } } } if (asset2NodeDesc.Type != null) { if (type == null) { type = asset2NodeDesc.Type; hasMembers = asset2Node.HasMembers; } else { if (nodeType != asset2Node.GetType()) { diff3.ChangeType = Diff3ChangeType.InvalidNodeType; return(diff3); } if (type != asset2NodeDesc.Type) { diff3.ChangeType = Diff3ChangeType.ConflictType; return(diff3); } } } if (type == null) { return(diff3); } diff3.InstanceType = type; // A comparable type doesn't have any members, is not a collection or dictionary or array. bool isComparableType = !hasMembers && !CollectionDescriptor.IsCollection(type) && !DictionaryDescriptor.IsDictionary(type) && !type.IsArray; if (isComparableType) { DiffValue(diff3, ref baseNodeDesc, ref asset1NodeDesc, ref asset2NodeDesc); return(diff3); } // Diff members DiffMembers(diff3, baseNode, asset1Node, asset2Node); if (DictionaryDescriptor.IsDictionary(type)) { DiffDictionary(diff3, baseNode, asset1Node, asset2Node); } else if (CollectionDescriptor.IsCollection(type)) { DiffCollection(diff3, baseNode, asset1Node, asset2Node); } else if (type.IsArray) { DiffArray(diff3, baseNode, asset1Node, asset2Node); } return(diff3); }