Ejemplo n.º 1
0
        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);
        }