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); }
public override IHighlighter CreateHighlighter(IDocumentMarkup markup) { var highlighter = base.CreateHighlighter(markup); highlighter.UserData = new PerformanceHighlighting(DocumentRange.InvalidRange); return(highlighter); }
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); } }
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); }
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); }
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); }
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);
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); } }
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)); }
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); } }
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); } }