/// <summary> /// Text buffer change event handler. Performs analysis of the change. /// If change is trivial, such as change in whitespace (excluding line /// breaks that in R may be sensistive), simply applies the changes /// by shifting tree elements. If some elements get deleted or otherwise /// damaged, removes them from the tree right away. Non-trivial changes /// are queued for background parsing which starts on next on idle. /// Methond must be called on a main thread only, typically from an event /// handler that receives text buffer change events. /// </summary> internal void OnTextChanges(IReadOnlyCollection <TextChangeEventArgs> textChanges) { if (Thread.CurrentThread.ManagedThreadId != _ownerThreadId) { throw new ThreadStateException("Method should only be called on the main thread"); } _editorTree.FireOnUpdatesPending(textChanges); if (UpdatesSuspended) { this.TextBufferChangedSinceSuspend = true; _pendingChanges.FullParseRequired = true; } else { foreach (TextChangeEventArgs change in textChanges) { _lastChangeTime = DateTime.UtcNow; var context = new TextChangeContext(_editorTree, change, _pendingChanges); // No need to analyze changes if full parse is already pending if (!_pendingChanges.FullParseRequired) { TextChangeAnalyzer.DetermineChangeType(context); } ProcessChange(context); } } }
/// <summary> /// Text buffer change event handler. Performs analysis of the change. /// If change is trivial, such as change in whitespace (excluding line /// breaks that in R may be sensistive), simply applies the changes /// by shifting tree elements. If some elements get deleted or otherwise /// damaged, removes them from the tree right away. Non-trivial changes /// are queued for background parsing which starts on next on idle. /// Methond must be called on a main thread only, typically from an event /// handler that receives text buffer change events. /// </summary> internal void OnTextChange(TextChangeEventArgs e) { Check.InvalidOperation(() => Thread.CurrentThread.ManagedThreadId == _ownerThreadId, _threadCheckMessage); _editorTree.FireOnUpdatesPending(); if (UpdatesSuspended) { TextBufferChangedSinceSuspend = true; Changes.FullParseRequired = true; } else { _lastChangeTime = DateTime.UtcNow; var context = new TextChangeContext(_editorTree, new TreeTextChange(e.Change), Changes); // No need to analyze changes if full parse is already pending if (!Changes.FullParseRequired) { TextChangeAnalyzer.DetermineChangeType(context); } ProcessChange(context); } }