예제 #1
0
            public IEnumerable <ITagSpan <IClassificationTag> > GetTags(
                NormalizedSnapshotSpanCollection spans
                )
            {
                if (
                    !_buffer.Properties.TryGetProperty(
                        PredefinedPreviewTaggerKeys.StaticClassificationSpansKey,
                        out ImmutableArray <ClassifiedSpan> classifiedSpans
                        )
                    )
                {
                    yield break;
                }

                foreach (var span in spans)
                {
                    // we don't need to care about snapshot since everything is static and never changes in preview
                    var requestSpan = span.Span.ToTextSpan();

                    foreach (var classifiedSpan in classifiedSpans)
                    {
                        if (classifiedSpan.TextSpan.IntersectsWith(requestSpan))
                        {
                            yield return(ClassificationUtilities.Convert(
                                             _typeMap,
                                             span.Snapshot,
                                             classifiedSpan
                                             ));
                        }
                    }
                }
            }
예제 #2
0
        protected override async TPL.Task ProduceTagsAsync(
            TaggerContext <IClassificationTag> taggerContext,
            DocumentSnapshotSpan snapshotSpan)
        {
            // We should check this at the call site.
            // This a safety check to make sure we do this when
            // we introduce a new call site.
            Debug.Assert(snapshotSpan.Document != null);

            var document          = snapshotSpan.Document;
            var cancellationToken = taggerContext.CancellationToken;

            var classificationService = document.Project.LanguageServices.GetService <IClassificationService>() as IRemoteClassificationService;

            if (classificationService == null)
            {
                return;
            }

            var classifiedSpans = ClassificationUtilities.GetOrCreateClassifiedSpanList();
            var tagSpan         = TextSpan.FromBounds(snapshotSpan.SnapshotSpan.Start, snapshotSpan.SnapshotSpan.End);
            await classificationService.AddRemoteSyntacticClassificationsAsync(document, tagSpan, classifiedSpans, cancellationToken).ConfigureAwait(false);

            ClassificationUtilities.Convert(_typeMap, snapshotSpan.SnapshotSpan.Snapshot, classifiedSpans, taggerContext.AddTag);
            ClassificationUtilities.ReturnClassifiedSpanList(classifiedSpans);
        }
예제 #3
0
            private async Task EnqueueProcessSnapshotWorkerAsync(DocumentId documentId, CancellationToken cancellationToken)
            {
                var workspace = this._workspace;

                if (workspace == null)
                {
                    return;
                }

                // This is an essentially arbitrary version of the document - we basically just want the path.
                var document = workspace.CurrentSolution.GetDocument(documentId);

                if (document == null)
                {
                    return;
                }

                // Changes after this point might not be incorporated into the server response, so
                // allow scheduling of additional requests.
                int wasRequestPending = Interlocked.Exchange(ref this._isRequestPending, 0);

                Debug.Assert(wasRequestPending == 1);

                var classificationService = document.Project.LanguageServices.GetService <IClassificationService>() as IRemoteClassificationService;

                if (classificationService == null)
                {
                    return;
                }

                var tree = await document.GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(false);

                var text = await tree.GetTextAsync(cancellationToken).ConfigureAwait(false);

                var snapshot = text.FindCorrespondingEditorTextSnapshot();

                if (snapshot == null)
                {
                    return;
                }

                var classifiedSpans = ClassificationUtilities.GetOrCreateClassifiedSpanList();
                await classificationService.AddRemoteSyntacticClassificationsAsync(document, TextSpan.FromBounds(0, tree.Length), classifiedSpans, cancellationToken).ConfigureAwait(false);

                using var tagSpans = SharedPools.Default <List <ITagSpan <IClassificationTag> > >().GetPooledObject();
                ClassificationUtilities.Convert(_typeMap, snapshot, classifiedSpans, tagSpans.Object.Add);
                ClassificationUtilities.ReturnClassifiedSpanList(classifiedSpans);

                var tagList = new TagSpanList <IClassificationTag>(tagSpans.Object);

                Interlocked.Exchange(ref this._lastProcessedTagList, tagList);

                this.TagsChanged?.Invoke(this, new SnapshotSpanEventArgs(snapshot.GetFullSpan()));
            }