internal static void ApplyNewTree(TextEditor editor, int startOffset, bool exact, TextSpan span, Microsoft.CodeAnalysis.SyntaxTree syntaxTree, Microsoft.CodeAnalysis.SyntaxTree newTree) { var caretOffset = editor.CaretOffset; var caretEndOffset = caretOffset; using (var undo = editor.OpenUndoGroup()) { int delta = 0; foreach (var change in newTree.GetChanges(syntaxTree)) { if (!exact && change.Span.Start >= caretOffset) { continue; } if (exact && !span.Contains(change.Span.Start)) { continue; } var newText = change.NewText; var length = change.Span.Length; var changeEnd = delta + change.Span.End - 1; if (changeEnd < editor.Length && changeEnd >= 0 && editor.GetCharAt(changeEnd) == '\r') { length--; } var replaceOffset = delta + change.Span.Start; editor.ReplaceText(replaceOffset, length, newText); delta = delta - length + newText.Length; if (change.Span.Start < caretOffset) { if (change.Span.End < caretOffset) { caretEndOffset += newText.Length - length; } else { caretEndOffset = replaceOffset; } } } } if (startOffset < caretOffset) { if (0 <= caretEndOffset && caretEndOffset < editor.Length) { editor.CaretOffset = caretEndOffset; } if (editor.CaretColumn == 1) { if (editor.CaretLine > 1 && editor.GetLine(editor.CaretLine - 1).Length == 0) { editor.CaretLine--; } editor.CaretColumn = editor.GetVirtualIndentationColumn(editor.CaretLine); } } }
internal static void ApplyNewTree(TextEditor editor, int startOffset, bool exact, TextSpan span, Microsoft.CodeAnalysis.SyntaxTree syntaxTree, Microsoft.CodeAnalysis.SyntaxTree newTree) { editor.ApplyTextChanges(newTree.GetChanges(syntaxTree)); }