/// <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()); }
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); })); }
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); }