public SourceLocation Translate(SourceLocation loc, int fromVersion, int toVersion) { var snapVer = _snapshots.Peek().Version; var fromVer = snapVer; while (fromVer.Next != null && fromVer.VersionNumber < fromVersion) { fromVer = fromVer.Next; } var toVer = toVersion > fromVersion ? fromVer : snapVer; while (toVer.Next != null && toVer.VersionNumber < toVersion) { toVer = toVer.Next; } var fromLines = GetLineLocations(fromVer.VersionNumber); var index = NewLineLocation.LocationToIndex(fromLines, loc, fromVer.Length); if (fromVer.VersionNumber < toVer.VersionNumber) { index = Tracking.TrackPositionForwardInTime(PointTrackingMode.Negative, index, fromVer, toVer); } else { index = Tracking.TrackPositionBackwardInTime(PointTrackingMode.Negative, index, fromVer, toVer); } var toLines = GetLineLocations(toVer.VersionNumber); return(NewLineLocation.IndexToLocation(toLines, index)); }
public void Update(IEnumerable <DocumentChange> changes) { lock (_lock) { _sb = _sb ?? new StringBuilder(_content); foreach (var change in changes) { // Every change may change where the lines end so in order // to correctly determine line/offsets we must re-split buffer // into lines after each change. var lineLoc = GetNewLineLocations().ToArray(); if (change.ReplaceAllText) { _sb = new StringBuilder(change.InsertedText); continue; } var start = NewLineLocation.LocationToIndex(lineLoc, change.ReplacedSpan.Start, _sb.Length); var end = NewLineLocation.LocationToIndex(lineLoc, change.ReplacedSpan.End, _sb.Length); if (end > start) { _sb.Remove(start, end - start); } if (!string.IsNullOrEmpty(change.InsertedText)) { _sb.Insert(start, change.InsertedText); } } Version++; _content = null; } }
public void Update(IEnumerable <DocumentChange> changes) { _sb = _sb ?? new StringBuilder(_content); _content = null; var lastStart = int.MaxValue; var lineLoc = SplitLines(_sb).ToArray(); foreach (var change in changes) { var start = NewLineLocation.LocationToIndex(lineLoc, change.ReplacedSpan.Start, _sb.Length); if (start > lastStart) { throw new InvalidOperationException("changes must be in reverse order of start location"); } lastStart = start; var end = NewLineLocation.LocationToIndex(lineLoc, change.ReplacedSpan.End, _sb.Length); if (end > start) { _sb.Remove(start, end - start); } if (!string.IsNullOrEmpty(change.InsertedText)) { _sb.Insert(start, change.InsertedText); } } Version++; }
public void Update(DocumentChangeSet set) { Check.InvalidOperation(() => _ownerThreadId == Thread.CurrentThread.ManagedThreadId, "Document buffer update must be done from the thread that created it"); if (!set.Changes.Any(c => c.WholeBuffer)) { if (Version >= 0) { if (set.FromVersion < Version) { return; } if (set.FromVersion > Version) { throw new InvalidOperationException("missing prior versions"); } } if (set.FromVersion >= set.ToVersion) { throw new InvalidOperationException("cannot reduce version without resetting buffer"); } } var lastStart = int.MaxValue; var lineLoc = SplitLines(_sb).ToArray(); foreach (var change in set.Changes) { if (change.WholeBuffer) { _sb.Clear(); if (!string.IsNullOrEmpty(change.InsertedText)) { _sb.Append(change.InsertedText); } continue; } var start = NewLineLocation.LocationToIndex(lineLoc, change.ReplacedSpan.Start, _sb.Length); if (start > lastStart) { throw new InvalidOperationException("changes must be in reverse order of start location"); } lastStart = start; var end = NewLineLocation.LocationToIndex(lineLoc, change.ReplacedSpan.End, _sb.Length); if (end > start) { _sb.Remove(start, end - start); } if (!string.IsNullOrEmpty(change.InsertedText)) { _sb.Insert(start, change.InsertedText); } } Version = set.ToVersion; }
public void Update(DocumentChangeSet changes) { if (!changes.Changes.Any(c => c.WholeBuffer)) { if (Version >= 0) { if (changes.FromVersion < Version) { return; } else if (changes.FromVersion > Version) { throw new InvalidOperationException("missing prior versions"); } } if (changes.FromVersion >= changes.ToVersion) { throw new InvalidOperationException("cannot reduce version without resetting buffer"); } } int lastStart = int.MaxValue; var lineLoc = SplitLines(Text).ToArray(); foreach (var change in changes.Changes) { if (change.WholeBuffer) { Text.Clear(); if (!string.IsNullOrEmpty(change.InsertedText)) { Text.Append(change.InsertedText); } continue; } int start = NewLineLocation.LocationToIndex(lineLoc, change.ReplacedSpan.Start, Text.Length); if (start > lastStart) { throw new InvalidOperationException("changes must be in reverse order of start location"); } lastStart = start; int end = NewLineLocation.LocationToIndex(lineLoc, change.ReplacedSpan.End, Text.Length); if (end > start) { Text.Remove(start, end - start); } if (!string.IsNullOrEmpty(change.InsertedText)) { Text.Insert(start, change.InsertedText); } } Version = changes.ToVersion; }
public void Update(IEnumerable <DocumentChange> changes) { lock (_lock) { Check.InvalidOperation(_initialized, "Buffer is not initialized."); if (_cleared) { return; // User may try and edit library file where we have already dropped the content. } _sb = _sb ?? new StringBuilder(_content); foreach (var change in changes) { // Every change may change where the lines end so in order // to correctly determine line/offsets we must re-split buffer // into lines after each change. var lineLoc = GetNewLineLocations().ToArray(); if (change.ReplaceAllText) { _sb = new StringBuilder(change.InsertedText); continue; } var start = NewLineLocation.LocationToIndex(lineLoc, change.ReplacedSpan.Start, _sb.Length); var end = NewLineLocation.LocationToIndex(lineLoc, change.ReplacedSpan.End, _sb.Length); if (end > start) { _sb.Remove(start, end - start); } if (!string.IsNullOrEmpty(change.InsertedText)) { _sb.Insert(start, change.InsertedText); } } Version++; _content = null; } }
public int LocationToIndex(SourceLocation location) { return(NewLineLocation.LocationToIndex(_lineLocations, location, EndIndex)); }
public int GetIndex(SourceLocation loc, int atVersion) { var lines = GetLineLocations(atVersion); return(NewLineLocation.LocationToIndex(lines, loc, -1)); }
public override int LocationToIndex(SourceLocation location) => NewLineLocation.LocationToIndex(_newLines, location, _fileSize);
public int LocationToIndex(SourceLocation location) => NewLineLocation.LocationToIndex(NewLineLocations, location, EndIndex);
internal int LocationToIndex(SourceLocation location) { return(NewLineLocation.LocationToIndex(_lineLocations, location)); }