Exemple #1
0
        public ITextSnapshot Apply()
        {
            var text    = new StringBuilder(_snapshot.GetText());
            var changes = new List <MockTextChange>();

            // Apply changes
            foreach (var edit in _edits.OrderByDescending(e => e.Position).ThenByDescending(e => e, EditTypeComparer.Instance))
            {
                MockTextChange change;
                if (edit is ReplacementEdit replace)
                {
                    text.Remove(replace.Position, replace.Length);
                    text.Insert(replace.Position, replace.Text);
                    change = new MockTextChange(
                        new SnapshotSpan(_snapshot, replace.Position, replace.Length),
                        replace.Position,
                        replace.Text
                        );
                }
                else if (edit is InsertionEdit insert)
                {
                    text.Insert(insert.Position, insert.Text);
                    change = new MockTextChange(
                        new SnapshotSpan(_snapshot, insert.Position, 0),
                        insert.Position,
                        insert.Text
                        );
                }
                else
                {
                    DeletionEdit delete = (DeletionEdit)edit;
                    text.Remove(delete.Position, delete.Length);
                    change = new MockTextChange(
                        new SnapshotSpan(_snapshot, delete.Position, delete.Length),
                        delete.Position,
                        string.Empty
                        );
                }

                changes.Add(change);
            }
            changes.Reverse();

            MockTextSnapshot previous = _snapshot;
            MockTextSnapshot res      = ((MockTextBuffer)_snapshot.TextBuffer)._snapshot = new MockTextSnapshot(
                (MockTextBuffer)_snapshot.TextBuffer,
                text.ToString(),
                _snapshot,
                changes.ToArray()
                );

            _applied = true;
            ((MockTextBuffer)_snapshot.TextBuffer).EditApplied(previous);
            return(res);
        }
Exemple #2
0
        public ITextSnapshot Apply()
        {
            StringBuilder text    = new StringBuilder(_snapshot.GetText());
            var           deletes = new NormalizedSnapshotSpanCollection(
                _snapshot,
                _edits.OfType <DeletionEdit>()
                .Select(edit => new Span(edit.Position, edit.Length))
                );

            // apply the deletes
            for (int i = deletes.Count - 1; i >= 0; i--)
            {
                text.Remove(deletes[i].Start, deletes[i].Length);
            }

            // now apply the inserts
            int curDelete = 0, adjust = 0;
            int deletesBorrowed = 0;

            foreach (var insert in _edits.OfType <InsertionEdit>())
            {
                while (curDelete < deletes.Count && deletes[curDelete].Start < insert.Position)
                {
                    if (deletes[curDelete].Start + deletes[curDelete].Length < insert.Position)
                    {
                        adjust         -= deletes[curDelete].Length - deletesBorrowed;
                        deletesBorrowed = 0;
                        curDelete++;
                    }
                    else
                    {
                        int deletesUsed = insert.Position - deletes[curDelete].Start;
                        adjust          -= deletesUsed;
                        deletesBorrowed += deletesUsed;
                        break;
                    }
                }

                text.Insert(insert.Position + adjust, insert.Text);
                adjust += insert.Text.Length;
            }

            List <MockTextChange> changes = new List <MockTextChange>();

            adjust = 0;
            foreach (var curEdit in _edits.OrderBy(e => e.Position))
            {
                InsertionEdit insert = curEdit as InsertionEdit;
                if (insert != null)
                {
                    changes.Add(
                        new MockTextChange(
                            new SnapshotSpan(_snapshot, insert.Position, 0),
                            insert.Position + adjust,
                            insert.Text
                            )
                        );
                    adjust += insert.Text.Length;
                }
                else
                {
                    DeletionEdit delete = (DeletionEdit)curEdit;
                    changes.Add(
                        new MockTextChange(
                            new SnapshotSpan(_snapshot, delete.Position, delete.Length),
                            delete.Position + adjust,
                            ""
                            )
                        );
                    adjust -= delete.Length;
                }
            }

            var previous = _snapshot;
            var res      = ((MockTextBuffer)_snapshot.TextBuffer)._snapshot = new MockTextSnapshot(
                (MockTextBuffer)_snapshot.TextBuffer,
                text.ToString(),
                _snapshot,
                changes.ToArray()
                );

            _applied = true;
            ((MockTextBuffer)_snapshot.TextBuffer).EditApplied(previous);
            return(res);
        }
        public ITextSnapshot Apply()
        {
            // this works for non-overlapping edits...
            StringBuilder         text    = new StringBuilder(_snapshot.GetText());
            List <MockTextChange> changes = new List <MockTextChange>();

            for (int i = 0; i < _edits.Count; i++)
            {
                var curEdit = _edits[i];

                int adjust = 0;
                for (int j = 0; j < i; j++)
                {
                    var          compEdit = _edits[j];
                    DeletionEdit del      = compEdit as DeletionEdit;
                    if (del != null)
                    {
                        if ((compEdit.Position) < curEdit.Position)
                        {
                            adjust -= del.Length;
                        }
                    }
                    else
                    {
                        if ((compEdit.Position) <= curEdit.Position)
                        {
                            adjust += ((InsertionEdit)compEdit).Text.Length;
                        }
                    }
                }

                InsertionEdit insert = curEdit as InsertionEdit;
                if (insert != null)
                {
                    changes.Add(
                        new MockTextChange(
                            new SnapshotSpan(
                                _snapshot,
                                insert.Position,
                                0
                                ),
                            insert.Position + adjust,
                            insert.Text
                            )
                        );
                    text.Insert(insert.Position + adjust, insert.Text);
                }
                else
                {
                    DeletionEdit delete = curEdit as DeletionEdit;
                    changes.Add(
                        new MockTextChange(
                            new SnapshotSpan(
                                _snapshot,
                                delete.Position,
                                delete.Length
                                ),
                            delete.Position + adjust,
                            ""
                            )
                        );
                    text.Remove(delete.Position + adjust, delete.Length);
                }
            }

            var res = ((MockTextBuffer)_snapshot.TextBuffer)._snapshot = new MockTextSnapshot(
                (MockTextBuffer)_snapshot.TextBuffer,
                text.ToString(),
                _snapshot,
                changes.ToArray()
                );

            _applied = true;
            ((MockTextBuffer)_snapshot.TextBuffer).EditApplied();
            return(res);
        }
        public ITextSnapshot Apply()
        {
            StringBuilder text    = new StringBuilder(_snapshot.GetText());
            var           deletes = new NormalizedSnapshotSpanCollection(
                _snapshot,
                _edits.Where(edit => edit is DeletionEdit)
                .Select(edit =>
                        new Span(
                            ((DeletionEdit)edit).Position,
                            ((DeletionEdit)edit).Length
                            )
                        )
                );

            // apply the deletes
            for (int i = deletes.Count - 1; i >= 0; i--)
            {
                text.Remove(deletes[i].Start, deletes[i].Length);
            }

            // now apply the inserts
            int curDelete = 0, adjust = 0;

            foreach (InsertionEdit insert in _edits.Where(edit => edit is InsertionEdit))
            {
                while (curDelete < deletes.Count && deletes[curDelete].Start < insert.Position)
                {
                    adjust -= deletes[curDelete++].Length;
                }

                text.Insert(insert.Position + adjust, insert.Text);
                adjust += insert.Text.Length;
            }

            List <MockTextChange> changes = new List <MockTextChange>();

            for (int i = 0; i < _edits.Count; i++)
            {
                var           curEdit = _edits[i];
                InsertionEdit insert  = curEdit as InsertionEdit;
                if (insert != null)
                {
                    changes.Add(
                        new MockTextChange(
                            new SnapshotSpan(
                                _snapshot,
                                insert.Position,
                                0
                                ),
                            insert.Position + adjust,
                            insert.Text
                            )
                        );
                }
                else
                {
                    DeletionEdit delete = curEdit as DeletionEdit;
                    changes.Add(
                        new MockTextChange(
                            new SnapshotSpan(
                                _snapshot,
                                delete.Position,
                                delete.Length
                                ),
                            delete.Position + adjust,
                            ""
                            )
                        );
                }
            }

            var res = ((MockTextBuffer)_snapshot.TextBuffer)._snapshot = new MockTextSnapshot(
                (MockTextBuffer)_snapshot.TextBuffer,
                text.ToString(),
                _snapshot,
                changes.ToArray()
                );

            _applied = true;
            ((MockTextBuffer)_snapshot.TextBuffer).EditApplied();
            return(res);
        }