public virtual Differences VisitFunctionDeclaration(FunctionDeclaration functionDeclaration1, FunctionDeclaration functionDeclaration2){ Differences differences = new Differences(functionDeclaration1, functionDeclaration2); if (functionDeclaration1 == null || functionDeclaration2 == null){ if (functionDeclaration1 != functionDeclaration2) differences.NumberOfDifferences++; else differences.NumberOfSimilarities++; return differences; } FunctionDeclaration changes = (FunctionDeclaration)functionDeclaration2.Clone(); FunctionDeclaration deletions = (FunctionDeclaration)functionDeclaration2.Clone(); FunctionDeclaration insertions = (FunctionDeclaration)functionDeclaration2.Clone(); Differences diff = this.VisitBlock(functionDeclaration1.Body, functionDeclaration2.Body); if (diff == null){Debug.Assert(false); return differences;} changes.Body = diff.Changes as Block; deletions.Body = diff.Deletions as Block; insertions.Body = diff.Insertions as Block; Debug.Assert(diff.Changes == changes.Body && diff.Deletions == deletions.Body && diff.Insertions == insertions.Body); differences.NumberOfDifferences += diff.NumberOfDifferences; differences.NumberOfSimilarities += diff.NumberOfSimilarities; diff = this.VisitIdentifier(functionDeclaration1.Name, functionDeclaration2.Name); if (diff == null){Debug.Assert(false); return differences;} changes.Name = diff.Changes as Identifier; deletions.Name = diff.Deletions as Identifier; insertions.Name = diff.Insertions as Identifier; Debug.Assert(diff.Changes == changes.Name && diff.Deletions == deletions.Name && diff.Insertions == insertions.Name); differences.NumberOfDifferences += diff.NumberOfDifferences; differences.NumberOfSimilarities += diff.NumberOfSimilarities; ParameterList parChanges, parDeletions, parInsertions; diff = this.VisitParameterList(functionDeclaration1.Parameters, functionDeclaration2.Parameters, out parChanges, out parDeletions, out parInsertions); if (diff == null){Debug.Assert(false); return differences;} changes.Parameters = parChanges; deletions.Parameters = parDeletions; insertions.Parameters = parInsertions; differences.NumberOfDifferences += diff.NumberOfDifferences; differences.NumberOfSimilarities += diff.NumberOfSimilarities; diff = this.VisitTypeNode(functionDeclaration1.ReturnType, functionDeclaration2.ReturnType); if (diff == null){Debug.Assert(false); return differences;} changes.ReturnType = diff.Changes as TypeNode; deletions.ReturnType = diff.Deletions as TypeNode; insertions.ReturnType = diff.Insertions as TypeNode; //Debug.Assert(diff.Changes == changes.ReturnType && diff.Deletions == deletions.ReturnType && diff.Insertions == insertions.ReturnType); differences.NumberOfDifferences += diff.NumberOfDifferences; differences.NumberOfSimilarities += diff.NumberOfSimilarities; 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 Statement VisitFunctionDeclaration(FunctionDeclaration functionDeclaration) { if (functionDeclaration == null) return null; return base.VisitFunctionDeclaration((FunctionDeclaration)functionDeclaration.Clone()); }