예제 #1
0
        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);
        }
예제 #3
0
        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));
        }
예제 #4
0
        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);
            }
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }
예제 #9
0
        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);
예제 #12
0
        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;
 }
예제 #14
0
 public abstract bool TryCreateTooltip(AggregateBoundElementDescription elementDescriptionInfo, [NotNullWhen(true)] out ClassifiedTextElement?tooltipContent);
예제 #15
0
 public abstract bool TryCreateTooltip(AggregateBoundElementDescription elementDescriptionInfo, MarkupKind markupKind, [NotNullWhen(true)] out MarkupContent?tooltipContent);
예제 #16
0
 public abstract bool TryCreateTooltip(AggregateBoundElementDescription descriptionInfos, out MarkupContent markupContent);