private List <LineChange> CreateDiff(CodeLanguage language, string input1, string input2, StringBuilder diff) { IEqualityComparer <string> eq = FunctionalExt.ValuedSwitch <CodeLanguage, IEqualityComparer <string> >(language) .Case(CodeLanguage.CSharp, () => new CSharpCodeLineEqualityComparer()) .Case(CodeLanguage.IL, () => new ILCodeLineEqualityComparer()) .GetResult(); var differ = new AlignedDiff <string>( NormalizeAndSplitCode(input1), NormalizeAndSplitCode(input2), eq, new StringSimilarityComparer(), new StringAlignmentFilter()); int line1 = 0, line2 = 0; var list = new List <LineChange>(); foreach (var change in differ.Generate()) { int startIndex = 0; switch (change.Change) { case ChangeType.Same: diff.AppendFormat("{0,4} {1,4} ", ++line1, ++line2); diff.AppendFormat(" "); diff.AppendLine(change.Element1); break; case ChangeType.Added: startIndex = diff.Length; diff.AppendFormat(" {1,4} + ", line1, ++line2); diff.AppendLine(change.Element2); list.Add(NewLineChange(LineChangeType.Add, diff, startIndex, diff.Length)); break; case ChangeType.Deleted: startIndex = diff.Length; diff.AppendFormat("{0,4} - ", ++line1, line2); diff.AppendLine(change.Element1); list.Add(NewLineChange(LineChangeType.Remove, diff, startIndex, diff.Length)); break; case ChangeType.Changed: startIndex = diff.Length; diff.AppendFormat("{0,4} ", ++line1, line2); diff.AppendFormat("(-) "); diff.AppendLine(change.Element1); list.Add(NewLineChange(LineChangeType.Remove, diff, startIndex, diff.Length)); startIndex = diff.Length; diff.AppendFormat(" {1,4} ", line1, ++line2); diff.AppendFormat("(+) "); diff.AppendLine(change.Element2); list.Add(NewLineChange(LineChangeType.Add, diff, startIndex, diff.Length)); break; } } return(list); }
private List<LineChange> CreateDiff(CodeLanguage language, string input1, string input2, StringBuilder diff) { IEqualityComparer<string> eq = FunctionalExt.ValuedSwitch<CodeLanguage, IEqualityComparer<string>>(language) .Case(CodeLanguage.CSharp, () => new CSharpCodeLineEqualityComparer()) .Case(CodeLanguage.IL, () => new ILCodeLineEqualityComparer()) .GetResult(); var differ = new AlignedDiff<string>( NormalizeAndSplitCode(input1), NormalizeAndSplitCode(input2), eq, new StringSimilarityComparer(), new StringAlignmentFilter()); int line1 = 0, line2 = 0; var list = new List<LineChange>(); foreach (var change in differ.Generate()) { int startIndex = 0; switch (change.Change) { case ChangeType.Same: diff.AppendFormat("{0,4} {1,4} ", ++line1, ++line2); diff.AppendFormat(" "); diff.AppendLine(change.Element1); break; case ChangeType.Added: startIndex = diff.Length; diff.AppendFormat(" {1,4} + ", line1, ++line2); diff.AppendLine(change.Element2); list.Add(NewLineChange(LineChangeType.Add, diff, startIndex, diff.Length)); break; case ChangeType.Deleted: startIndex = diff.Length; diff.AppendFormat("{0,4} - ", ++line1, line2); diff.AppendLine(change.Element1); list.Add(NewLineChange(LineChangeType.Remove, diff, startIndex, diff.Length)); break; case ChangeType.Changed: startIndex = diff.Length; diff.AppendFormat("{0,4} ", ++line1, line2); diff.AppendFormat("(-) "); diff.AppendLine(change.Element1); list.Add(NewLineChange(LineChangeType.Remove, diff, startIndex, diff.Length)); startIndex = diff.Length; diff.AppendFormat(" {1,4} ", line1, ++line2); diff.AppendFormat("(+) "); diff.AppendLine(change.Element2); list.Add(NewLineChange(LineChangeType.Add, diff, startIndex, diff.Length)); break; } } return list; }
static bool Compare(string input1, string input2, StringWriter diff) { string[] inputLines1 = NormalizeAndSplitCode(input1); string[] inputLines2 = NormalizeAndSplitCode(input2); var differ = new AlignedDiff <string>( inputLines1, inputLines2, new CodeLineEqualityComparer(), new StringSimilarityComparer(), new StringAlignmentFilter()); bool result = true, ignoreChange; int line1 = 0, line2 = 0; foreach (var change in differ.Generate()) { switch (change.Change) { case ChangeType.Same: diff.Write("{0,4} {1,4} ", ++line1, ++line2); diff.Write(" "); diff.WriteLine(change.Element1); break; case ChangeType.Added: diff.Write(" {1,4} ", line1, ++line2); result &= ignoreChange = ShouldIgnoreChange(change.Element2); diff.Write(ignoreChange ? " " : " + "); diff.WriteLine(change.Element2); break; case ChangeType.Deleted: diff.Write("{0,4} ", ++line1, line2); result &= ignoreChange = ShouldIgnoreChange(change.Element1); diff.Write(ignoreChange ? " " : " - "); diff.WriteLine(change.Element1); break; case ChangeType.Changed: diff.Write("{0,4} ", ++line1, line2); result = false; diff.Write("(-) "); diff.WriteLine(change.Element1); diff.Write(" {1,4} ", line1, ++line2); diff.Write("(+) "); diff.WriteLine(change.Element2); break; } } return(result); }