提交 f392bc6c 编写于 作者: L lorcanmooney

Suggest paramref and typeparamref in VB

上级 c11717e3
......@@ -104,7 +104,35 @@ Class C
End Class
"
Await VerifyItemsExistAsync(text, "code", "list", "para", "paramref", "typeparamref")
Await VerifyItemsExistAsync(text, "code", "list", "para")
End Function
<Fact, Trait(Traits.Feature, Traits.Features.Completion)>
Public Async Function TestRepeatableNestedParamRefAndTypeParamRefTagsOnMethod() As Task
Dim text = "
Class C
''' <summary>
''' <$$
''' </summary>
Sub Foo(Of T)(i as Integer)
End Sub
End Class
"
Await VerifyItemsExistAsync(text, "paramref name=""i""", "typeparamref name=""T""")
End Function
<Fact, Trait(Traits.Feature, Traits.Features.Completion)>
Public Async Function TestRepeatableNestedTypeParamRefTagOnClass() As Task
Dim text = "
''' <summary>
''' <$$
''' </summary>
Class C(Of T)
End Class
"
Await VerifyItemsExistAsync(text, "typeparamref name=""T""")
End Function
<Fact, Trait(Traits.Feature, Traits.Features.Completion)>
......@@ -376,7 +404,7 @@ Module Program
End Module
"
Await VerifyItemsExistAsync(text, "code", "list", "para", "paramref", "typeparamref")
Await VerifyItemsExistAsync(text, "code", "list", "para")
End Function
<Fact, Trait(Traits.Feature, Traits.Features.Completion)>
......
......@@ -73,20 +73,7 @@ protected override async Task<IEnumerable<CompletionItem>> GetItemsWorkerAsync(D
// The user is typing inside an XmlElement
if (token.Parent.Parent.Kind() == SyntaxKind.XmlElement)
{
// Add corresponding tags except ParamRefTag and TypeParamRefTag
items.AddRange(NestedTagNames.Where(name => name != ParamRefTagName && name != TypeParamRefTagName)
.Select(name => GetItem(name, span)));
if (declaredSymbol != null)
{
// Add a ParamRefTag for each available parameter
var parameters = declaredSymbol.GetParameters();
items.AddRange(parameters.Select(p => CreateCompletionItem(span, FormatParameter(ParamRefTagName, p.Name))));
// Add a TypeParamRefTag for each available type parameter
var typeParameters = declaredSymbol.GetTypeParameters();
items.AddRange(typeParameters.Select(t => CreateCompletionItem(span, FormatParameter(TypeParamRefTagName, t.Name))));
}
items.AddRange(GetNestedTags(span, declaredSymbol));
}
if (token.Parent.Parent.Kind() == SyntaxKind.XmlElement && ((XmlElementSyntax)token.Parent.Parent).StartTag.Name.LocalName.ValueText == ListTagName)
......
......@@ -4,6 +4,7 @@
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
using System.Collections.Immutable;
......@@ -117,12 +118,46 @@ protected IEnumerable<CompletionItem> GetAlwaysVisibleItems(TextSpan itemSpan)
protected IEnumerable<string> NestedTagNames
{
get { return new[] { CTagName, CodeTagName, ParaTagName, ListTagName, ParamRefTagName, TypeParamRefTagName }; }
get { return new[] { CTagName, CodeTagName, ParaTagName, ListTagName }; }
}
protected IEnumerable<CompletionItem> GetNestedTags(TextSpan itemSpan)
protected IEnumerable<CompletionItem> GetNestedTags(TextSpan itemSpan, ISymbol declaredSymbol)
{
return NestedTagNames.Select(t => GetItem(t, itemSpan));
return NestedTagNames.Select(t => GetItem(t, itemSpan))
.Concat(GetParamRefItems(itemSpan, declaredSymbol))
.Concat(GetTypeParamRefItems(itemSpan, declaredSymbol));
}
private IEnumerable<CompletionItem> GetParamRefItems(TextSpan itemSpan, ISymbol declaredSymbol)
{
var parameters = declaredSymbol?.GetParameters().Select(p => p.Name).ToSet();
if (parameters == null)
{
return SpecializedCollections.EmptyEnumerable<CompletionItem>();
}
return parameters.Select(p => CreateCompletionItem(
span: itemSpan,
displayText: FormatParameter(ParamRefTagName, p),
beforeCaretText: FormatParameterRefTag(ParamRefTagName, p),
afterCaretText: string.Empty));
}
private IEnumerable<CompletionItem> GetTypeParamRefItems(TextSpan itemSpan, ISymbol declaredSymbol)
{
var typeParameters = declaredSymbol?.GetTypeParameters().Select(t => t.Name).ToSet();
if (typeParameters == null)
{
return SpecializedCollections.EmptyEnumerable<CompletionItem>();
}
return typeParameters.Select(t => CreateCompletionItem(
span: itemSpan,
displayText: FormatParameter(TypeParamRefTagName, t),
beforeCaretText: FormatParameterRefTag(TypeParamRefTagName, t),
afterCaretText: string.Empty));
}
protected IEnumerable<CompletionItem> GetTopLevelRepeatableItems(TextSpan itemSpan)
......@@ -148,6 +183,11 @@ protected string FormatParameter(string kind, string name)
return $"{kind} {NameAttributeName}=\"{name}\"";
}
private string FormatParameterRefTag(string kind, string name)
{
return $"<{kind} {NameAttributeName}=\"{name}\"/>";
}
public override async Task<CompletionChange> GetChangeAsync(Document document, CompletionItem item, char? commitChar = default(char?), CancellationToken cancellationToken = default(CancellationToken))
{
var text = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);
......
......@@ -94,8 +94,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
Dim grandParent = parentElement.Parent
Dim symbol = semanticModel.GetDeclaredSymbol(declaration, cancellationToken)
If grandParent.IsKind(SyntaxKind.XmlElement) Then
items.AddRange(GetNestedTags(span))
items.AddRange(GetNestedTags(span, symbol))
If GetStartTagName(grandParent) = ListTagName Then
items.AddRange(GetListItems(span))
......@@ -105,7 +107,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
items.AddRange(GetListHeaderItems(span))
End If
ElseIf token.Parent.IsKind(SyntaxKind.XmlText) AndAlso token.Parent.Parent.IsKind(SyntaxKind.XmlElement) Then
items.AddRange(GetNestedTags(span))
items.AddRange(GetNestedTags(span, symbol))
If GetStartTagName(token.Parent.Parent) = ListTagName Then
items.AddRange(GetListItems(span))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册