예제 #1
0
        /// <summary>
        /// Determines whitespace difference between two snapshots
        /// </summary>
        /// <param name="before">Snapshot before the change</param>
        /// <param name="after">Snapshot after the change</param>
        /// <returns></returns>
        private static TextEdit[] GetDifference(IEditorBufferSnapshot before, IEditorBufferSnapshot after)
        {
            var tokenizer = new RTokenizer();
            var oldTokens = tokenizer.Tokenize(before.GetText());
            var newTokens = tokenizer.Tokenize(after.GetText());

            if (newTokens.Count != oldTokens.Count)
            {
                return(new[] { new TextEdit {
                                   newText = after.GetText(),
                                   range = TextRange.FromBounds(0, before.Length).ToLineRange(before)
                               } });
            }

            var edits  = new List <TextEdit>();
            var oldEnd = before.Length;
            var newEnd = after.Length;

            for (var i = newTokens.Count - 1; i >= 0; i--)
            {
                var oldText = before.GetText(TextRange.FromBounds(oldTokens[i].End, oldEnd));
                var newText = after.GetText(TextRange.FromBounds(newTokens[i].End, newEnd));
                if (oldText != newText)
                {
                    var range = new TextRange(oldTokens[i].End, oldEnd - oldTokens[i].End);
                    edits.Add(new TextEdit {
                        range   = range.ToLineRange(before),
                        newText = newText
                    });
                }
                oldEnd = oldTokens[i].Start;
                newEnd = newTokens[i].Start;
            }

            var r = TextRange.FromBounds(0, oldEnd);
            var oldTextBeforeFitstToken = before.GetText(r);
            var newTextBeforeFirstToken = after.GetText(TextRange.FromBounds(0, newEnd));

            if (oldTextBeforeFitstToken != newTextBeforeFirstToken)
            {
                edits.Add(new TextEdit {
                    newText = newTextBeforeFirstToken,
                    range   = r.ToLineRange(before)
                });
            }

            return(edits.ToArray());
        }
예제 #2
0
        public Task <TextEdit[]> FormatAsync(IEditorBufferSnapshot snapshot)
        {
            var settings = _services.GetService <IREditorSettings>();

            return(DoFormatActionAsync(snapshot, () => {
                var formattedText = new RFormatter(settings.FormatOptions).Format(snapshot.GetText());
                snapshot.EditorBuffer.Replace(TextRange.FromBounds(0, snapshot.Length), formattedText);
            }));
        }
예제 #3
0
        private void FireChanged(int start, int oldLength, int newLength)
        {
            var oldTextProvider = new TextStream(CurrentSnapshot.GetText());

            _version++;
            _currentSnapshot = new EditorBufferSnapshot(this, _content.ToString(), _version);

            var newTextProvider = new TextStream(_currentSnapshot.GetText());
            var change          = new TextChange(start, oldLength, newLength, oldTextProvider, newTextProvider);
            var args            = new TextChangeEventArgs(change);

            ChangedHighPriority?.Invoke(this, args);
            Changed?.Invoke(this, args);
        }