public void Build() {
if (_ownerThread != Thread.CurrentThread.ManagedThreadId)
throw new ThreadStateException("Method should only be called on the main thread");
var sw = Stopwatch.StartNew();
TreeUpdateTask.Cancel();
if (TextBuffer != null) {
TextSnapshot = TextBuffer.CurrentSnapshot;
_astRoot = RParser.Parse(new TextProvider(TextBuffer.CurrentSnapshot), ExpressionTermFilter);
}
TreeUpdateTask.ClearChanges();
// Fire UpdatesPending notification, even though we don't have ranges for the event
List<TextChangeEventArgs> textChanges = new List<TextChangeEventArgs>();
FireOnUpdatesPending(textChanges);
FireOnUpdateBegin();
FireOnUpdateCompleted(TreeUpdateType.NewTree);
sw.Stop();
}
public static EditorTree ApplyTextChange(string expression, int start, int oldLength, int newLength, string newText) { TextBufferMock textBuffer = new TextBufferMock(expression, RContentTypeDefinition.ContentType); EditorTree tree = new EditorTree(textBuffer); tree.Build(); TextChange tc = new TextChange(); tc.OldRange = new TextRange(start, oldLength); tc.NewRange = new TextRange(start, newLength); tc.OldTextProvider = new TextProvider(textBuffer.CurrentSnapshot); if (oldLength == 0 && newText.Length > 0) { textBuffer.Insert(start, newText); } else if (oldLength > 0 && newText.Length > 0) { textBuffer.Replace(new Span(start, oldLength), newText); } else { textBuffer.Delete(new Span(start, oldLength)); } return tree; }