예제 #1
0
        public async Task <QuickInfoItem> GetQuickInfoItemAsync(IAsyncQuickInfoSession session, CancellationToken cancellationToken)
        {
            await Task.Yield().ConfigureAwait(false);

            if (cancellationToken.IsCancellationRequested)
            {
                return(null);
            }

            var syntaxTreeAndSnapshot = ParserService.SyntaxTreeAndSnapshot;

            if (syntaxTreeAndSnapshot == null)
            {
                return(null);
            }

            // Map the trigger point down to our buffer.
            SnapshotPoint?triggerPoint = session.GetTriggerPoint(syntaxTreeAndSnapshot.Snapshot);

            if (triggerPoint == null)
            {
                return(null);
            }

            var triggerToken = syntaxTreeAndSnapshot.SyntaxTree.Root.FindToken(triggerPoint.Value.Position);

            if (triggerToken.IsMissing || triggerToken.Parent == null)
            {
                return(null);
            }

            var applicableToSpan = syntaxTreeAndSnapshot.Snapshot.CreateTrackingSpan(
                triggerToken.Extent.Start,
                triggerToken.Extent.Length,
                SpanTrackingMode.EdgeExclusive);

            var location  = triggerToken.GetLocation();
            var qiContent = $"{triggerToken.GetText()}\r\n{triggerToken.Kind} Ln {location?.StartLine + 1} Ch {location?.StartCharacter + 1}\r\n{triggerToken.Parent?.GetType().Name}";

            await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

            var modifier = ModifierKeys.Control | ModifierKeys.Shift;

            if ((Keyboard.Modifiers & modifier) != modifier)
            {
                return(null);
            }

            var controlControl = new SymbolQuickInfoControl {
                CrispImage  = { Moniker = ImageMonikers.StatusInformation },
                TextContent = { Content = qiContent }
            };

            var qiItem = new QuickInfoItem(applicableToSpan: applicableToSpan,
                                           item: controlControl
                                           );

            return(qiItem);
        }
예제 #2
0
        public async Task <QuickInfoItem> GetQuickInfoItemAsync(IAsyncQuickInfoSession session, CancellationToken cancellationToken)
        {
            await Task.Yield().ConfigureAwait(false);

            if (cancellationToken.IsCancellationRequested)
            {
                return(null);
            }

            var syntaxTreeAndSnapshot = ParserService.SyntaxTreeAndSnapshot;

            if (syntaxTreeAndSnapshot == null)
            {
                return(null);
            }

            // Map the trigger point down to our buffer.
            SnapshotPoint?triggerPoint = session.GetTriggerPoint(syntaxTreeAndSnapshot.Snapshot);

            if (triggerPoint == null)
            {
                return(null);
            }

            var qiInfo = QuickInfoProvider.GetQuickInfoDefinition(syntaxTreeAndSnapshot.SyntaxTree, triggerPoint.Value.Position);

            if (qiInfo == null)
            {
                return(null);
            }

            var applicableToSpan = syntaxTreeAndSnapshot.Snapshot.CreateTrackingSpan(
                qiInfo.ApplicableToExtent.Start,
                qiInfo.ApplicableToExtent.Length,
                SpanTrackingMode.EdgeExclusive);

            await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

            var qiContent = _textBlockBuilderService.ToTextBlock(qiInfo.Content);

            var controlControl = new SymbolQuickInfoControl {
                CrispImage  = { Moniker = GdImageMonikers.GetMoniker(qiInfo.Glyph) },
                TextContent = { Content = qiContent }
            };

            var qiItem = new QuickInfoItem(applicableToSpan: applicableToSpan,
                                           item: controlControl
                                           );

            return(qiItem);
        }