Example #1
0
        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;
        }
Example #6
0
        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;
            }
        }
Example #7
0
 public int LocationToIndex(SourceLocation location)
 {
     return(NewLineLocation.LocationToIndex(_lineLocations, location, EndIndex));
 }
Example #8
0
        public int GetIndex(SourceLocation loc, int atVersion)
        {
            var lines = GetLineLocations(atVersion);

            return(NewLineLocation.LocationToIndex(lines, loc, -1));
        }
Example #9
0
 public override int LocationToIndex(SourceLocation location) => NewLineLocation.LocationToIndex(_newLines, location, _fileSize);
 public int LocationToIndex(SourceLocation location) => NewLineLocation.LocationToIndex(NewLineLocations, location, EndIndex);
Example #11
0
 internal int LocationToIndex(SourceLocation location)
 {
     return(NewLineLocation.LocationToIndex(_lineLocations, location));
 }