Skip to content

Commit

Permalink
Merge pull request #47979 from CyrusNajmabadi/overriddenRecord2
Browse files Browse the repository at this point in the history
Do not show unspeakable names in override completion
  • Loading branch information
msftbot[bot] authored Sep 24, 2020
2 parents ad73fb9 + 002d02d commit 29edeca
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

using System;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
Expand Down Expand Up @@ -3044,6 +3045,7 @@ public override bool Bar(Baz baz)
}

[WpfFact, Trait(Traits.Feature, Traits.Features.Completion)]
[WorkItem(47941, "https://github.com/dotnet/roslyn/issues/47941")]
public async Task OverrideInRecordWithoutExplicitOverriddenMember()
{
await VerifyItemExistsAsync(@"record Program
Expand All @@ -3053,6 +3055,7 @@ await VerifyItemExistsAsync(@"record Program
}

[WpfFact, Trait(Traits.Feature, Traits.Features.Completion)]
[WorkItem(47941, "https://github.com/dotnet/roslyn/issues/47941")]
public async Task OverrideInRecordWithExplicitOverriddenMember()
{
await VerifyItemIsAbsentAsync(@"record Program
Expand All @@ -3062,5 +3065,25 @@ await VerifyItemIsAbsentAsync(@"record Program
override $$
}", "ToString()");
}

[WpfFact, Trait(Traits.Feature, Traits.Features.Completion)]
[WorkItem(47973, "https://github.com/dotnet/roslyn/issues/47973")]
public async Task NoCloneInOverriddenRecord()
{
// Currently WellKnownMemberNames.CloneMethodName is not public, so we can't reference it directly. We
// could hardcode in the value "<Clone>$", however if the compiler ever changed the name and we somehow
// started showing it in completion, this test would continue to pass. So this allows us to at least go
// back and explicitly validate this scenario even in that event.
var cloneMemberName = (string)typeof(WellKnownMemberNames).GetField("CloneMethodName", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
Assert.Equal("<Clone>$", cloneMemberName);

await VerifyItemIsAbsentAsync(@"
record Base();
record Program : Base
{
override $$
}", cloneMemberName);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -551,30 +551,22 @@ private static void AddOverridableMembers(

private static bool IsOverridable(ISymbol member, INamedTypeSymbol containingType)
{
if (member.IsAbstract || member.IsVirtual || member.IsOverride)
{
if (member.IsSealed)
{
return false;
}
if (!member.IsAbstract && !member.IsVirtual && !member.IsOverride)
return false;

if (!member.IsAccessibleWithin(containingType))
{
return false;
}
if (member.IsSealed)
return false;

switch (member.Kind)
{
case SymbolKind.Event:
return true;
case SymbolKind.Method:
return ((IMethodSymbol)member).MethodKind == MethodKind.Ordinary;
case SymbolKind.Property:
return !((IPropertySymbol)member).IsWithEvents;
}
}
if (!member.IsAccessibleWithin(containingType))
return false;

return false;
return member switch
{
IEventSymbol => true,
IMethodSymbol { MethodKind: MethodKind.Ordinary, CanBeReferencedByName: true } => true,
IPropertySymbol { IsWithEvents: false } => true,
_ => false,
};
}

private static void RemoveOverriddenMembers(
Expand Down

0 comments on commit 29edeca

Please sign in to comment.