/// <summary> /// Handles simple (safe) changes. /// </summary> private void ProcessSimpleChange(TextChangeContext context) { bool elementsRemoved = false; try { _editorTree.AcquireWriteLock(); elementsRemoved = DeleteAndShiftElements(context); UpdateTreeTextSnapshot(); // If no elements were invalidated and full parse is not required, clear pending changes if (!elementsRemoved) { ClearChanges(); } } finally { _editorTree.ReleaseWriteLock(); } if (!elementsRemoved) { if (context.ChangedNode != null || context.PendingChanges.TextChangeType == TextChangeType.Trivial) { _editorTree.FireOnPositionsOnlyChanged(); } _editorTree.FireOnUpdateCompleted(TreeUpdateType.PositionsOnly); } else { _editorTree.FireOnUpdateCompleted(TreeUpdateType.NodesRemoved); } DebugTree.VerifyTree(_editorTree); Debug.Assert(_editorTree.AstRoot.Children.Count > 0); }