From a846c93f4bbb5a5fcba0a7608fd2166acbfbedbd Mon Sep 17 00:00:00 2001 From: Julien Couvreur Date: Fri, 22 Mar 2019 18:07:01 +0100 Subject: [PATCH] Fix completion after null-coalescing assignment (#34348) --- .../GenerateMethod/GenerateMethodTests.cs | 54 +++++++++++++++++++ .../NewKeywordRecommenderTests.cs | 8 +++ .../ContextQuery/SyntaxTreeExtensions.cs | 4 +- 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/EditorFeatures/CSharpTest/Diagnostics/GenerateMethod/GenerateMethodTests.cs b/src/EditorFeatures/CSharpTest/Diagnostics/GenerateMethod/GenerateMethodTests.cs index 4fc3440faee..0540fd6c498 100644 --- a/src/EditorFeatures/CSharpTest/Diagnostics/GenerateMethod/GenerateMethodTests.cs +++ b/src/EditorFeatures/CSharpTest/Diagnostics/GenerateMethod/GenerateMethodTests.cs @@ -44,6 +44,60 @@ private void Goo() }"); } + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateMethod)] + public async Task TestOnRightOfNullCoalescingAssignment_NullableBool() + { + await TestInRegularAndScriptAsync( +@"class Class +{ + void Method(bool? b) + { + b ??= [|Goo|](); + } +}", +@"using System; + +class Class +{ + void Method(bool? b) + { + b ??= Goo(); + } + + private bool? Goo() + { + throw new NotImplementedException(); + } +}"); + } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateMethod)] + public async Task TestOnRightOfNullCoalescingAssignment_String() + { + await TestInRegularAndScriptAsync( +@"class Class +{ + void Method(string s) + { + s ??= [|Goo|](); + } +}", +@"using System; + +class Class +{ + void Method(string s) + { + s ??= Goo(); + } + + private string Goo() + { + throw new NotImplementedException(); + } +}"); + } + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateMethod)] public async Task TestSimpleInvocationIntoSameType_CodeStyle1() { diff --git a/src/EditorFeatures/CSharpTest2/Recommendations/NewKeywordRecommenderTests.cs b/src/EditorFeatures/CSharpTest2/Recommendations/NewKeywordRecommenderTests.cs index 721a88f6469..2477a88596b 100644 --- a/src/EditorFeatures/CSharpTest2/Recommendations/NewKeywordRecommenderTests.cs +++ b/src/EditorFeatures/CSharpTest2/Recommendations/NewKeywordRecommenderTests.cs @@ -117,6 +117,14 @@ public async Task TestStartOfExpression() @"var q = $$")); } + [Fact, Trait(Traits.Feature, Traits.Features.KeywordRecommending)] + [WorkItem(34324, "https://github.com/dotnet/roslyn/issues/34324")] + public async Task TestAfterNullCoalescingAssignment() + { + await VerifyKeywordAsync(AddInsideMethod( +@"q ??= $$")); + } + [Fact, Trait(Traits.Feature, Traits.Features.KeywordRecommending)] public async Task TestInParenthesizedExpression() { diff --git a/src/Workspaces/CSharp/Portable/Extensions/ContextQuery/SyntaxTreeExtensions.cs b/src/Workspaces/CSharp/Portable/Extensions/ContextQuery/SyntaxTreeExtensions.cs index 56e11f2c57d..2e62455fb78 100644 --- a/src/Workspaces/CSharp/Portable/Extensions/ContextQuery/SyntaxTreeExtensions.cs +++ b/src/Workspaces/CSharp/Portable/Extensions/ContextQuery/SyntaxTreeExtensions.cs @@ -2023,6 +2023,7 @@ public static bool IsLabelContext(this SyntaxTree syntaxTree, int position, Canc // q |= | // q <<= | // q >>= | + // q ??= | if (token.IsKind(SyntaxKind.EqualsToken) || token.IsKind(SyntaxKind.MinusEqualsToken) || token.IsKind(SyntaxKind.AsteriskEqualsToken) || @@ -2034,7 +2035,8 @@ public static bool IsLabelContext(this SyntaxTree syntaxTree, int position, Canc token.IsKind(SyntaxKind.BarEqualsToken) || token.IsKind(SyntaxKind.PercentEqualsToken) || token.IsKind(SyntaxKind.LessThanLessThanEqualsToken) || - token.IsKind(SyntaxKind.GreaterThanGreaterThanEqualsToken)) + token.IsKind(SyntaxKind.GreaterThanGreaterThanEqualsToken) || + token.IsKind(SyntaxKind.QuestionQuestionEqualsToken)) { return true; } -- GitLab