public virtual Differences VisitAttributeNode(AttributeNode attribute1, AttributeNode attribute2){ Differences differences = new Differences(attribute1, attribute2); if (attribute1 == null || attribute2 == null){ if (attribute1 != attribute2) differences.NumberOfDifferences++; else differences.NumberOfSimilarities++; return differences; } AttributeNode changes = (AttributeNode)attribute2.Clone(); AttributeNode deletions = (AttributeNode)attribute2.Clone(); AttributeNode insertions = (AttributeNode)attribute2.Clone(); if (attribute1.AllowMultiple == attribute2.AllowMultiple) differences.NumberOfSimilarities++; else differences.NumberOfDifferences++; Differences diff = this.VisitExpression(attribute1.Constructor, attribute2.Constructor); if (diff == null){Debug.Assert(false); return differences;} changes.Constructor = diff.Changes as Expression; deletions.Constructor = diff.Deletions as Expression; insertions.Constructor = diff.Insertions as Expression; Debug.Assert(diff.Changes == changes.Constructor && diff.Deletions == deletions.Constructor && diff.Insertions == insertions.Constructor); differences.NumberOfDifferences += diff.NumberOfDifferences; differences.NumberOfSimilarities += diff.NumberOfSimilarities; ExpressionList exprChanges, exprDeletions, exprInsertions; diff = this.VisitExpressionList(attribute1.Expressions, attribute2.Expressions, out exprChanges, out exprDeletions, out exprInsertions); if (diff == null){Debug.Assert(false); return differences;} changes.Expressions = exprChanges; deletions.Expressions = exprDeletions; insertions.Expressions = exprInsertions; differences.NumberOfDifferences += diff.NumberOfDifferences; differences.NumberOfSimilarities += diff.NumberOfSimilarities; if (attribute1.Target == attribute2.Target) differences.NumberOfSimilarities++; else differences.NumberOfDifferences++; if (differences.NumberOfDifferences == 0){ differences.Changes = null; differences.Deletions = null; differences.Insertions = null; }else{ differences.Changes = changes; differences.Deletions = deletions; differences.Insertions = insertions; } return differences; }
public override AttributeNode VisitAttributeNode(AttributeNode attribute) { if (attribute == null) return null; return base.VisitAttributeNode((AttributeNode)attribute.Clone()); }