public void TryConvert_TagHelperAttribute_ReturnsTrue() { // Arrange var completionItem = new RazorCompletionItem("format", "format", RazorCompletionItemKind.TagHelperAttribute); completionItem.SetTagHelperAttributeDescriptionInfo(new AttributeDescriptionInfo(Array.Empty <TagHelperAttributeDescriptionInfo>())); // Act var result = RazorCompletionEndpoint.TryConvert(completionItem, out var converted); // Assert Assert.True(result); Assert.Equal(completionItem.DisplayText, converted.Label); Assert.Equal(completionItem.InsertText, converted.InsertText); Assert.Equal(completionItem.InsertText, converted.FilterText); Assert.Equal(completionItem.InsertText, converted.SortText); Assert.Null(converted.Detail); Assert.Null(converted.Documentation); Assert.Null(converted.Command); var descriptionInfo = completionItem.GetTagHelperAttributeDescriptionInfo(); Assert.NotNull(descriptionInfo); }
private IReadOnlyList <RazorCompletionItem> GetAttributeCompletions( SyntaxNode containingAttribute, string containingTagName, string?selectedAttributeName, IEnumerable <KeyValuePair <string, string> > attributes, TagHelperDocumentContext tagHelperDocumentContext) { var ancestors = containingAttribute.Parent.Ancestors(); var nonDirectiveAttributeTagHelpers = tagHelperDocumentContext.TagHelpers.Where(tagHelper => !tagHelper.BoundAttributes.Any(attribute => attribute.IsDirectiveAttribute())); var filteredContext = TagHelperDocumentContext.Create(tagHelperDocumentContext.Prefix, nonDirectiveAttributeTagHelpers); var(ancestorTagName, ancestorIsTagHelper) = _tagHelperFactsService.GetNearestAncestorTagInfo(ancestors); var attributeCompletionContext = new AttributeCompletionContext( filteredContext, existingCompletions: Enumerable.Empty <string>(), containingTagName, selectedAttributeName, attributes, ancestorTagName, ancestorIsTagHelper, HtmlFactsService.IsHtmlTagName); var completionItems = new List <RazorCompletionItem>(); var completionResult = _tagHelperCompletionService.GetAttributeCompletions(attributeCompletionContext); foreach (var completion in completionResult.Completions) { var filterText = completion.Key; // This is a little bit of a hack because the information returned by _razorTagHelperCompletionService.GetAttributeCompletions // does not have enough information for us to determine if a completion is an indexer completion or not. Therefore we have to // jump through a few hoops below to: // 1. Determine if this specific completion is an indexer based completion // 2. Resolve an appropriate snippet if it is. This is more troublesome because we need to remove the ... suffix to accurately // build a snippet that makes sense for the user to type. var indexerCompletion = filterText.EndsWith("...", StringComparison.Ordinal); if (indexerCompletion) { filterText = filterText.Substring(0, filterText.Length - 3); } var attributeCommitCharacters = ResolveAttributeCommitCharacters(completion.Value, indexerCompletion); var razorCompletionItem = new RazorCompletionItem( displayText: completion.Key, insertText: filterText, RazorCompletionItemKind.TagHelperAttribute, attributeCommitCharacters); var attributeDescriptions = completion.Value.Select(boundAttribute => new TagHelperAttributeDescriptionInfo( boundAttribute.DisplayName, boundAttribute.GetPropertyName(), indexerCompletion ? boundAttribute.IndexerTypeName : boundAttribute.TypeName, boundAttribute.Documentation)); var attributeDescriptionInfo = new AttributeDescriptionInfo(attributeDescriptions.ToList()); razorCompletionItem.SetTagHelperAttributeDescriptionInfo(attributeDescriptionInfo); completionItems.Add(razorCompletionItem); } return(completionItems); }