public static List <IMergeResultBlock> Diff3Merge(string[] a, string[] o, string[] b, bool excludeFalseConflicts) { // Applies the output of Diff.diff3_merge_indices to actually // construct the merged file; the returned result alternates // between "ok" and "conflict" blocks. var result = new List <IMergeResultBlock>(); var files = new Dictionary <Side, string[]> { { Side.Left, a }, { Side.Old, o }, { Side.Right, b } }; var indices = Diff.Diff3MergeIndices(a, o, b); var okLines = new List <string>(); for (var i = 0; i < indices.Count; i++) { var x = indices[i]; var side = x.Side; if (side == Side.Conflict) { if (excludeFalseConflicts && !IsTrueConflict(x, a, b)) { okLines.AddRange(files[0].SliceJS(x.Offset, x.Offset + x.Length)); } else { FlushOk(okLines, result); result.Add(new MergeConflictResultBlock { LeftLines = a.SliceJS(x.Offset, x.Offset + x.Length), LeftIndex = x.Offset, OldLines = o.SliceJS(x.ConflictOldOffset, x.ConflictOldOffset + x.ConflictOldLength), OldIndex = x.ConflictOldOffset, RightLines = b.SliceJS(x.ConflictRightOffset, x.ConflictRightOffset + x.ConflictRightLength), RightIndex = x.Offset }); } } else { okLines.AddRange(files[side].SliceJS(x.Offset, x.Offset + x.Length)); } } FlushOk(okLines, result); return(result); }