diff --git a/src/EditorFeatures/CSharpTest2/Recommendations/VoidKeywordRecommenderTests.cs b/src/EditorFeatures/CSharpTest2/Recommendations/VoidKeywordRecommenderTests.cs index 5c8d300aec0b076493ec5e135262edf5cc6e74a2..240e7305c417c550e7b11ce0b5814545bf9b0399 100644 --- a/src/EditorFeatures/CSharpTest2/Recommendations/VoidKeywordRecommenderTests.cs +++ b/src/EditorFeatures/CSharpTest2/Recommendations/VoidKeywordRecommenderTests.cs @@ -772,5 +772,25 @@ class C { delegate*$$"); } + + [Fact, Trait(Traits.Feature, Traits.Features.KeywordRecommending)] + [WorkItem(43295, "https://github.com/dotnet/roslyn/issues/43295")] + public async Task TestAfterReadonlyInStruct() + { + await VerifyKeywordAsync(@" +struct S +{ + public readonly $$"); + } + + [Fact, Trait(Traits.Feature, Traits.Features.KeywordRecommending)] + [WorkItem(43295, "https://github.com/dotnet/roslyn/issues/43295")] + public async Task TestNotAfterReadonlyInClass() + { + await VerifyAbsenceAsync(@" +class C +{ + public readonly $$"); + } } } diff --git a/src/Features/CSharp/Portable/Completion/KeywordRecommenders/VoidKeywordRecommender.cs b/src/Features/CSharp/Portable/Completion/KeywordRecommenders/VoidKeywordRecommender.cs index c0f7768f9012234f8839a2ccca78e7bf1b7c51cf..01eda7df8c66075353c5f3851f4ce6dc4e5ad0b5 100644 --- a/src/Features/CSharp/Portable/Completion/KeywordRecommenders/VoidKeywordRecommender.cs +++ b/src/Features/CSharp/Portable/Completion/KeywordRecommenders/VoidKeywordRecommender.cs @@ -12,7 +12,7 @@ namespace Microsoft.CodeAnalysis.CSharp.Completion.KeywordRecommenders { internal class VoidKeywordRecommender : AbstractSyntacticSingleKeywordRecommender { - private static readonly ISet s_validModifiers = new HashSet(SyntaxFacts.EqualityComparer) + private static readonly ISet s_validClassInterfaceRecordModifiers = new HashSet(SyntaxFacts.EqualityComparer) { SyntaxKind.NewKeyword, SyntaxKind.PublicKeyword, @@ -29,6 +29,11 @@ internal class VoidKeywordRecommender : AbstractSyntacticSingleKeywordRecommende SyntaxKind.AsyncKeyword }; + private static readonly ISet s_validStructModifiers = new HashSet(s_validClassInterfaceRecordModifiers, SyntaxFacts.EqualityComparer) + { + SyntaxKind.ReadOnlyKeyword, + }; + public VoidKeywordRecommender() : base(SyntaxKind.VoidKeyword) { @@ -101,15 +106,8 @@ private static bool IsUnsafeLocalVariableDeclarationContext(CSharpSyntaxContext } private static bool IsMemberReturnTypeContext(int position, CSharpSyntaxContext context, CancellationToken cancellationToken) - { - var syntaxTree = context.SyntaxTree; - return - syntaxTree.IsGlobalMemberDeclarationContext(position, SyntaxKindSet.AllGlobalMemberModifiers, cancellationToken) || - context.IsMemberDeclarationContext( - validModifiers: s_validModifiers, - validTypeDeclarations: SyntaxKindSet.ClassInterfaceStructRecordTypeDeclarations, - canBePartial: true, - cancellationToken: cancellationToken); - } + => context.SyntaxTree.IsGlobalMemberDeclarationContext(position, SyntaxKindSet.AllGlobalMemberModifiers, cancellationToken) || + context.IsMemberDeclarationContext(validModifiers: s_validClassInterfaceRecordModifiers, validTypeDeclarations: SyntaxKindSet.ClassInterfaceRecordTypeDeclarations, canBePartial: true, cancellationToken) || + context.IsMemberDeclarationContext(validModifiers: s_validStructModifiers, validTypeDeclarations: SyntaxKindSet.StructOnlyTypeDeclarations, canBePartial: false, cancellationToken); } }