Exemple #1
0
            public Tagger(
                CopyPasteAndPrintingClassificationBufferTaggerProvider owner,
                ITextBuffer subjectBuffer,
                IAsynchronousOperationListener asyncListener
                ) : base(owner.ThreadingContext)
            {
                _owner         = owner;
                _subjectBuffer = subjectBuffer;

                const TaggerDelay Delay = TaggerDelay.Short;

                // Note: because we use frozen-partial documents for semantic classification, we may end up with incomplete
                // semantics (esp. during solution load).  Because of this, we also register to hear when the full
                // compilation is available so that reclassify and bring ourselves up to date.
                _eventSource = new CompilationAvailableTaggerEventSource(
                    subjectBuffer,
                    Delay,
                    owner.ThreadingContext,
                    asyncListener,
                    TaggerEventSources.OnWorkspaceChanged(subjectBuffer, Delay, asyncListener),
                    TaggerEventSources.OnDocumentActiveContextChanged(subjectBuffer, Delay)
                    );

                ConnectToEventSource();
            }
 public ViewSpanChangedEventSource(ITextView textView, TaggerDelay textChangeDelay, TaggerDelay scrollChangeDelay)
 {
     Debug.Assert(textView != null);
     _textView          = textView;
     _textChangeDelay   = textChangeDelay;
     _scrollChangeDelay = scrollChangeDelay;
 }
 public EditorFormatMapChangedEventSource(
     IEditorFormatMap editorFormatMap,
     TaggerDelay delay
     ) : base(delay)
 {
     _editorFormatMap = editorFormatMap;
 }
Exemple #4
0
        internal static int ComputeTimeDelay(this TaggerDelay behavior, ITextBuffer textBufferOpt)
        {
            if (TextBufferAssociatedViewService.AnyAssociatedViewHasFocus(textBufferOpt))
            {
                // TODO : should we remove TaggerBehavior enum all together and put NearImmediateDelay
                // const in Interaction?
                switch (behavior)
                {
                case TaggerDelay.NearImmediate:
                    return(NearImmediateDelay);

                case TaggerDelay.Short:
                    return(ShortDelay);

                case TaggerDelay.Medium:
                    return(MediumDelay);

                case TaggerDelay.OnIdle:
                default:
                    return(IdleDelay);
                }
            }

            return(NonFocusDelay);
        }
            private void NotifyEditors(NormalizedSnapshotSpanCollection changes, TaggerDelay delay)
            {
                _tagSource.AssertIsForeground();

                if (changes.Count == 0)
                {
                    // nothing to do.
                    return;
                }

                if (delay == TaggerDelay.NearImmediate)
                {
                    // if delay is immediate, we let notifier knows about the change right away
                    _batchChangeNotifier.EnqueueChanges(changes);
                    return;
                }

                // if delay is anything more than that, we let notifier knows about the change after given delay
                // event notification is only cancellable when disposing of the tagger.
                _tagSource.RegisterNotification(
                    () => _batchChangeNotifier.EnqueueChanges(changes),
                    (int)delay.ComputeTimeDelay(_subjectBuffer).TotalMilliseconds,
                    _cancellationTokenSource.Token
                    );
            }
 public static ITaggerEventSource OnDiagnosticsChanged(
     ITextBuffer subjectBuffer,
     IDiagnosticService service,
     TaggerDelay delay)
 {
     return new DiagnosticsChangedEventSource(subjectBuffer, service, delay);
 }
 public static ITaggerEventSource OnCompletionClosed(
     ITextView textView,
     IIntellisenseSessionStack sessionStack,
     TaggerDelay delay)
 {
     return new CompletionClosedEventSource(textView, sessionStack, delay);
 }
Exemple #8
0
 public static ITaggerEventSource OnDiagnosticsChanged(
     ITextBuffer subjectBuffer,
     IDiagnosticService service,
     TaggerDelay delay)
 {
     return(new DiagnosticsChangedEventSource(subjectBuffer, service, delay));
 }
 public static ITaggerEventSource OnOptionChanged(
     ITextBuffer subjectBuffer,
     IOption option,
     TaggerDelay delay)
 {
     return new OptionChangedEventSource(subjectBuffer, option, delay);
 }
Exemple #10
0
 public static ITaggerEventSource OnOptionChanged(
     ITextBuffer subjectBuffer,
     IOption option,
     TaggerDelay delay)
 {
     return(new OptionChangedEventSource(subjectBuffer, option, delay));
 }
Exemple #11
0
 public static ITaggerEventSource OnParseOptionChanged(
     ITextBuffer subjectBuffer,
     TaggerDelay delay
     )
 {
     return(new ParseOptionChangedEventSource(subjectBuffer, delay));
 }
Exemple #12
0
        protected override ITaggerEventSource CreateEventSource(
            ITextView textView,
            ITextBuffer subjectBuffer
            )
        {
            this.AssertIsForeground();
            const TaggerDelay Delay = TaggerDelay.Short;

            // Note: we don't listen for OnTextChanged.  They'll get reported by the ViewSpan changing and also the
            // SemanticChange notification.
            //
            // Note: when the user scrolls, we will try to reclassify as soon as possible.  That way we appear
            // semantically unclassified for a very short amount of time.
            //
            // Note: because we use frozen-partial documents for semantic classification, we may end up with incomplete
            // semantics (esp. during solution load).  Because of this, we also register to hear when the full
            // compilation is available so that reclassify and bring ourselves up to date.
            return(new CompilationAvailableTaggerEventSource(
                       subjectBuffer,
                       Delay,
                       ThreadingContext,
                       AsyncListener,
                       TaggerEventSources.OnViewSpanChanged(
                           ThreadingContext,
                           textView,
                           textChangeDelay: Delay,
                           scrollChangeDelay: TaggerDelay.NearImmediate
                           ),
                       TaggerEventSources.OnWorkspaceChanged(subjectBuffer, Delay, this.AsyncListener),
                       TaggerEventSources.OnDocumentActiveContextChanged(subjectBuffer, Delay)
                       ));
        }
Exemple #13
0
 public static ITaggerEventSource OnCompletionClosed(
     ITextView textView,
     IIntellisenseSessionStack sessionStack,
     TaggerDelay delay)
 {
     return(new CompletionClosedEventSource(textView, sessionStack, delay));
 }
 public ViewSpanChangedEventSource(ITextView textView, TaggerDelay textChangeDelay, TaggerDelay scrollChangeDelay)
 {
     Debug.Assert(textView != null);
     _textView = textView;
     _textChangeDelay = textChangeDelay;
     _scrollChangeDelay = scrollChangeDelay;
 }
Exemple #15
0
            public TextChangedEventSource(ITextBuffer subjectBuffer, TaggerDelay delay)
                : base(delay)
            {
                Contract.ThrowIfNull(subjectBuffer);

                _subjectBuffer = subjectBuffer;
            }
Exemple #16
0
 /// <summary>
 /// Reports an event any time the workspace changes.
 /// </summary>
 public static ITaggerEventSource OnWorkspaceChanged(
     ITextBuffer subjectBuffer,
     TaggerDelay delay,
     IAsynchronousOperationListener listener
     )
 {
     return(new WorkspaceChangedEventSource(subjectBuffer, delay, listener));
 }
            public TextChangedEventSource(ITextBuffer subjectBuffer, TaggerDelay delay, bool reportChangedSpans)
                : base(delay)
            {
                Contract.ThrowIfNull(subjectBuffer);

                _subjectBuffer = subjectBuffer;
                _reportChangedSpans = reportChangedSpans;
            }
            public TextChangedEventSource(ITextBuffer subjectBuffer, TaggerDelay delay, bool reportChangedSpans)
                : base(delay)
            {
                Contract.ThrowIfNull(subjectBuffer);

                _subjectBuffer      = subjectBuffer;
                _reportChangedSpans = reportChangedSpans;
            }
            public CaretPositionChangedEventSource(ITextView textView, ITextBuffer subjectBuffer, TaggerDelay delay)
                : base(delay)
            {
                Contract.ThrowIfNull(textView);
                Contract.ThrowIfNull(subjectBuffer);

                _textView = textView;
            }
Exemple #20
0
 public ViewSpanChangedEventSource(IThreadingContext threadingContext, ITextView textView, TaggerDelay textChangeDelay, TaggerDelay scrollChangeDelay)
 {
     Debug.Assert(textView != null);
     _foregroundObject  = new ForegroundThreadAffinitizedObject(threadingContext);
     _textView          = textView;
     _textChangeDelay   = textChangeDelay;
     _scrollChangeDelay = scrollChangeDelay;
 }
Exemple #21
0
        public static ITaggerEventSource OnReadOnlyRegionsChanged(
            ITextBuffer subjectBuffer,
            TaggerDelay delay
            )
        {
            Contract.ThrowIfNull(subjectBuffer);

            return(new ReadOnlyRegionsChangedEventSource(subjectBuffer, delay));
        }
Exemple #22
0
 internal TaggerEventArgs(
     string kind,
     TaggerDelay delay,
     TextContentChangedEventArgs textChangeEventArgs = null)
 {
     this.Kind = kind;
     this.Delay = delay;
     this.TextChangeEventArgs = textChangeEventArgs;
 }
Exemple #23
0
 public DiagnosticsChangedEventSource(
     ITextBuffer subjectBuffer,
     IDiagnosticService service,
     TaggerDelay delay
     ) : base(delay)
 {
     _subjectBuffer = subjectBuffer;
     _service       = service;
 }
            public CompletionClosedEventSource(
                IIntellisenseSessionStack sessionStack,
                TaggerDelay delay)
                : base(delay)
            {
                Contract.ThrowIfNull(sessionStack);

                _sessionStack = sessionStack;
            }
Exemple #25
0
 internal TaggerEventArgs(
     string kind,
     TaggerDelay delay,
     TextContentChangedEventArgs textChangeEventArgs = null)
 {
     this.Kind  = kind;
     this.Delay = delay;
     this.TextChangeEventArgs = textChangeEventArgs;
 }
Exemple #26
0
 protected AbstractWorkspaceTrackingTaggerEventSource(
     ITextBuffer subjectBuffer,
     TaggerDelay delay
     ) : base(delay)
 {
     this.SubjectBuffer     = subjectBuffer;
     _workspaceRegistration = Workspace.GetWorkspaceRegistration(
         subjectBuffer.AsTextContainer()
         );
 }
Exemple #27
0
        internal static TimeSpan ComputeTimeDelay(this TaggerDelay behavior, ITextBuffer textBufferOpt)
        {
            if (TextBufferAssociatedViewService.AnyAssociatedViewHasFocus(textBufferOpt))
            {
                // TODO : should we remove TaggerBehavior enum all together and put NearImmediateDelay
                // const in Interaction?
                return(ComputeTimeDelay(behavior));
            }

            return(TimeSpan.FromMilliseconds(NonFocusDelay));
        }
            public CaretPositionChangedEventSource(
                ITextView textView,
                ITextBuffer subjectBuffer,
                TaggerDelay delay
                ) : base(delay)
            {
                Contract.ThrowIfNull(textView);
                Contract.ThrowIfNull(subjectBuffer);

                _textView = textView;
            }
Exemple #29
0
 public static ITaggerEventSource OnViewSpanChanged(
     IThreadingContext threadingContext,
     ITextView textView,
     TaggerDelay textChangeDelay,
     TaggerDelay scrollChangeDelay
     ) =>
 new ViewSpanChangedEventSource(
     threadingContext,
     textView,
     textChangeDelay,
     scrollChangeDelay
     );
            public CompletionClosedEventSource(
                ITextView textView,
                IIntellisenseSessionStack sessionStack,
                TaggerDelay delay)
                : base(delay)
            {
                Contract.ThrowIfNull(textView);
                Contract.ThrowIfNull(sessionStack);

                _textView = textView;
                _sessionStack = sessionStack;
            }
Exemple #31
0
            public Tagger(SemanticClassificationBufferTaggerProvider owner, ITextBuffer subjectBuffer)
            {
                _owner         = owner;
                _subjectBuffer = subjectBuffer;

                const TaggerDelay Delay = TaggerDelay.Short;

                _eventSource = TaggerEventSources.Compose(
                    TaggerEventSources.OnSemanticChanged(subjectBuffer, Delay, _owner._semanticChangeNotificationService),
                    TaggerEventSources.OnDocumentActiveContextChanged(subjectBuffer, Delay));

                ConnectToEventSource();
            }
Exemple #32
0
        public CompilationAvailableTaggerEventSource(
            ITextBuffer subjectBuffer,
            TaggerDelay delay,
            IThreadingContext threadingContext,
            IAsynchronousOperationListener asyncListener,
            params ITaggerEventSource[] eventSources)
        {
            _subjectBuffer    = subjectBuffer;
            _delay            = delay;
            _asyncListener    = asyncListener;
            _underlyingSource = TaggerEventSources.Compose(eventSources);

            _workQueue = new AsynchronousSerialWorkQueue(threadingContext, asyncListener);
        }
Exemple #33
0
 public BatchChangeNotifier(
     ITextBuffer subjectBuffer,
     IAsynchronousOperationListener listener,
     IForegroundNotificationService notificationService,
     Action <SnapshotSpan> reportChangedSpan,
     TaggerDelay throttleDelay = TaggerDelay.Short)
 {
     Contract.ThrowIfNull(reportChangedSpan);
     _subjectBuffer       = subjectBuffer;
     _listener            = listener;
     _notificationService = notificationService;
     _reportChangedSpan   = reportChangedSpan;
     _throttleDelay       = throttleDelay;
 }
 public BatchChangeNotifier(
     ITextBuffer subjectBuffer,
     IAsynchronousOperationListener listener,
     IForegroundNotificationService notificationService,
     Action<SnapshotSpan> reportChangedSpan,
     TaggerDelay throttleDelay = TaggerDelay.Short)
 {
     Contract.ThrowIfNull(reportChangedSpan);
     _subjectBuffer = subjectBuffer;
     _listener = listener;
     _notificationService = notificationService;
     _reportChangedSpan = reportChangedSpan;
     _throttleDelay = throttleDelay;
 }
Exemple #35
0
        protected override ITaggerEventSource CreateEventSource(ITextView textView, ITextBuffer subjectBuffer)
        {
            this.AssertIsForeground();
            const TaggerDelay Delay = TaggerDelay.Short;

            // Note: we don't listen for OnTextChanged.  They'll get reported by the ViewSpan changing
            // and also the SemanticChange nodification.
            //
            // Note: when the user scrolls, we will try to reclassify as soon as possible.  That way
            // we appear semantically unclassified for a very short amount of time.
            return(TaggerEventSources.Compose(
                       TaggerEventSources.OnViewSpanChanged(textView, textChangeDelay: Delay, scrollChangeDelay: TaggerDelay.NearImmediate),
                       TaggerEventSources.OnSemanticChanged(subjectBuffer, Delay, _semanticChangeNotificationService)));
        }
Exemple #36
0
 public void EnqueueWork(
     Func <Task> workAsync,
     TaggerDelay delay,
     IAsyncToken asyncToken,
     CancellationToken cancellationToken)
 {
     lock (this)
     {
         _eventWorkQueue = _eventWorkQueue.ContinueWithAfterDelayFromAsync(
             _ => workAsync(),
             cancellationToken,
             (int)delay.ComputeTimeDelay().TotalMilliseconds,
             TaskContinuationOptions.None,
             TaskScheduler.Default).CompletesAsyncOperation(asyncToken);
     }
 }
            private void EnqueueNotificationRequest(TaggerDelay delay)
            {
                AssertIsForeground();

                if (_notificationRequestEnqueued)
                {
                    // we already have a pending task to update the UI.  No need to do anything at this
                    // point.
                    return;
                }

                var currentTick = Environment.TickCount;

                if (
                    Math.Abs(currentTick - _lastReportTick)
                    > TaggerDelay.NearImmediate.ComputeTimeDelay(_subjectBuffer).TotalMilliseconds
                    )
                {
                    _lastReportTick = currentTick;
                    this.NotifyEditor();
                }
                else
                {
                    // enqueue a task to update the UI with all the changed spans at some time in the
                    // future.
                    _notificationRequestEnqueued = true;

                    // Note: this operation is uncancellable.  We already updated our internal state in
                    // RecomputeTags. We must eventually notify the editor about these changes so that the
                    // UI reaches parity with our internal model.  Also, if we cancel it, then
                    // 'reportTagsScheduled' will stay 'true' forever and we'll never notify the UI.
                    _notificationService.RegisterNotification(
                        () =>
                    {
                        AssertIsForeground();

                        // First, clear the flag.  That way any new changes we hear about will enqueue a task
                        // to run at a later point.
                        _notificationRequestEnqueued = false;
                        this.NotifyEditor();
                    },
                        (int)delay.ComputeTimeDelay(_subjectBuffer).TotalMilliseconds,
                        _listener.BeginAsyncOperation("EnqueueNotificationRequest"),
                        _cancellationToken
                        );
                }
            }
Exemple #38
0
            public Tagger(
                SemanticClassificationBufferTaggerProvider owner,
                ITextBuffer subjectBuffer,
                IAsynchronousOperationListener asyncListener)
                : base(owner.ThreadingContext)
            {
                _owner         = owner;
                _subjectBuffer = subjectBuffer;

                const TaggerDelay Delay = TaggerDelay.Short;

                _eventSource = TaggerEventSources.Compose(
                    TaggerEventSources.OnWorkspaceChanged(subjectBuffer, Delay, asyncListener),
                    TaggerEventSources.OnDocumentActiveContextChanged(subjectBuffer, Delay));

                ConnectToEventSource();
            }
Exemple #39
0
        internal static TimeSpan ComputeTimeDelay(this TaggerDelay behavior)
        {
            switch (behavior)
            {
            case TaggerDelay.NearImmediate:
                return(TimeSpan.FromMilliseconds(NearImmediateDelay));

            case TaggerDelay.Short:
                return(TimeSpan.FromMilliseconds(ShortDelay));

            case TaggerDelay.Medium:
                return(TimeSpan.FromMilliseconds(MediumDelay));

            case TaggerDelay.OnIdle:
            default:
                return(TimeSpan.FromMilliseconds(IdleDelay));
            }
        }
 public static ITaggerEventSource OnSelectionChanged(
     ITextView textView,
     TaggerDelay delay)
 {
     return new SelectionChangedEventSource(textView, delay);
 }
 /// <summary>
 /// Reports an event any time the semantics have changed such that this 
 /// <paramref name="subjectBuffer"/> should be retagged.  Semantics are considered changed 
 /// for a buffer if an edit happens directly in that buffer, or if a top level visible 
 /// change happens in any sibling document or in any dependent projects' documents.
 /// </summary>
 public static ITaggerEventSource OnSemanticChanged(ITextBuffer subjectBuffer, TaggerDelay delay, ISemanticChangeNotificationService notificationService)
 {
     return new SemanticChangedEventSource(subjectBuffer, delay, notificationService);
 }
 public static ITaggerEventSource OnDocumentActiveContextChanged(ITextBuffer subjectBuffer, TaggerDelay delay)
 {
     return new DocumentActiveContextChangedEventSource(subjectBuffer, delay);
 }
 public static ITaggerEventSource OnCaretPositionChanged(ITextView textView, ITextBuffer subjectBuffer, TaggerDelay delay)
 {
     return new CaretPositionChangedEventSource(textView, subjectBuffer, delay);
 }
 protected AbstractWorkspaceTrackingTaggerEventSource(ITextBuffer subjectBuffer, TaggerDelay delay) : base(delay)
 {
     this.SubjectBuffer = subjectBuffer;
     _workspaceRegistration = Workspace.GetWorkspaceRegistration(subjectBuffer.AsTextContainer());
 }
 public WorkspaceRegistrationChangedEventSource(ITextBuffer subjectBuffer, TaggerDelay delay)
     : base(subjectBuffer, delay)
 {
 }
 public static ITaggerEventSource OnWorkspaceRegistrationChanged(ITextBuffer subjectBuffer, TaggerDelay delay)
 {
     return new WorkspaceRegistrationChangedEventSource(subjectBuffer, delay);
 }
 public static ITaggerEventSource OnParseOptionChanged(
     ITextBuffer subjectBuffer,
     TaggerDelay delay)
 {
     return new ParseOptionChangedEventSource(subjectBuffer, delay);
 }
Exemple #48
0
 /// <summary>
 /// Creates a new <see cref="TaggerEventArgs"/>
 /// </summary>
 public TaggerEventArgs(TaggerDelay delay)
 {
     this.Delay = delay;
 }
 public OptionChangedEventSource(ITextBuffer subjectBuffer, IOption option, TaggerDelay delay) : base(subjectBuffer, delay)
 {
     _option = option;
 }
        public static ITaggerEventSource OnReadOnlyRegionsChanged(ITextBuffer subjectBuffer, TaggerDelay delay)
        {
            Contract.ThrowIfNull(subjectBuffer);

            return new ReadOnlyRegionsChangedEventSource(subjectBuffer, delay);
        }
 public SelectionChangedEventSource(ITextView textView, TaggerDelay delay)
     : base(delay)
 {
     _textView = textView;
 }
 public SemanticChangedEventSource(ITextBuffer subjectBuffer, TaggerDelay delay, ISemanticChangeNotificationService notificationService) :
     base(subjectBuffer, delay)
 {
     _notificationService = notificationService;
 }
 protected AbstractTaggerEventSource(TaggerDelay delay)
 {
     _delay = delay;
 }
Exemple #54
0
 /// <summary>
 /// Creates a new <see cref="TaggerEventArgs"/>
 /// </summary>
 public TaggerEventArgs(TaggerDelay delay) : this("", delay)
 {
 }
 public DiagnosticsChangedEventSource(ITextBuffer subjectBuffer, IDiagnosticService service, TaggerDelay delay)
     : base(delay)
 {
     _subjectBuffer = subjectBuffer;
     _service = service;
 }
        public static ITaggerEventSource OnTextChanged(ITextBuffer subjectBuffer, TaggerDelay delay, bool reportChangedSpans = false)
        {
            Contract.ThrowIfNull(subjectBuffer);

            return new TextChangedEventSource(subjectBuffer, delay, reportChangedSpans);
        }
Exemple #57
0
 public static ITaggerEventSource OnViewSpanChanged(ITextView textView, TaggerDelay textChangeDelay, TaggerDelay scrollChangeDelay)
 {
     return new ViewSpanChangedEventSource(textView, textChangeDelay, scrollChangeDelay);
 }
 private void RaiseChanged(TaggerDelay delay)
 {
     this.Changed?.Invoke(this, new TaggerEventArgs(delay));
 }
 public DocumentActiveContextChangedEventSource(ITextBuffer subjectBuffer, TaggerDelay delay)
     : base(subjectBuffer, delay)
 {
 }