internal ITextSnapshot AdvanceToCurrentSnapshot() { //We don't need to take a snapshot of the results because the results are only modified on this thread. ITextSnapshot oldSnapshot = _results.Snapshot; ITextSnapshot newSnapshot = _buffer.CurrentSnapshot; if (oldSnapshot != newSnapshot) { //The results are all on an old snapshot. We need to project them forward (even though that might cause some stale and incorrect //results). NormalizedSpanCollection newMatches = TextSearchNavigator.TranslateTo(oldSnapshot, _results.Matches, newSnapshot); NormalizedSpanCollection newSearchedSpans = NormalizedSpanCollection.Empty; if ((_results.SearchedSpans.Count != 0) && !_options.HasFlag(FindOptions.Multiline)) { //Advance our record of the spans that have already been searched to the new snapshot as well. newSearchedSpans = BackgroundSearch <T> .TranslateToAndExtend(oldSnapshot, _results.SearchedSpans, newSnapshot); //But remove anything on a TextSnapshotLine that was modified by the change. List <Span> changedSpansOnNewSnapshot = new List <Span>(); ITextVersion version = oldSnapshot.Version; while (version != newSnapshot.Version) { foreach (var change in version.Changes) { changedSpansOnNewSnapshot.Add(BackgroundSearch <T> .Extend(newSnapshot, Tracking.TrackSpanForwardInTime(SpanTrackingMode.EdgeInclusive, change.NewSpan, version.Next, newSnapshot.Version))); } version = version.Next; } if (changedSpansOnNewSnapshot.Count > 0) { NormalizedSpanCollection changes = new NormalizedSpanCollection(changedSpansOnNewSnapshot); //Remove the spans touched by changes from the spans we've searched newSearchedSpans = NormalizedSpanCollection.Difference(newSearchedSpans, changes); } } _results = new SearchResults(newSnapshot, newMatches, newSearchedSpans); } return(newSnapshot); }
public static NormalizedSpanCollection TranslateToAndExtend(ITextSnapshot currentSnapshot, NormalizedSpanCollection currentSpans, ITextSnapshot targetSnapshot) { if (currentSpans.Count == 0) { return(currentSpans); } List <Span> spans = new List <Span>(currentSpans.Count); foreach (var s in currentSpans) { spans.Add(BackgroundSearch <T> .Extend(targetSnapshot, Tracking.TrackSpanForwardInTime(SpanTrackingMode.EdgeNegative, s, currentSnapshot.Version, targetSnapshot.Version))); } return(new NormalizedSpanCollection(spans)); }