Exemplo n.º 1
0
        private IDocumentMarkup TryGetDocumentMarkup()
        {
            IVsTextBuffer bufferAdapter = _editorAdaptersFactoryService.GetBufferAdapter(_textBuffer);

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

            IDocument document = new JetVsTextBuffer(bufferAdapter).JetDocument.Value;

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

            IDocumentMarkup documentMarkup = DocumentMarkupManagerBase.TryGetMarkupModel(document);

            if (documentMarkup == null || !documentMarkup.GetType().Name.StartsWith("Vs", StringComparison.Ordinal))
            {
                return(null);
            }

            return(documentMarkup);
        }
        public override IHighlighter CreateHighlighter(IDocumentMarkup markup)
        {
            var highlighter = base.CreateHighlighter(markup);

            highlighter.UserData = new UnityPerformanceCriticalCodeLineMarker(DocumentRange.InvalidRange);
            return(highlighter);
        }
        public void AugmentQuickInfoSession(IQuickInfoSession session, IList <object> quickInfoContent, out ITrackingSpan applicableToSpan)
        {
            applicableToSpan = null;

            if (session == null || session.IsDismissed || session.TextView.TextBuffer != TextBuffer || quickInfoContent == null || quickInfoContent.IsReadOnly)
            {
                return;
            }

            IDocumentMarkup documentMarkup = TryGetDocumentMarkup(session.TextView);

            if (documentMarkup == null)
            {
                return;
            }

            // If this fails, it means the extension is disabled and none of the components are available.
            var tooltipFontProvider = Shell.Instance.TryGetComponent <TooltipFormattingProvider>();

            if (tooltipFontProvider == null)
            {
                return;
            }

            AugmentQuickInfoSessionCore(session, quickInfoContent, documentMarkup, tooltipFontProvider, out applicableToSpan);
        }
Exemplo n.º 4
0
        public override IHighlighter CreateHighlighter(IDocumentMarkup markup)
        {
            var highlighter = base.CreateHighlighter(markup);

            highlighter.UserData = new PerformanceHighlighting(DocumentRange.InvalidRange);
            return(highlighter);
        }
Exemplo n.º 5
0
        private static IEnumerable <IReSharperTooltipContent> GetTooltipContents(
            [NotNull] IHighlighter highlighter,
            TextRange range,
            [NotNull] IDocumentMarkup documentMarkup,
            [CanBeNull] ISolution solution,
            bool skipIdentifierHighlighting)
        {
            if (highlighter.Attributes.Effect.Type == EffectType.GUTTER_MARK)
            {
                yield break;
            }

            var highlighting = highlighter.UserData as IHighlighting;

            if (highlighting != null)
            {
                IDocument document = documentMarkup.Document;
                IContextBoundSettingsStore settings = document.GetSettings();

                Severity            severity     = HighlightingSettingsManager.Instance.GetSeverity(highlighting, solution);
                IssueTooltipContent issueContent = TryCreateIssueContent(highlighting, range, highlighter.RichTextToolTip, severity, settings, solution);
                if (issueContent != null)
                {
                    yield return(issueContent);

                    yield break;
                }

                if (solution != null && IsIdentifierHighlighting(highlighting))
                {
                    if (!skipIdentifierHighlighting)
                    {
                        var identifierContentGroup = GetIdentifierContentGroup(highlighter, solution, settings);
                        if (identifierContentGroup != null)
                        {
                            foreach (IdentifierTooltipContent content in identifierContentGroup.Identifiers)
                            {
                                yield return(content);
                            }
                            if (identifierContentGroup.ArgumentRole != null)
                            {
                                yield return(identifierContentGroup.ArgumentRole);
                            }
                        }
                    }
                    yield break;
                }
            }

            MiscTooltipContent miscContent = TryCreateMiscContent(highlighter.RichTextToolTip, range);

            if (miscContent != null)
            {
                yield return(miscContent);
            }
        }
Exemplo n.º 6
0
        protected override void AugmentQuickInfoSessionCore(
            IQuickInfoSession session,
            IList <object> quickInfoContent,
            IDocumentMarkup documentMarkup,
            TooltipFormattingProvider tooltipFormattingProvider,
            out ITrackingSpan applicableToSpan)
        {
            applicableToSpan = null;

            session.StoreVsSquiggleContents(quickInfoContent.ToArray());
        }
        private IDocumentMarkup TryGetDocumentMarkup([CanBeNull] ITextView textView)
        {
            IDocument document = VsTextViewSolutionContextProvider.TryGetContext(textView)?.TextControl.Document;

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

            IDocumentMarkup documentMarkup = Shell.Instance.TryGetComponent <IDocumentMarkupManager>()?.TryGetMarkupModel(document);

            return(documentMarkup is VsDocumentMarkupDevTen ? documentMarkup : null);
        }
Exemplo n.º 8
0
        private static ITooltipContent[] GetTooltipContents([NotNull] IHighlighter highlighter, TextRange range,
                                                            [NotNull] IDocumentMarkup documentMarkup, [CanBeNull] ISolution solution, bool skipIdentifierHighlighting)
        {
            if (highlighter.Attributes.Effect.Type == EffectType.GUTTER_MARK)
            {
                return(EmptyArray <ITooltipContent> .Instance);
            }

            var highlighting = highlighter.UserData as IHighlighting;

            if (highlighting != null)
            {
                IDocument document = documentMarkup.Document;
                IContextBoundSettingsStore settings = document.GetSettings();

                Severity            severity     = HighlightingSettingsManager.Instance.GetSeverity(highlighting, document, solution);
                IssueTooltipContent issueContent = TryCreateIssueContent(highlighting, range, highlighter.RichTextToolTip, severity, settings, solution);
                if (issueContent != null)
                {
                    return new ITooltipContent[] { issueContent }
                }
                ;

                if (solution != null && IsIdentifierHighlighting(highlighting))
                {
                    if (skipIdentifierHighlighting)
                    {
                        return(EmptyArray <ITooltipContent> .Instance);
                    }
                    IdentifierTooltipContent[] identifierContents = GetIdentifierTooltipContents(highlighter, solution, settings);

                    // ReSharper disable once CoVariantArrayConversion
                    return(identifierContents);
                }
            }

            MiscTooltipContent miscContent = TryCreateMiscContent(highlighter.RichTextToolTip, range);

            if (miscContent != null)
            {
                return new ITooltipContent[] { miscContent }
            }
            ;

            return(EmptyArray <ITooltipContent> .Instance);
        }
Exemplo n.º 9
0
        private IDocumentMarkup TryGetDocumentMarkup()
        {
            VSIVsTextBuffer bufferAdapter = _editorAdaptersFactoryService.GetBufferAdapter(_textBuffer);

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

            IDocument document = new JetIVsTextBuffer(bufferAdapter).JetDocument.Value;

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

            IDocumentMarkup documentMarkup = DocumentMarkupManagerBase.TryGetMarkupModel(document);

            return(documentMarkup is IVsDocumentMarkup ? documentMarkup : null);
        }
Exemplo n.º 10
0
        protected override void AugmentQuickInfoSessionCore(
            IQuickInfoSession session,
            IList <object> quickInfoContent,
            IDocumentMarkup documentMarkup,
            TooltipFormattingProvider tooltipFormattingProvider,
            out ITrackingSpan applicableToSpan)
        {
            applicableToSpan = null;

            ITextSnapshot textSnapshot = TextBuffer.CurrentSnapshot;
            TextRange     textRange    = GetCurrentTextRange(session, textSnapshot);
            IShellLocks   shellLocks   = Shell.Instance.GetComponent <IShellLocks>();
            Span?         finalSpan    = null;

            void GetEnhancedTooltips()
            {
                using (shellLocks.UsingReadLock()) {
                    IDocument document  = documentMarkup.Document;
                    var       presenter = new MultipleTooltipContentPresenter(tooltipFormattingProvider.GetTooltipFormatting(), document);
                    IContextBoundSettingsStore settings = document.GetSettings();
                    ISolution solution = TryGetCurrentSolution();
                    bool      hasIdentifierTooltipContent = false;

                    var resolveContext = solution != null?document.GetContext(solution) : UniversalModuleReferenceContext.Instance;

                    using (CompilationContextCookie.GetOrCreate(resolveContext)) {
                        if (solution != null)
                        {
                            DocumentRange          documentRange = textRange.CreateDocumentRange(document);
                            IdentifierContentGroup contentGroup  = GetIdentifierContentGroup(documentRange, solution, settings);
                            if (contentGroup != null)
                            {
                                foreach (IdentifierTooltipContent content in contentGroup.Identifiers)
                                {
                                    presenter.AddIdentifierTooltipContent(content);
                                    finalSpan = content.TrackingRange.ToSpan().Union(finalSpan);
                                    hasIdentifierTooltipContent = true;
                                }
                                if (contentGroup.ArgumentRole != null)
                                {
                                    presenter.AddArgumentRoleTooltipContent(contentGroup.ArgumentRole);
                                    if (finalSpan == null)
                                    {
                                        // Only track the argument role if we have nothing else displayed.
                                        // See https://github.com/MrJul/ReSharper.EnhancedTooltip/issues/70
                                        finalSpan = contentGroup.ArgumentRole.TrackingRange.ToSpan();
                                    }
                                }
                            }
                        }

                        List <Vs10Highlighter> highlighters = documentMarkup.GetHighlightersOver(textRange).OfType <Vs10Highlighter>().ToList();
                        foreach (Vs10Highlighter highlighter in highlighters)
                        {
                            IEnumerable <IReSharperTooltipContent> contents = GetTooltipContents(highlighter, highlighter.Range, documentMarkup, solution, hasIdentifierTooltipContent);
                            foreach (IReSharperTooltipContent content in contents)
                            {
                                if (presenter.TryAddReSharperContent(content))
                                {
                                    finalSpan = content.TrackingRange.ToSpan().Union(finalSpan);
                                }
                            }
                        }
                    }

                    var vsSquiggleContents = session.RetrieveVsSquiggleContents()
                                             .OfType <string>()
                                             .ToSet();

                    bool ignoredFirstVsElement = false;
                    foreach (object content in quickInfoContent)
                    {
                        if (content == null)
                        {
                            continue;
                        }

                        // ignore existing R# elements
                        if (content is IQuickInfoContent)
                        {
                            continue;
                        }

                        var contentFullName = content.GetType().FullName;

                        // ignore the first VS element, as it's the identifier tooltip and we already have one
                        if (hasIdentifierTooltipContent && !ignoredFirstVsElement)
                        {
                            if (contentFullName == VsFullTypeNames.ContainerElement ||                          /* VS 2017 >= 15.8 */
                                contentFullName == VsFullTypeNames.QuickInfoDisplayPanel ||                         /* VS 2015 and VS 2017 < 15.8 */
                                content is ITextBuffer /* VS2012 and VS2013 */)
                            {
                                ignoredFirstVsElement = true;
                                continue;
                            }
                        }

                        // ignore Roslyn's bulb info placeholder (interactive tooltip "press ctrl+.")
                        if (contentFullName == VsFullTypeNames.LightBulbQuickInfoPlaceHolder)
                        {
                            continue;
                        }

                        if (contentFullName == VsFullTypeNames.QuickInfoDisplayPanel)
                        {
                            presenter.AddVsIdentifierContent(new VsIdentifierContent(content));
                        }
                        else if (content is string stringContent && vsSquiggleContents.Contains(stringContent))
                        {
                            presenter.AddVsSquiggleContent(new VsSquiggleContent(stringContent));
                        }
 protected abstract void AugmentQuickInfoSessionCore(
     [NotNull] IQuickInfoSession session,
     [NotNull] IList <object> quickInfoContent,
     [NotNull] IDocumentMarkup documentMarkup,
     [NotNull] TooltipFormattingProvider tooltipFormattingProvider,
     out ITrackingSpan applicableToSpan);
Exemplo n.º 12
0
        public void AugmentQuickInfoSession(IQuickInfoSession session, IList <object> quickInfoContent, out ITrackingSpan applicableToSpan)
        {
            applicableToSpan = null;

            if (session == null || quickInfoContent == null || quickInfoContent.IsReadOnly)
            {
                return;
            }

            IDocumentMarkup documentMarkup = TryGetDocumentMarkup();

            if (documentMarkup == null)
            {
                return;
            }

            // If this fail, it means the extension is disabled and none of are components are available.
            var tooltipFontProvider = Shell.Instance.TryGetComponent <TooltipFormattingProvider>();

            if (tooltipFontProvider == null)
            {
                return;
            }

            ITextSnapshot textSnapshot = _textBuffer.CurrentSnapshot;
            TextRange     textRange    = GetCurrentTextRange(session, textSnapshot);
            IShellLocks   shellLocks   = documentMarkup.Context.Locks;
            Span?         finalSpan    = null;

            Action getEnhancedTooltips = () => {
                using (shellLocks.UsingReadLock()) {
                    var presenter = new MultipleTooltipContentPresenter(tooltipFontProvider.GetTooltipFormatting());

                    List <Vs10Highlighter> highlighters = documentMarkup.GetHighlightersOver(textRange).OfType <Vs10Highlighter>().ToList();
                    foreach (Vs10Highlighter highlighter in highlighters)
                    {
                        if (presenter.TryAddContent(TryGetTooltipContent(highlighter, documentMarkup)))
                        {
                            finalSpan = highlighter.Range.ToSpan().Union(finalSpan);
                        }
                    }

                    var nonReSharperContents = new List <object>();
                    foreach (object content in quickInfoContent)
                    {
                        // ignore existing R# elements
                        if (!(content is RichTextPresenter))
                        {
                            nonReSharperContents.Add(content);
                        }
                    }

                    quickInfoContent.Clear();
                    quickInfoContent.AddRange(presenter.PresentContents());
                    quickInfoContent.AddRange(nonReSharperContents);
                }
            };

            if (shellLocks.ReentrancyGuard.TryExecute("GetEnhancedTooltips", getEnhancedTooltips) && finalSpan != null)
            {
                applicableToSpan = textSnapshot.CreateTrackingSpan(finalSpan.Value, SpanTrackingMode.EdgeInclusive);
            }
        }
Exemplo n.º 13
0
        private static ITooltipContent TryGetTooltipContent([NotNull] IHighlighter highlighter, [NotNull] IDocumentMarkup documentMarkup)
        {
            if (highlighter.Attributes.Effect.Type == EffectType.GUTTER_MARK)
            {
                return(null);
            }

            var highlighting = highlighter.UserData as IHighlighting;

            if (highlighting != null)
            {
                IDocument document = documentMarkup.Document;
                IContextBoundSettingsStore settings = document.GetSettings();

                Severity            severity     = HighlightingSettingsManager.Instance.GetSeverity(highlighting, document);
                IssueTooltipContent issueContent = TryCreateIssueContent(highlighter.RichTextToolTip, severity, settings);
                if (issueContent != null)
                {
                    return(issueContent);
                }

                PsiLanguageType languageType = TryGetIdentifierLanguage(highlighting);
                if (languageType != null)
                {
                    ISolution solution = TryGetCurrentSolution();
                    if (solution != null)
                    {
                        IdentifierTooltipContent identifierContent = TryGetIdentifierTooltipContent(highlighter, languageType, solution, settings);
                        if (identifierContent != null)
                        {
                            return(identifierContent);
                        }
                    }
                }
            }

            return(TryCreateMiscContent(highlighter.RichTextToolTip));
        }
Exemplo n.º 14
0
        protected override void AugmentQuickInfoSessionCore(
            IQuickInfoSession session,
            IList <object> quickInfoContent,
            IDocumentMarkup documentMarkup,
            TooltipFormattingProvider tooltipFormattingProvider,
            out ITrackingSpan applicableToSpan)
        {
            applicableToSpan = null;

            ITextSnapshot textSnapshot = TextBuffer.CurrentSnapshot;
            TextRange     textRange    = GetCurrentTextRange(session, textSnapshot);
            IShellLocks   shellLocks   = Shell.Instance.GetComponent <IShellLocks>();
            Span?         finalSpan    = null;

            Action getEnhancedTooltips = () => {
                using (shellLocks.UsingReadLock()) {
                    IDocument document  = documentMarkup.Document;
                    var       presenter = new MultipleTooltipContentPresenter(tooltipFormattingProvider.GetTooltipFormatting(), document);
                    IContextBoundSettingsStore settings = document.GetSettings();
                    ISolution solution = TryGetCurrentSolution();

                    bool hasIdentifierTooltipContent = false;
                    if (solution != null)
                    {
                        DocumentRange          documentRange = textRange.CreateDocumentRange(document);
                        IdentifierContentGroup contentGroup  = GetIdentifierContentGroup(documentRange, solution, settings);
                        if (contentGroup != null)
                        {
                            foreach (IdentifierTooltipContent content in contentGroup.Identifiers)
                            {
                                presenter.AddIdentifierTooltipContent(content);
                                finalSpan = content.TrackingRange.ToSpan().Union(finalSpan);
                                hasIdentifierTooltipContent = true;
                            }
                            if (contentGroup.ArgumentRole != null)
                            {
                                presenter.AddArgumentRoleTooltipContent(contentGroup.ArgumentRole);
                                if (finalSpan == null)
                                {
                                    // Only track the argument role if we have nothing else displayed.
                                    // See https://github.com/MrJul/ReSharper.EnhancedTooltip/issues/70
                                    finalSpan = contentGroup.ArgumentRole.TrackingRange.ToSpan();
                                }
                            }
                        }
                    }

                    List <Vs10Highlighter> highlighters = documentMarkup.GetHighlightersOver(textRange).OfType <Vs10Highlighter>().ToList();
                    foreach (Vs10Highlighter highlighter in highlighters)
                    {
                        IEnumerable <IReSharperTooltipContent> contents = GetTooltipContents(highlighter, highlighter.Range, documentMarkup, solution, hasIdentifierTooltipContent);
                        foreach (IReSharperTooltipContent content in contents)
                        {
                            if (presenter.TryAddReSharperContent(content))
                            {
                                finalSpan = content.TrackingRange.ToSpan().Union(finalSpan);
                            }
                        }
                    }

                    var vsSquiggleContents = session.RetrieveVsSquiggleContents()
                                             .OfType <string>()
                                             .ToHashSet();

                    bool ignoredFirstTextBuffer = false;
                    foreach (object content in quickInfoContent)
                    {
                        if (content == null)
                        {
                            continue;
                        }

                        // ignore existing R# elements
                        if (content is RichTextPresenter)
                        {
                            continue;
                        }

                        var contentFullName = content.GetType().FullName;

                        if (hasIdentifierTooltipContent)
                        {
                            // ignore Roslyn identifier tooltip (for VS2015)
                            if (contentFullName == VsFullTypeNames.QuickInfoDisplayPanel)
                            {
                                continue;
                            }

                            // ignore the first VS text buffer (for VS2012 and VS2013)
                            if (content is ITextBuffer && !ignoredFirstTextBuffer)
                            {
                                ignoredFirstTextBuffer = true;
                                continue;
                            }
                        }

                        if (contentFullName == VsFullTypeNames.LightBulbQuickInfoPlaceHolder)
                        {
                            // ignore Roslyn's bulb info placeholder (interactive tooltip "press ctrl+.")
                            continue;
                        }

                        if (contentFullName == VsFullTypeNames.QuickInfoDisplayPanel)
                        {
                            presenter.AddVsIdentifierContent(new VsIdentifierContent(content));
                        }
                        else if (vsSquiggleContents.Contains(content))
                        {
                            presenter.AddVsSquiggleContent(new VsSquiggleContent(content));
                        }
                        else
                        {
                            presenter.AddVsUnknownContent(content);
                        }
                    }

                    quickInfoContent.Clear();
                    quickInfoContent.AddRange(presenter.PresentContents());
                }
            };

            if (shellLocks.ReentrancyGuard.TryExecute("GetEnhancedTooltips", getEnhancedTooltips) && finalSpan != null)
            {
                applicableToSpan = textSnapshot.CreateTrackingSpan(finalSpan.Value, SpanTrackingMode.EdgeInclusive);
            }
        }
Exemplo n.º 15
0
        public void AugmentQuickInfoSession(IQuickInfoSession session, IList <object> quickInfoContent, out ITrackingSpan applicableToSpan)
        {
            applicableToSpan = null;

            if (session == null || quickInfoContent == null || quickInfoContent.IsReadOnly)
            {
                return;
            }

            IDocumentMarkup documentMarkup = TryGetDocumentMarkup();

            if (documentMarkup == null)
            {
                return;
            }

            // If this fail, it means the extension is disabled and none of the components are available.
            var tooltipFontProvider = Shell.Instance.TryGetComponent <TooltipFormattingProvider>();

            if (tooltipFontProvider == null)
            {
                return;
            }

            ITextSnapshot textSnapshot = _textBuffer.CurrentSnapshot;
            TextRange     textRange    = GetCurrentTextRange(session, textSnapshot);
            IShellLocks   shellLocks   = documentMarkup.Context.Locks;
            Span?         finalSpan    = null;

            Action getEnhancedTooltips = () => {
                using (shellLocks.UsingReadLock()) {
                    var presenter = new MultipleTooltipContentPresenter(tooltipFontProvider.GetTooltipFormatting());
                    IContextBoundSettingsStore settings = documentMarkup.Document.GetSettings();
                    ISolution solution = TryGetCurrentSolution();

                    bool hasIdentifierTooltipContent = false;
                    if (solution != null)
                    {
                        DocumentRange documentRange         = textRange.CreateDocumentRange(documentMarkup.Document);
                        IdentifierTooltipContent[] contents = GetIdentifierTooltipContents(documentRange, solution, settings);
                        foreach (IdentifierTooltipContent content in contents)
                        {
                            if (presenter.TryAddContent(content))
                            {
                                finalSpan = content.TrackingRange.ToSpan();
                                hasIdentifierTooltipContent = true;
                            }
                        }
                    }

                    List <Vs10Highlighter> highlighters = documentMarkup.GetHighlightersOver(textRange).OfType <Vs10Highlighter>().ToList();
                    foreach (Vs10Highlighter highlighter in highlighters)
                    {
                        ITooltipContent[] contents = GetTooltipContents(highlighter, highlighter.Range, documentMarkup, solution, hasIdentifierTooltipContent);
                        foreach (ITooltipContent content in contents)
                        {
                            if (presenter.TryAddContent(content))
                            {
                                finalSpan = content.TrackingRange.ToSpan().Union(finalSpan);
                            }
                        }
                    }

                    var  nonReSharperContents   = new List <object>();
                    bool ignoredFirstTextBuffer = false;
                    foreach (object content in quickInfoContent)
                    {
                        // ignore existing R# elements
                        if (content is RichTextPresenter)
                        {
                            continue;
                        }

                        // ignore the first VS text is we provided an identifier tooltip
                        if (content is ITextBuffer && hasIdentifierTooltipContent && !ignoredFirstTextBuffer)
                        {
                            ignoredFirstTextBuffer = true;
                            continue;
                        }

                        nonReSharperContents.Add(content);
                    }

                    quickInfoContent.Clear();
                    quickInfoContent.AddRange(presenter.PresentContents());
                    quickInfoContent.AddRange(nonReSharperContents);
                }
            };

            if (shellLocks.ReentrancyGuard.TryExecute("GetEnhancedTooltips", getEnhancedTooltips) && finalSpan != null)
            {
                applicableToSpan = textSnapshot.CreateTrackingSpan(finalSpan.Value, SpanTrackingMode.EdgeInclusive);
            }
        }