提交 ba30bca7 编写于 作者: J Julien Couvreur 提交者: GitHub

Tuple name completion should not include colon (#19335)

上级 4fbb078a
......@@ -576,6 +576,138 @@ class C
End Using
End Function
<WpfFact, Trait(Traits.Feature, Traits.Features.Completion)>
<WorkItem(19335, "https://github.com/dotnet/roslyn/issues/19335")>
Public Async Function ColonInTupleNameInTupleLiteral() As Task
Using state = TestState.CreateCSharpTestState(
<Document><![CDATA[
class C
{
public void M()
{
(int first, int second) t = ($$
}
}]]></Document>)
state.SendTypeChars("fi")
Await state.AssertSelectedCompletionItem(displayText:="first:", isHardSelected:=True)
Assert.Equal("first", state.CurrentCompletionPresenterSession.SelectedItem.FilterText)
state.SendTypeChars(":")
Assert.Contains("(first:", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal)
End Using
End Function
<WpfFact, Trait(Traits.Feature, Traits.Features.Completion)>
<WorkItem(19335, "https://github.com/dotnet/roslyn/issues/19335")>
Public Async Function ColonInExactTupleNameInTupleLiteral() As Task
Using state = TestState.CreateCSharpTestState(
<Document><![CDATA[
class C
{
public void M()
{
(int first, int second) t = ($$
}
}]]></Document>)
state.SendTypeChars("first")
Await state.AssertSelectedCompletionItem(displayText:="first:", isHardSelected:=True)
Assert.Equal("first", state.CurrentCompletionPresenterSession.SelectedItem.FilterText)
state.SendTypeChars(":")
Assert.Contains("(first:", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal)
End Using
End Function
<WpfFact, Trait(Traits.Feature, Traits.Features.Completion)>
<WorkItem(19335, "https://github.com/dotnet/roslyn/issues/19335")>
Public Async Function ColonInTupleNameInTupleLiteralAfterComma() As Task
Using state = TestState.CreateCSharpTestState(
<Document><![CDATA[
class C
{
public void M()
{
(int first, int second) t = (0, $$
}
}]]></Document>)
state.SendTypeChars("se")
Await state.AssertSelectedCompletionItem(displayText:="second:", isHardSelected:=True)
Assert.Equal("second", state.CurrentCompletionPresenterSession.SelectedItem.FilterText)
state.SendTypeChars(":")
Assert.Contains("(0, second:", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal)
End Using
End Function
<WpfFact, Trait(Traits.Feature, Traits.Features.Completion)>
<WorkItem(19335, "https://github.com/dotnet/roslyn/issues/19335")>
Public Async Function TabInTupleNameInTupleLiteral() As Task
Using state = TestState.CreateCSharpTestState(
<Document><![CDATA[
class C
{
public void M()
{
(int first, int second) t = ($$
}
}]]></Document>)
state.SendTypeChars("fi")
Await state.AssertSelectedCompletionItem(displayText:="first:", isHardSelected:=True)
Assert.Equal("first", state.CurrentCompletionPresenterSession.SelectedItem.FilterText)
state.SendTab()
state.SendTypeChars(":")
state.SendTypeChars("0")
Assert.Contains("(first:0", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal)
End Using
End Function
<WpfFact, Trait(Traits.Feature, Traits.Features.Completion)>
<WorkItem(19335, "https://github.com/dotnet/roslyn/issues/19335")>
Public Async Function TabInExactTupleNameInTupleLiteral() As Task
Using state = TestState.CreateCSharpTestState(
<Document><![CDATA[
class C
{
public void M()
{
(int first, int second) t = ($$
}
}]]></Document>)
state.SendTypeChars("first")
Await state.AssertSelectedCompletionItem(displayText:="first:", isHardSelected:=True)
Assert.Equal("first", state.CurrentCompletionPresenterSession.SelectedItem.FilterText)
state.SendTab()
state.SendTypeChars(":")
state.SendTypeChars("0")
Assert.Contains("(first:0", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal)
End Using
End Function
<WpfFact, Trait(Traits.Feature, Traits.Features.Completion)>
<WorkItem(19335, "https://github.com/dotnet/roslyn/issues/19335")>
Public Async Function TabInTupleNameInTupleLiteralAfterComma() As Task
Using state = TestState.CreateCSharpTestState(
<Document><![CDATA[
class C
{
public void M()
{
(int first, int second) t = (0, $$
}
}]]></Document>)
state.SendTypeChars("se")
Await state.AssertSelectedCompletionItem(displayText:="second:", isHardSelected:=True)
Assert.Equal("second", state.CurrentCompletionPresenterSession.SelectedItem.FilterText)
state.SendTab()
state.SendTypeChars(":")
state.SendTypeChars("1")
Assert.Contains("(0, second:1", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal)
End Using
End Function
<WpfFact, Trait(Traits.Feature, Traits.Features.Completion)>
<WorkItem(13527, "https://github.com/dotnet/roslyn/issues/13527")>
Public Async Function TestKeywordInTupleLiteral() As Task
......
......@@ -2,20 +2,22 @@
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Completion;
using Microsoft.CodeAnalysis.Completion.Providers;
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Extensions.ContextQuery;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Text;
namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers
{
internal class TupleNameCompletionProvider : CommonCompletionProvider
{
private static readonly CompletionItemRules _cachedRules = CompletionItemRules.Default
.WithCommitCharacterRule(CharacterSetModificationRule.Create(CharacterSetModificationKind.Remove, ':'));
private const string ColonString = ":";
public override async Task ProvideCompletionsAsync(CompletionContext completionContext)
{
......@@ -40,7 +42,7 @@ public override async Task ProvideCompletionsAsync(CompletionContext completionC
.Cast<INamedTypeSymbol>()
.ToImmutableArray();
AddItems(inferredTypes, index.Value, completionContext);
AddItems(inferredTypes, index.Value, completionContext, context.TargetToken.Parent.SpanStart);
}
private int? GetElementIndex(CSharpSyntaxContext context)
......@@ -65,7 +67,7 @@ public override async Task ProvideCompletionsAsync(CompletionContext completionC
return null;
}
private void AddItems(ImmutableArray<INamedTypeSymbol> inferredTypes, int index, CompletionContext context)
private void AddItems(ImmutableArray<INamedTypeSymbol> inferredTypes, int index, CompletionContext context, int spanStart)
{
foreach (var type in inferredTypes)
{
......@@ -74,11 +76,26 @@ private void AddItems(ImmutableArray<INamedTypeSymbol> inferredTypes, int index,
return;
}
// Note: the filter text does not include the ':'. We want to ensure that if
// the user types the name exactly (up to the colon) that it is selected as an
// exact match.
var field = type.TupleElements[index];
var item = CommonCompletionItem.Create(
field.Name + ":", _cachedRules, Glyph.FieldPublic);
context.AddItem(item);
context.AddItem(SymbolCompletionItem.CreateWithSymbolId(
displayText: field.Name + ColonString,
symbols: ImmutableArray.Create(field),
rules: CompletionItemRules.Default,
contextPosition: spanStart,
filterText: field.Name));
}
}
protected override Task<TextChange?> GetTextChangeAsync(CompletionItem selectedItem, char? ch, CancellationToken cancellationToken)
{
return Task.FromResult<TextChange?>(new TextChange(
selectedItem.Span,
selectedItem.DisplayText.Substring(0, selectedItem.DisplayText.Length - ColonString.Length)));
}
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册