diff --git a/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProviderTests.cs b/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProviderTests.cs index 3b3c09a0507b6a86c69eceba74d50adc17441789..77fa6eaf9e531cd03a38ac1db2cb6e3612df4fb0 100644 --- a/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProviderTests.cs +++ b/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProviderTests.cs @@ -98,5 +98,36 @@ class Bar : IFoo await VerifyProviderCommitAsync(markup, "Foo()", expected, '(', ""); } + + [Fact, Trait(Traits.Feature, Traits.Features.Completion)] + [WorkItem(19947, "https://github.com/dotnet/roslyn/issues/19947")] + public async Task ExplicitInterfaceMemberCompletionContainsOnlyValidValues() + { + var markup = @" +interface I1 +{ + void Foo(); +} + +interface I2 : I1 +{ + void Foo2(); + int Prop { get; } +} + +class Bar : I2 +{ + void I2.$$ +}"; + + await VerifyItemIsAbsentAsync(markup, "Equals(object obj)"); + await VerifyItemIsAbsentAsync(markup, "Foo()"); + await VerifyItemIsAbsentAsync(markup, "GetHashCode()"); + await VerifyItemIsAbsentAsync(markup, "GetType()"); + await VerifyItemIsAbsentAsync(markup, "ToString()"); + + await VerifyItemExistsAsync(markup, "Foo2()"); + await VerifyItemExistsAsync(markup, "Prop"); + } } } diff --git a/src/Features/CSharp/Portable/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProvider.cs b/src/Features/CSharp/Portable/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProvider.cs index f8891a9dae2165cb70b5741c4bc356594f2d192d..27c202ce98a63eeeaeb61badcb78e449bc2bd95e 100644 --- a/src/Features/CSharp/Portable/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProvider.cs +++ b/src/Features/CSharp/Portable/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProvider.cs @@ -82,7 +82,7 @@ public override async Task ProvideCompletionsAsync(CompletionContext context) var members = semanticModel.LookupSymbols( position: name.SpanStart, container: symbol) - .WhereAsArray(s => !s.IsStatic) + .WhereAsArray(s => !s.IsStatic && s.ContainingType.Equals(symbol)) .FilterToVisibleAndBrowsableSymbols(options.GetOption(CompletionOptions.HideAdvancedMembers, semanticModel.Language), semanticModel.Compilation); // We're going to create a entry for each one, including the signature