public override bool TryCreateTooltip(AggregateBoundElementDescription elementDescriptionInfo, out MarkupContent tooltipContent) { if (elementDescriptionInfo is null) { throw new ArgumentNullException(nameof(elementDescriptionInfo)); } var associatedTagHelperInfos = elementDescriptionInfo.AssociatedTagHelperDescriptions; if (associatedTagHelperInfos.Count == 0) { tooltipContent = null; return(false); } // This generates a markdown description that looks like the following: // **SomeTagHelper** // // The Summary documentation text with `CrefTypeValues` in code. // // Additional description infos result in a triple `---` to separate the markdown entries. var descriptionBuilder = new StringBuilder(); for (var i = 0; i < associatedTagHelperInfos.Count; i++) { var descriptionInfo = associatedTagHelperInfos[i]; if (descriptionBuilder.Length > 0) { descriptionBuilder.AppendLine(); descriptionBuilder.AppendLine("---"); } var tagHelperType = descriptionInfo.TagHelperTypeName; var reducedTypeName = ReduceTypeName(tagHelperType); StartOrEndBold(descriptionBuilder); descriptionBuilder.Append(reducedTypeName); StartOrEndBold(descriptionBuilder); var documentation = descriptionInfo.Documentation; if (!TryExtractSummary(documentation, out var summaryContent)) { continue; } descriptionBuilder.AppendLine(); descriptionBuilder.AppendLine(); var finalSummaryContent = CleanSummaryContent(summaryContent); descriptionBuilder.Append(finalSummaryContent); } tooltipContent = new MarkupContent { Kind = GetMarkupKind() }; tooltipContent.Value = descriptionBuilder.ToString(); return(true); }
public void TryCreateTooltip_Markup_Element_MultipleAssociatedTagHelpers_ReturnsTrue() { // Arrange var descriptionFactory = new DefaultLSPTagHelperTooltipFactory(LanguageServer); var associatedTagHelperInfos = new[] { new BoundElementDescriptionInfo("Microsoft.AspNetCore.SomeTagHelper", "<summary>\nUses <see cref=\"T:System.Collections.List{System.String}\" />s\n</summary>"), new BoundElementDescriptionInfo("Microsoft.AspNetCore.OtherTagHelper", "<summary>\nAlso uses <see cref=\"T:System.Collections.List{System.String}\" />s\n\r\n\r\r</summary>"), }; var elementDescription = new AggregateBoundElementDescription(associatedTagHelperInfos); // Act var result = descriptionFactory.TryCreateTooltip(elementDescription, out var markdown); // Assert Assert.True(result); Assert.Equal(@"**SomeTagHelper** Uses `List<System.String>`s --- **OtherTagHelper** Also uses `List<System.String>`s", markdown.Value); Assert.Equal(MarkupKind.Markdown, markdown.Kind); }
public void TryCreateTooltip_ClassifiedTextElement_Element_MultipleAssociatedTagHelpers_ReturnsTrue() { // Arrange var descriptionFactory = new DefaultVSLSPTagHelperTooltipFactory(); var associatedTagHelperInfos = new[] { new BoundElementDescriptionInfo("Microsoft.AspNetCore.SomeTagHelper", "<summary>\nUses <see cref=\"T:System.Collections.List{System.String}\" />s\n</summary>"), new BoundElementDescriptionInfo("Microsoft.AspNetCore.OtherTagHelper", "<summary>\nAlso uses <see cref=\"T:System.Collections.List{System.String}\" />s\n\r\n\r\r</summary>"), }; var elementDescription = new AggregateBoundElementDescription(associatedTagHelperInfos); // Act var result = descriptionFactory.TryCreateTooltip(elementDescription, out VSClassifiedTextElement classifiedTextElement); // Assert Assert.True(result); // Expected output: // Microsoft.AspNetCore.SomeTagHelper // Uses List<string>s // // Microsoft.AspNetCore.OtherTagHelper // Also uses List<string>s Assert.Collection(classifiedTextElement.Runs, run => AssertExpectedClassification(run, "Microsoft", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, ".", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "AspNetCore", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, ".", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "SomeTagHelper", VSPredefinedClassificationTypeNames.Type), run => AssertExpectedClassification(run, Environment.NewLine, VSPredefinedClassificationTypeNames.WhiteSpace), run => AssertExpectedClassification(run, "Uses ", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, "List", VSPredefinedClassificationTypeNames.Type), run => AssertExpectedClassification(run, "<", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "string", VSPredefinedClassificationTypeNames.Keyword), run => AssertExpectedClassification(run, ">", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "s", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, Environment.NewLine, VSPredefinedClassificationTypeNames.WhiteSpace), run => AssertExpectedClassification(run, Environment.NewLine, VSPredefinedClassificationTypeNames.WhiteSpace), run => AssertExpectedClassification(run, "Microsoft", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, ".", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "AspNetCore", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, ".", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "OtherTagHelper", VSPredefinedClassificationTypeNames.Type), run => AssertExpectedClassification(run, Environment.NewLine, VSPredefinedClassificationTypeNames.WhiteSpace), run => AssertExpectedClassification(run, "Also uses ", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, "List", VSPredefinedClassificationTypeNames.Type), run => AssertExpectedClassification(run, "<", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "string", VSPredefinedClassificationTypeNames.Keyword), run => AssertExpectedClassification(run, ">", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "s", VSPredefinedClassificationTypeNames.Text)); }
private HoverModel ElementInfoToHover(IEnumerable <TagHelperDescriptor> descriptors, RangeModel range, ClientCapabilities clientCapabilities) { var descriptionInfos = descriptors.Select(descriptor => BoundElementDescriptionInfo.From(descriptor)) .ToList() .AsReadOnly(); var elementDescriptionInfo = new AggregateBoundElementDescription(descriptionInfos); var isVSClient = clientCapabilities is PlatformAgnosticClientCapabilities platformAgnosticClientCapabilities && platformAgnosticClientCapabilities.SupportsVisualStudioExtensions; if (isVSClient && _vsLspTagHelperTooltipFactory.TryCreateTooltip(elementDescriptionInfo, out ContainerElement classifiedTextElement)) { var vsHover = new OmniSharpVSHover { Contents = new MarkedStringsOrMarkupContent(), Range = range, RawContent = classifiedTextElement, }; return(vsHover); } else { var hoverContentFormat = GetHoverContentFormat(clientCapabilities); if (!_lspTagHelperTooltipFactory.TryCreateTooltip(elementDescriptionInfo, hoverContentFormat, out var vsMarkupContent)) { return(null); } Enum.TryParse(vsMarkupContent.Kind.Value, out MarkupKind markupKind); var markupContent = new MarkupContent() { Value = vsMarkupContent.Value, Kind = markupKind, }; var hover = new HoverModel { Contents = new MarkedStringsOrMarkupContent(markupContent), Range = range }; return(hover); } }
public void TryCreateTooltip_Markup_Element_PlainText_NoBold() { // Arrange var descriptionFactory = new DefaultLSPTagHelperTooltipFactory(); var associatedTagHelperInfos = new[] { new BoundElementDescriptionInfo("Microsoft.AspNetCore.SomeTagHelper", "<summary>Uses <see cref=\"T:System.Collections.List{System.String}\" />s</summary>"), }; var elementDescription = new AggregateBoundElementDescription(associatedTagHelperInfos); // Act var result = descriptionFactory.TryCreateTooltip(elementDescription, MarkupKind.PlainText, out var markdown); // Assert Assert.True(result, "TryCreateTooltip should have succeeded"); Assert.Equal(@"SomeTagHelper Uses `List<System.String>`s", markdown.Value); Assert.Equal(MarkupKind.PlainText, markdown.Kind); }
private HoverModel ElementInfoToHover(IEnumerable <TagHelperDescriptor> descriptors, RangeModel range) { var descriptionInfos = descriptors.Select(descriptor => BoundElementDescriptionInfo.From(descriptor)) .ToList() .AsReadOnly(); var elementDescriptionInfo = new AggregateBoundElementDescription(descriptionInfos); if (!_tagHelperTooltipFactory.TryCreateTooltip(elementDescriptionInfo, out var markupContent)) { return(null); } var hover = new HoverModel { Contents = new MarkedStringsOrMarkupContent(markupContent), Range = range }; return(hover); }
private IReadOnlyList <RazorCompletionItem> GetElementCompletions( SyntaxNode containingTag, string containingTagName, IEnumerable <KeyValuePair <string, string> > attributes, TagHelperDocumentContext tagHelperDocumentContext) { var ancestors = containingTag.Ancestors(); var(ancestorTagName, ancestorIsTagHelper) = _tagHelperFactsService.GetNearestAncestorTagInfo(ancestors); var elementCompletionContext = new ElementCompletionContext( tagHelperDocumentContext, existingCompletions: Enumerable.Empty <string>(), containingTagName, attributes, ancestorTagName, ancestorIsTagHelper, HtmlFactsService.IsHtmlTagName); var completionItems = new List <RazorCompletionItem>(); var completionResult = _tagHelperCompletionService.GetElementCompletions(elementCompletionContext); foreach (var completion in completionResult.Completions) { var razorCompletionItem = new RazorCompletionItem( displayText: completion.Key, insertText: completion.Key, RazorCompletionItemKind.TagHelperElement, ElementCommitCharacters); var tagHelperDescriptions = completion.Value.Select(tagHelper => BoundElementDescriptionInfo.From(tagHelper)); var elementDescription = new AggregateBoundElementDescription(tagHelperDescriptions.ToList()); razorCompletionItem.SetTagHelperElementDescriptionInfo(elementDescription); completionItems.Add(razorCompletionItem); } return(completionItems); }
public void TryCreateTooltip_Markup_Element_BothPlainTextAndMarkdown_IsBold() { // Arrange var languageServer = LanguageServer; languageServer.ClientSettings.Capabilities.TextDocument.Completion.Value.CompletionItem.DocumentationFormat = new Container <MarkupKind>(MarkupKind.PlainText, MarkupKind.Markdown); var descriptionFactory = new DefaultLSPTagHelperTooltipFactory(languageServer); var associatedTagHelperInfos = new[] { new BoundElementDescriptionInfo("Microsoft.AspNetCore.SomeTagHelper", "<summary>Uses <see cref=\"T:System.Collections.List{System.String}\" />s</summary>"), }; var elementDescription = new AggregateBoundElementDescription(associatedTagHelperInfos); // Act var result = descriptionFactory.TryCreateTooltip(elementDescription, out var markdown); // Assert Assert.True(result); Assert.Equal(@"**SomeTagHelper** Uses `List<System.String>`s", markdown.Value); Assert.Equal(MarkupKind.Markdown, markdown.Kind); }
public void TryCreateTooltip_ClassifiedTextElement_Element_NamespaceContainsTypeName_ReturnsTrue() { // Arrange var descriptionFactory = new DefaultVSLSPTagHelperTooltipFactory(); var associatedTagHelperInfos = new[] { new BoundElementDescriptionInfo( "Microsoft.AspNetCore.SomeTagHelper.SomeTagHelper", "<summary>Uses <see cref=\"T:A.B.C{C.B}\" />s</summary>"), }; var elementDescription = new AggregateBoundElementDescription(associatedTagHelperInfos); // Act var result = descriptionFactory.TryCreateTooltip(elementDescription, out VSClassifiedTextElement classifiedTextElement); // Assert Assert.True(result); // Expected output: // Microsoft.AspNetCore.SomeTagHelper.SomeTagHelper // Uses C<B>s Assert.Collection(classifiedTextElement.Runs, run => AssertExpectedClassification(run, "Microsoft", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, ".", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "AspNetCore", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, ".", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "SomeTagHelper", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, ".", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "SomeTagHelper", VSPredefinedClassificationTypeNames.Type), run => AssertExpectedClassification(run, Environment.NewLine, VSPredefinedClassificationTypeNames.WhiteSpace), run => AssertExpectedClassification(run, "Uses ", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, "C", VSPredefinedClassificationTypeNames.Type), run => AssertExpectedClassification(run, "<", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "B", VSPredefinedClassificationTypeNames.Type), run => AssertExpectedClassification(run, ">", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "s", VSPredefinedClassificationTypeNames.Text)); }
public abstract bool TryCreateTooltip(AggregateBoundElementDescription elementDescriptionInfo, out VSContainerElement tooltipContent);
public abstract bool TryCreateTooltip(AggregateBoundElementDescription elementDescriptionInfo, out VSClassifiedTextElement tooltipContent);
public void TryCreateTooltip_ContainerElement_Attribute_MultipleAssociatedTagHelpers_ReturnsTrue() { // Arrange var descriptionFactory = new DefaultVSLSPTagHelperTooltipFactory(); var associatedTagHelperInfos = new[] { new BoundElementDescriptionInfo("Microsoft.AspNetCore.SomeTagHelper", "<summary>\nUses <see cref=\"T:System.Collections.List{System.String}\" />s\n</summary>"), new BoundElementDescriptionInfo("Microsoft.AspNetCore.OtherTagHelper", "<summary>\nAlso uses <see cref=\"T:System.Collections.List{System.String}\" />s\n\r\n\r\r</summary>"), }; var elementDescription = new AggregateBoundElementDescription(associatedTagHelperInfos); // Act var result = descriptionFactory.TryCreateTooltip(elementDescription, out VSContainerElement container); // Assert Assert.True(result); var containerElements = container.Elements.ToList(); // Expected output: // [Class Glyph] Microsoft.AspNetCore.SomeTagHelper // Uses List<string>s // // [Class Glyph] Microsoft.AspNetCore.OtherTagHelper // Also uses List<string>s Assert.Equal(VSContainerElementStyle.Stacked, container.Style); Assert.Equal(4, containerElements.Count); // [Class Glyph] Microsoft.AspNetCore.SomeTagHelper var innerContainer = ((VSContainerElement)containerElements[0]).Elements.ToList(); var classifiedTextElement = (VSClassifiedTextElement)innerContainer[1]; Assert.Equal(2, innerContainer.Count); Assert.Equal(ClassGlyph, innerContainer[0]); Assert.Collection(classifiedTextElement.Runs, run => AssertExpectedClassification(run, "Microsoft", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, ".", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "AspNetCore", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, ".", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "SomeTagHelper", VSPredefinedClassificationTypeNames.Type)); // Uses List<string>s innerContainer = ((VSContainerElement)containerElements[1]).Elements.ToList(); classifiedTextElement = (VSClassifiedTextElement)innerContainer[0]; Assert.Single(innerContainer); Assert.Collection(classifiedTextElement.Runs, run => AssertExpectedClassification(run, "Uses ", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, "List", VSPredefinedClassificationTypeNames.Type), run => AssertExpectedClassification(run, "<", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "string", VSPredefinedClassificationTypeNames.Keyword), run => AssertExpectedClassification(run, ">", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "s", VSPredefinedClassificationTypeNames.Text)); // [Class Glyph] Microsoft.AspNetCore.OtherTagHelper innerContainer = ((VSContainerElement)containerElements[2]).Elements.ToList(); classifiedTextElement = (VSClassifiedTextElement)innerContainer[1]; Assert.Equal(2, innerContainer.Count); Assert.Equal(ClassGlyph, innerContainer[0]); Assert.Collection(classifiedTextElement.Runs, run => AssertExpectedClassification(run, "Microsoft", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, ".", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "AspNetCore", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, ".", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "OtherTagHelper", VSPredefinedClassificationTypeNames.Type)); // Also uses List<string>s innerContainer = ((VSContainerElement)containerElements[3]).Elements.ToList(); classifiedTextElement = (VSClassifiedTextElement)innerContainer[0]; Assert.Single(innerContainer); Assert.Collection(classifiedTextElement.Runs, run => AssertExpectedClassification(run, "Also uses ", VSPredefinedClassificationTypeNames.Text), run => AssertExpectedClassification(run, "List", VSPredefinedClassificationTypeNames.Type), run => AssertExpectedClassification(run, "<", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "string", VSPredefinedClassificationTypeNames.Keyword), run => AssertExpectedClassification(run, ">", VSPredefinedClassificationTypeNames.Punctuation), run => AssertExpectedClassification(run, "s", VSPredefinedClassificationTypeNames.Text)); }
public static void SetTagHelperElementDescriptionInfo(this RazorCompletionItem completionItem, AggregateBoundElementDescription elementDescriptionInfo) { completionItem.Items[s_tagHelperElementCompletionDescriptionKey] = elementDescriptionInfo; }
public abstract bool TryCreateTooltip(AggregateBoundElementDescription elementDescriptionInfo, [NotNullWhen(true)] out ClassifiedTextElement?tooltipContent);
public abstract bool TryCreateTooltip(AggregateBoundElementDescription elementDescriptionInfo, MarkupKind markupKind, [NotNullWhen(true)] out MarkupContent?tooltipContent);
public abstract bool TryCreateTooltip(AggregateBoundElementDescription descriptionInfos, out MarkupContent markupContent);