diff --git a/src/EditorFeatures/CSharpTest/Diagnostics/GenerateMethod/GenerateMethodTests.cs b/src/EditorFeatures/CSharpTest/Diagnostics/GenerateMethod/GenerateMethodTests.cs index 4fc3440faeec11fbccff49edd5aed099ce22438e..0540fd6c498545f9dd06b390b4dc4fbabd41b95e 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 721a88f6469fa4ac8d77538adcf567348b9cf07d..2477a88596bfd5d5753cde57c0d5b576cbb12aa7 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 56e11f2c57da85224e583a0aa8656039b544c67e..2e62455fb7841cf2da0363dba69e17aac01d31c9 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; }