public string GetOldText(Span span) { if (span.End > this.OldLength) { throw new ArgumentOutOfRangeException(nameof(span)); } return(_oldText.Substring(span)); }
private static IList <TextChange> GetChangesFromDifferenceCollection(ref int delta, TextChange originalChange, ChangeString oldText, ChangeString newText, IHierarchicalDifferenceCollection diffCollection, int leftOffset = 0, int rightOffset = 0) { List <TextChange> changes = new List <TextChange>(); for (int i = 0; i < diffCollection.Differences.Count; i++) { Difference currentDiff = diffCollection.Differences[i]; Span leftDiffSpan = Translate(diffCollection.LeftDecomposition.GetSpanInOriginal(currentDiff.Left), leftOffset); Span rightDiffSpan = Translate(diffCollection.RightDecomposition.GetSpanInOriginal(currentDiff.Right), rightOffset); // TODO: Since this evaluates differences lazily, we should add something here to *not* compute the next // level of differences if we think it would be too expensive. IHierarchicalDifferenceCollection nextLevelDiffs = diffCollection.GetContainedDifferences(i); if (nextLevelDiffs != null) { changes.AddRange(GetChangesFromDifferenceCollection(ref delta, originalChange, oldText, newText, nextLevelDiffs, leftDiffSpan.Start, rightDiffSpan.Start)); } else { TextChange minimalChange = new TextChange(originalChange.OldPosition + leftDiffSpan.Start, oldText.Substring(leftDiffSpan), newText.Substring(rightDiffSpan), ComputeBoundaryConditions(originalChange, oldText, leftDiffSpan)); minimalChange.NewPosition = originalChange.NewPosition + rightDiffSpan.Start; if (minimalChange.OldLength > 0 && minimalChange.NewLength > 0) { minimalChange.IsOpaque = true; } delta += minimalChange.Delta; changes.Add(minimalChange); } } return(changes); }