internal static void ApplyTextEdits(IEnumerable <TextEdit> textEdits, ITextSnapshot snapshot, ITextBuffer textBuffer) { var vsTextEdit = textBuffer.CreateEdit(); foreach (var textEdit in textEdits) { if (textEdit.Range.Start == textEdit.Range.End) { var position = snapshot.GetSnapshotPositionFromProtocolPosition(textEdit.Range.Start); if (position > -1) { var span = GetTranslatedSpan(position, 0, snapshot, vsTextEdit.Snapshot); vsTextEdit.Insert(span.Start, textEdit.NewText); } } else if (string.IsNullOrEmpty(textEdit.NewText)) { var startPosition = snapshot.GetSnapshotPositionFromProtocolPosition(textEdit.Range.Start); var endPosition = snapshot.GetSnapshotPositionFromProtocolPosition(textEdit.Range.End); var difference = endPosition - startPosition; if (startPosition > -1 && endPosition > -1 && difference > 0) { var span = GetTranslatedSpan(startPosition, difference, snapshot, vsTextEdit.Snapshot); vsTextEdit.Delete(span); } } else { var startPosition = snapshot.GetSnapshotPositionFromProtocolPosition(textEdit.Range.Start); var endPosition = snapshot.GetSnapshotPositionFromProtocolPosition(textEdit.Range.End); var difference = endPosition - startPosition; if (startPosition > -1 && endPosition > -1 && difference > 0) { var span = GetTranslatedSpan(startPosition, difference, snapshot, vsTextEdit.Snapshot); vsTextEdit.Replace(span, textEdit.NewText); } } } vsTextEdit.Apply(); }