未验证 提交 ffb74ce4 编写于 作者: A Allison Chou 提交者: GitHub

Merge pull request #43574 from allisonchou/SuggestionModePatternKeywordCompletion

Enable suggestion mode for certain cases in C# 9 pattern keyword completion
......@@ -1101,6 +1101,240 @@ public static void ReproMethod(Goo goo)
await VerifyNotBuilderAsync(markup);
}
[WorkItem(42368, "https://github.com/dotnet/roslyn/issues/42368")]
[Fact, Trait(Traits.Feature, Traits.Features.Completion)]
public async Task TestInDeclarationPattern()
{
var markup = @"
class C
{
void M()
{
var e = new object();
if (e is int o$$)
}
}";
await VerifyBuilderAsync(markup);
}
[WorkItem(42368, "https://github.com/dotnet/roslyn/issues/42368")]
[Fact, Trait(Traits.Feature, Traits.Features.Completion)]
public async Task TestInDeclarationPattern2()
{
var markup = @"
class C
{
void M()
{
var e = new object();
if (e is System.Collections.Generic.List<int> an$$)
}
}";
await VerifyBuilderAsync(markup);
}
[WorkItem(42368, "https://github.com/dotnet/roslyn/issues/42368")]
[Fact, Trait(Traits.Feature, Traits.Features.Completion)]
public async Task TestInRecursivePattern()
{
var markup = @"
class C
{
int P { get; }
void M(C test)
{
if (test is { P: 1 } o$$)
}
}";
await VerifyBuilderAsync(markup);
}
[WorkItem(42368, "https://github.com/dotnet/roslyn/issues/42368")]
[Fact, Trait(Traits.Feature, Traits.Features.Completion)]
public async Task TestInPropertyPattern()
{
var markup = @"
class C
{
int P { get; }
void M(C test)
{
if (test is { P: int o$$ })
}
}";
await VerifyBuilderAsync(markup);
}
[WorkItem(42368, "https://github.com/dotnet/roslyn/issues/42368")]
[Fact, Trait(Traits.Feature, Traits.Features.Completion)]
public async Task TestInAndPattern()
{
var markup = @"
class C
{
void M()
{
var e = new object();
if (e is 1 and int a$$)
}
}";
await VerifyBuilderAsync(markup);
}
[WorkItem(42368, "https://github.com/dotnet/roslyn/issues/42368")]
[Fact, Trait(Traits.Feature, Traits.Features.Completion)]
public async Task TestInAndOrPattern()
{
var markup = @"
class C
{
void M()
{
var e = new object();
if (e is (int or 1) and int a$$)
}
}";
await VerifyBuilderAsync(markup);
}
[WorkItem(42368, "https://github.com/dotnet/roslyn/issues/42368")]
[Fact, Trait(Traits.Feature, Traits.Features.Completion)]
public async Task TestInSwitchStatement()
{
var markup = @"
class C
{
void M()
{
var e = new object();
switch (e)
{
case int o$$
}
}
}";
await VerifyBuilderAsync(markup);
}
[WorkItem(42368, "https://github.com/dotnet/roslyn/issues/42368")]
[Fact, Trait(Traits.Feature, Traits.Features.Completion)]
public async Task TestInSwitchExpression()
{
var markup = @"
class C
{
void M()
{
var e = new object();
var result = e switch
{
int o$$
}
}
}";
await VerifyBuilderAsync(markup);
}
[WorkItem(42368, "https://github.com/dotnet/roslyn/issues/42368")]
[Fact, Trait(Traits.Feature, Traits.Features.Completion)]
public async Task TestMissingInNotPattern_Declaration()
{
var markup = @"
class C
{
void M()
{
var e = new object();
if (e is not int o$$)
}
}";
await VerifyNotBuilderAsync(markup);
}
[WorkItem(42368, "https://github.com/dotnet/roslyn/issues/42368")]
[Fact, Trait(Traits.Feature, Traits.Features.Completion)]
public async Task TestMissingInNotPattern_Declaration2()
{
var markup = @"
class C
{
void M()
{
var e = new object();
if (e is not (1 and int o$$))
}
}";
await VerifyNotBuilderAsync(markup);
}
[WorkItem(42368, "https://github.com/dotnet/roslyn/issues/42368")]
[Fact, Trait(Traits.Feature, Traits.Features.Completion)]
public async Task TestMissingInNotPattern_Recursive()
{
var markup = @"
class C
{
int P { get; }
void M(C test)
{
if (test is not { P: 1 } o$$)
}
}";
await VerifyNotBuilderAsync(markup);
}
[WorkItem(42368, "https://github.com/dotnet/roslyn/issues/42368")]
[Fact, Trait(Traits.Feature, Traits.Features.Completion)]
public async Task TestMissingInOrPattern()
{
var markup = @"
class C
{
void M()
{
var e = new object();
if (e is 1 or int o$$)
}
}";
await VerifyNotBuilderAsync(markup);
}
[WorkItem(42368, "https://github.com/dotnet/roslyn/issues/42368")]
[Fact, Trait(Traits.Feature, Traits.Features.Completion)]
public async Task TestMissingInAndOrPattern()
{
var markup = @"
class C
{
void M()
{
var e = new object();
if (e is 1 or int and int o$$)
}
}";
await VerifyNotBuilderAsync(markup);
}
[WorkItem(42368, "https://github.com/dotnet/roslyn/issues/42368")]
[Fact, Trait(Traits.Feature, Traits.Features.Completion)]
public async Task TestMissingInRecursiveOrPattern()
{
var markup = @"
class C
{
int P { get; }
void M(C test)
{
if (test is null or { P: 1 } o$$)
}
}";
await VerifyNotBuilderAsync(markup);
}
private async Task VerifyNotBuilderAsync(string markup)
=> await VerifyWorkerAsync(markup, isBuilder: false);
......
......@@ -92,6 +92,19 @@ void M()
if (e is System.Collections.Generic.List<int> $$");
}
[Fact, Trait(Traits.Feature, Traits.Features.KeywordRecommending)]
public async Task TestAfterRecursivePattern()
{
await VerifyKeywordAsync(
@"class C
{
int P { get; }
void M(C test)
{
if (test is { P: 1 } $$");
}
[Fact, Trait(Traits.Feature, Traits.Features.KeywordRecommending)]
public async Task TestInsideSubpattern()
{
......
......@@ -92,6 +92,19 @@ void M()
if (e is System.Collections.Generic.List<int> $$");
}
[Fact, Trait(Traits.Feature, Traits.Features.KeywordRecommending)]
public async Task TestAfterRecursivePattern()
{
await VerifyKeywordAsync(
@"class C
{
int P { get; }
void M(C test)
{
if (test is { P: 1 } $$");
}
[Fact, Trait(Traits.Feature, Traits.Features.KeywordRecommending)]
public async Task TestInsideSubpattern()
{
......
......@@ -156,6 +156,12 @@
<data name="Autoselect_disabled_due_to_possible_tuple_type_element_creation" xml:space="preserve">
<value>Autoselect disabled due to possible tuple type element creation.</value>
</data>
<data name="pattern_variable" xml:space="preserve">
<value>&lt;pattern variable&gt;</value>
</data>
<data name="Autoselect_disabled_due_to_potential_pattern_variable_declaration" xml:space="preserve">
<value>Autoselect disabled due to potential pattern variable declaration.</value>
</data>
<data name="range_variable" xml:space="preserve">
<value>&lt;range variable&gt;</value>
</data>
......
......@@ -60,6 +60,10 @@ public CSharpSuggestionModeCompletionProvider()
{
return CreateSuggestionModeItem(CSharpFeaturesResources.member_name, CSharpFeaturesResources.Autoselect_disabled_due_to_possible_explicitly_named_anonymous_type_member_creation);
}
else if (IsPotentialPatternVariableDeclaration(tree.FindTokenOnLeftOfPosition(position, cancellationToken)))
{
return CreateSuggestionModeItem(CSharpFeaturesResources.pattern_variable, CSharpFeaturesResources.Autoselect_disabled_due_to_potential_pattern_variable_declaration);
}
else if (token.IsPreProcessorExpressionContext())
{
return CreateEmptySuggestionModeItem();
......@@ -198,5 +202,40 @@ private ITypeSymbol GetDelegateType(TypeInferenceInfo typeInferenceInfo, Compila
return typeSymbol.GetDelegateType(compilation);
}
private bool IsPotentialPatternVariableDeclaration(SyntaxToken token)
{
var patternSyntax = token.GetAncestor<PatternSyntax>();
if (patternSyntax == null)
{
return false;
}
for (var current = patternSyntax; current != null; current = current.Parent as PatternSyntax)
{
// Patterns containing 'or' cannot contain valid variable declarations, e.g. 'e is 1 or int $$'
if (current.IsKind(SyntaxKind.OrPattern))
{
return false;
}
// Patterns containing 'not' cannot be valid variable declarations, e.g. 'e is not int $$' and 'e is not (1 and int $$)'
if (current.IsKind(SyntaxKind.NotPattern))
{
return false;
}
}
// e is int o$$
// e is { P: 1 } o$$
var lastTokenInPattern = patternSyntax.GetLastToken();
if (lastTokenInPattern.Parent is SingleVariableDesignationSyntax variableDesignationSyntax &&
token.Parent == variableDesignationSyntax)
{
return patternSyntax is DeclarationPatternSyntax || patternSyntax is RecursivePatternSyntax;
}
return false;
}
}
}
......@@ -77,6 +77,11 @@
<target state="new">Assign to '{0}'</target>
<note />
</trans-unit>
<trans-unit id="Autoselect_disabled_due_to_potential_pattern_variable_declaration">
<source>Autoselect disabled due to potential pattern variable declaration.</source>
<target state="new">Autoselect disabled due to potential pattern variable declaration.</target>
<note />
</trans-unit>
<trans-unit id="Compare_to_0">
<source>Compare to '{0}'</source>
<target state="new">Compare to '{0}'</target>
......@@ -237,6 +242,11 @@
<target state="translated">Automatický výběr je zakázaný kvůli možnému vytvoření elementu typu řazená kolekce členů.</target>
<note />
</trans-unit>
<trans-unit id="pattern_variable">
<source>&lt;pattern variable&gt;</source>
<target state="new">&lt;pattern variable&gt;</target>
<note />
</trans-unit>
<trans-unit id="range_variable">
<source>&lt;range variable&gt;</source>
<target state="translated">&lt;proměnná rozsahu&gt;</target>
......
......@@ -77,6 +77,11 @@
<target state="new">Assign to '{0}'</target>
<note />
</trans-unit>
<trans-unit id="Autoselect_disabled_due_to_potential_pattern_variable_declaration">
<source>Autoselect disabled due to potential pattern variable declaration.</source>
<target state="new">Autoselect disabled due to potential pattern variable declaration.</target>
<note />
</trans-unit>
<trans-unit id="Compare_to_0">
<source>Compare to '{0}'</source>
<target state="new">Compare to '{0}'</target>
......@@ -237,6 +242,11 @@
<target state="translated">Die automatische Auswahl wurde aufgrund einer möglichen Tupeltyp-Elementerstellung deaktiviert.</target>
<note />
</trans-unit>
<trans-unit id="pattern_variable">
<source>&lt;pattern variable&gt;</source>
<target state="new">&lt;pattern variable&gt;</target>
<note />
</trans-unit>
<trans-unit id="range_variable">
<source>&lt;range variable&gt;</source>
<target state="translated">&lt;Bereichsvariable&gt;</target>
......
......@@ -77,6 +77,11 @@
<target state="new">Assign to '{0}'</target>
<note />
</trans-unit>
<trans-unit id="Autoselect_disabled_due_to_potential_pattern_variable_declaration">
<source>Autoselect disabled due to potential pattern variable declaration.</source>
<target state="new">Autoselect disabled due to potential pattern variable declaration.</target>
<note />
</trans-unit>
<trans-unit id="Compare_to_0">
<source>Compare to '{0}'</source>
<target state="new">Compare to '{0}'</target>
......@@ -237,6 +242,11 @@
<target state="translated">La selección automática se deshabilitó debido a la posible creación de elementos de tipo de tupla.</target>
<note />
</trans-unit>
<trans-unit id="pattern_variable">
<source>&lt;pattern variable&gt;</source>
<target state="new">&lt;pattern variable&gt;</target>
<note />
</trans-unit>
<trans-unit id="range_variable">
<source>&lt;range variable&gt;</source>
<target state="translated">&lt;variable de intervalo&gt;</target>
......
......@@ -77,6 +77,11 @@
<target state="new">Assign to '{0}'</target>
<note />
</trans-unit>
<trans-unit id="Autoselect_disabled_due_to_potential_pattern_variable_declaration">
<source>Autoselect disabled due to potential pattern variable declaration.</source>
<target state="new">Autoselect disabled due to potential pattern variable declaration.</target>
<note />
</trans-unit>
<trans-unit id="Compare_to_0">
<source>Compare to '{0}'</source>
<target state="new">Compare to '{0}'</target>
......@@ -237,6 +242,11 @@
<target state="translated">Sélection automatique désactivée en raison de la création possible d'un élément de type tuple.</target>
<note />
</trans-unit>
<trans-unit id="pattern_variable">
<source>&lt;pattern variable&gt;</source>
<target state="new">&lt;pattern variable&gt;</target>
<note />
</trans-unit>
<trans-unit id="range_variable">
<source>&lt;range variable&gt;</source>
<target state="translated">&lt;variable de plage&gt;</target>
......
......@@ -77,6 +77,11 @@
<target state="new">Assign to '{0}'</target>
<note />
</trans-unit>
<trans-unit id="Autoselect_disabled_due_to_potential_pattern_variable_declaration">
<source>Autoselect disabled due to potential pattern variable declaration.</source>
<target state="new">Autoselect disabled due to potential pattern variable declaration.</target>
<note />
</trans-unit>
<trans-unit id="Compare_to_0">
<source>Compare to '{0}'</source>
<target state="new">Compare to '{0}'</target>
......@@ -237,6 +242,11 @@
<target state="translated">La selezione automatica è disabilitata a causa della potenziale creazione di elementi di tipo tupla.</target>
<note />
</trans-unit>
<trans-unit id="pattern_variable">
<source>&lt;pattern variable&gt;</source>
<target state="new">&lt;pattern variable&gt;</target>
<note />
</trans-unit>
<trans-unit id="range_variable">
<source>&lt;range variable&gt;</source>
<target state="translated">&lt;variabile di intervallo&gt;</target>
......
......@@ -77,6 +77,11 @@
<target state="new">Assign to '{0}'</target>
<note />
</trans-unit>
<trans-unit id="Autoselect_disabled_due_to_potential_pattern_variable_declaration">
<source>Autoselect disabled due to potential pattern variable declaration.</source>
<target state="new">Autoselect disabled due to potential pattern variable declaration.</target>
<note />
</trans-unit>
<trans-unit id="Compare_to_0">
<source>Compare to '{0}'</source>
<target state="new">Compare to '{0}'</target>
......@@ -237,6 +242,11 @@
<target state="translated">タプル型の要素が作成された可能性があるため、自動選択は無効になっています。</target>
<note />
</trans-unit>
<trans-unit id="pattern_variable">
<source>&lt;pattern variable&gt;</source>
<target state="new">&lt;pattern variable&gt;</target>
<note />
</trans-unit>
<trans-unit id="range_variable">
<source>&lt;range variable&gt;</source>
<target state="translated">&lt;範囲変数&gt;</target>
......
......@@ -77,6 +77,11 @@
<target state="new">Assign to '{0}'</target>
<note />
</trans-unit>
<trans-unit id="Autoselect_disabled_due_to_potential_pattern_variable_declaration">
<source>Autoselect disabled due to potential pattern variable declaration.</source>
<target state="new">Autoselect disabled due to potential pattern variable declaration.</target>
<note />
</trans-unit>
<trans-unit id="Compare_to_0">
<source>Compare to '{0}'</source>
<target state="new">Compare to '{0}'</target>
......@@ -237,6 +242,11 @@
<target state="translated">가능한 튜플 형식 요소 만들기로 인해 자동 선택을 사용할 수 없습니다.</target>
<note />
</trans-unit>
<trans-unit id="pattern_variable">
<source>&lt;pattern variable&gt;</source>
<target state="new">&lt;pattern variable&gt;</target>
<note />
</trans-unit>
<trans-unit id="range_variable">
<source>&lt;range variable&gt;</source>
<target state="translated">&lt;범위 변수&gt;</target>
......
......@@ -77,6 +77,11 @@
<target state="new">Assign to '{0}'</target>
<note />
</trans-unit>
<trans-unit id="Autoselect_disabled_due_to_potential_pattern_variable_declaration">
<source>Autoselect disabled due to potential pattern variable declaration.</source>
<target state="new">Autoselect disabled due to potential pattern variable declaration.</target>
<note />
</trans-unit>
<trans-unit id="Compare_to_0">
<source>Compare to '{0}'</source>
<target state="new">Compare to '{0}'</target>
......@@ -237,6 +242,11 @@
<target state="translated">Funkcja automatycznego wyboru została wyłączona ze względu na prawdopodobne utworzenie elementu typu krotki.</target>
<note />
</trans-unit>
<trans-unit id="pattern_variable">
<source>&lt;pattern variable&gt;</source>
<target state="new">&lt;pattern variable&gt;</target>
<note />
</trans-unit>
<trans-unit id="range_variable">
<source>&lt;range variable&gt;</source>
<target state="translated">&lt;zmienna zakresu&gt;</target>
......
......@@ -77,6 +77,11 @@
<target state="new">Assign to '{0}'</target>
<note />
</trans-unit>
<trans-unit id="Autoselect_disabled_due_to_potential_pattern_variable_declaration">
<source>Autoselect disabled due to potential pattern variable declaration.</source>
<target state="new">Autoselect disabled due to potential pattern variable declaration.</target>
<note />
</trans-unit>
<trans-unit id="Compare_to_0">
<source>Compare to '{0}'</source>
<target state="new">Compare to '{0}'</target>
......@@ -237,6 +242,11 @@
<target state="translated">Seleção automática desabilitada devido a uma possível criação de elemento do tipo tupla.</target>
<note />
</trans-unit>
<trans-unit id="pattern_variable">
<source>&lt;pattern variable&gt;</source>
<target state="new">&lt;pattern variable&gt;</target>
<note />
</trans-unit>
<trans-unit id="range_variable">
<source>&lt;range variable&gt;</source>
<target state="translated">&lt;variável de intervalo&gt;</target>
......
......@@ -77,6 +77,11 @@
<target state="new">Assign to '{0}'</target>
<note />
</trans-unit>
<trans-unit id="Autoselect_disabled_due_to_potential_pattern_variable_declaration">
<source>Autoselect disabled due to potential pattern variable declaration.</source>
<target state="new">Autoselect disabled due to potential pattern variable declaration.</target>
<note />
</trans-unit>
<trans-unit id="Compare_to_0">
<source>Compare to '{0}'</source>
<target state="new">Compare to '{0}'</target>
......@@ -237,6 +242,11 @@
<target state="translated">Автовыбор отключен из-за возможного создания элемента типа кортежа.</target>
<note />
</trans-unit>
<trans-unit id="pattern_variable">
<source>&lt;pattern variable&gt;</source>
<target state="new">&lt;pattern variable&gt;</target>
<note />
</trans-unit>
<trans-unit id="range_variable">
<source>&lt;range variable&gt;</source>
<target state="translated">&lt;переменная диапазона&gt;</target>
......
......@@ -77,6 +77,11 @@
<target state="new">Assign to '{0}'</target>
<note />
</trans-unit>
<trans-unit id="Autoselect_disabled_due_to_potential_pattern_variable_declaration">
<source>Autoselect disabled due to potential pattern variable declaration.</source>
<target state="new">Autoselect disabled due to potential pattern variable declaration.</target>
<note />
</trans-unit>
<trans-unit id="Compare_to_0">
<source>Compare to '{0}'</source>
<target state="new">Compare to '{0}'</target>
......@@ -237,6 +242,11 @@
<target state="translated">Olası demet türü öğe oluşturma işleminden dolayı Otomatik seçim devre dışı bırakıldı.</target>
<note />
</trans-unit>
<trans-unit id="pattern_variable">
<source>&lt;pattern variable&gt;</source>
<target state="new">&lt;pattern variable&gt;</target>
<note />
</trans-unit>
<trans-unit id="range_variable">
<source>&lt;range variable&gt;</source>
<target state="translated">&lt; Aralık değişkeni &gt;</target>
......
......@@ -77,6 +77,11 @@
<target state="new">Assign to '{0}'</target>
<note />
</trans-unit>
<trans-unit id="Autoselect_disabled_due_to_potential_pattern_variable_declaration">
<source>Autoselect disabled due to potential pattern variable declaration.</source>
<target state="new">Autoselect disabled due to potential pattern variable declaration.</target>
<note />
</trans-unit>
<trans-unit id="Compare_to_0">
<source>Compare to '{0}'</source>
<target state="new">Compare to '{0}'</target>
......@@ -237,6 +242,11 @@
<target state="translated">由于可能的元组类型元素创建,已禁用自动选择。</target>
<note />
</trans-unit>
<trans-unit id="pattern_variable">
<source>&lt;pattern variable&gt;</source>
<target state="new">&lt;pattern variable&gt;</target>
<note />
</trans-unit>
<trans-unit id="range_variable">
<source>&lt;range variable&gt;</source>
<target state="translated">&lt;范围变量&gt;</target>
......
......@@ -77,6 +77,11 @@
<target state="new">Assign to '{0}'</target>
<note />
</trans-unit>
<trans-unit id="Autoselect_disabled_due_to_potential_pattern_variable_declaration">
<source>Autoselect disabled due to potential pattern variable declaration.</source>
<target state="new">Autoselect disabled due to potential pattern variable declaration.</target>
<note />
</trans-unit>
<trans-unit id="Compare_to_0">
<source>Compare to '{0}'</source>
<target state="new">Compare to '{0}'</target>
......@@ -237,6 +242,11 @@
<target state="translated">因為可能建立元組類型元素,所以停用自動選擇。</target>
<note />
</trans-unit>
<trans-unit id="pattern_variable">
<source>&lt;pattern variable&gt;</source>
<target state="new">&lt;pattern variable&gt;</target>
<note />
</trans-unit>
<trans-unit id="range_variable">
<source>&lt;range variable&gt;</source>
<target state="translated">&lt;範圍變數&gt;</target>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册