From 7ae1c38ac30585f0ed5b6ca9a43f75ae1c827ba9 Mon Sep 17 00:00:00 2001 From: David Barbet Date: Tue, 12 Apr 2022 15:33:48 -0700 Subject: [PATCH] Support checked operators in explicit interface implementation --- ...tInterfaceMemberCompletionProviderTests.cs | 105 ++++++++++++++++++ ...pletionProvider.CompletionSymbolDisplay.cs | 13 ++- 2 files changed, 116 insertions(+), 2 deletions(-) diff --git a/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProviderTests.cs b/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProviderTests.cs index 0748171414e87..8d8f783d7918d 100644 --- a/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProviderTests.cs +++ b/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProviderTests.cs @@ -888,5 +888,110 @@ void I.M(int x) // TODO: Consider adding the default value too. await VerifyProviderCommitAsync(markup, "M(int x)", expected, '\t'); } + + [Fact, Trait(Traits.Feature, Traits.Features.Completion)] + [WorkItem(60215, "https://github.com/dotnet/roslyn/issues/60215")] + public async Task TestStaticAbstractCheckedUnaryOperator() + { + var markup = @" +interface I1 where T : I1 +{ + abstract static T operator checked -(T x); + + abstract static T operator -(T x); +} + +class C : I1 +{ + static C I1.$$ +} +"; + + var expected = @" +interface I1 where T : I1 +{ + abstract static T operator checked -(T x); + + abstract static T operator -(T x); +} + +class C : I1 +{ + static C I1.operator checked -(C x) +} +"; + + await VerifyProviderCommitAsync(markup, "operator checked -(C x)", expected, '\t'); + } + + [Fact, Trait(Traits.Feature, Traits.Features.Completion)] + [WorkItem(60215, "https://github.com/dotnet/roslyn/issues/60215")] + public async Task TestStaticAbstractCheckedBinaryOperator() + { + var markup = @" +interface I1 where T : I1 +{ + abstract static T operator checked +(T x, T y); + + abstract static T operator +(T x, T y); +} + +class C : I1 +{ + static C I1.$$ +} +"; + + var expected = @" +interface I1 where T : I1 +{ + abstract static T operator checked +(T x, T y); + + abstract static T operator +(T x, T y); +} + +class C : I1 +{ + static C I1.operator checked +(C x, C y) +} +"; + + await VerifyProviderCommitAsync(markup, "operator checked +(C x, C y)", expected, '\t'); + } + + [Fact, Trait(Traits.Feature, Traits.Features.Completion)] + [WorkItem(60215, "https://github.com/dotnet/roslyn/issues/60215")] + public async Task TestStaticAbstractCheckedCastOperator() + { + var markup = @" +interface I1 where T : I1 +{ + abstract static explicit operator checked string(T x); + abstract static explicit operator string(T x); +} + + +class C3 : I1 +{ + static C3 I1.$$ +} +"; + + var expected = @" +interface I1 where T : I1 +{ + abstract static explicit operator checked string(T x); + abstract static explicit operator string(T x); +} + + +class C3 : I1 +{ + static C3 I1.operator checked string(C3 x) +} +"; + + await VerifyProviderCommitAsync(markup, "operator checked string(C3 x)", expected, '\t'); + } } } diff --git a/src/Features/CSharp/Portable/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProvider.CompletionSymbolDisplay.cs b/src/Features/CSharp/Portable/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProvider.CompletionSymbolDisplay.cs index 44dac7a5bde72..15844a3ffa07d 100644 --- a/src/Features/CSharp/Portable/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProvider.CompletionSymbolDisplay.cs +++ b/src/Features/CSharp/Portable/Completion/CompletionProviders/ExplicitInterfaceMemberCompletionProvider.CompletionSymbolDisplay.cs @@ -59,11 +59,11 @@ private static string ToDisplayString(IMethodSymbol symbol) break; case MethodKind.UserDefinedOperator: case MethodKind.BuiltinOperator: - builder.Append("operator "); + AppendOperatorKeywords(symbol, builder); builder.Append(SyntaxFacts.GetText(SyntaxFacts.GetOperatorKind(symbol.MetadataName))); break; case MethodKind.Conversion: - builder.Append("operator "); + AppendOperatorKeywords(symbol, builder); AddType(symbol.ReturnType, builder); break; } @@ -73,6 +73,15 @@ private static string ToDisplayString(IMethodSymbol symbol) AddParameters(symbol.Parameters, builder); builder.Append(')'); return builder.ToString(); + + static void AppendOperatorKeywords(IMethodSymbol symbol, StringBuilder builder) + { + builder.Append("operator "); + if (SyntaxFacts.IsCheckedOperator(symbol.MetadataName)) + { + builder.Append("checked "); + } + } } private static void AddParameters(ImmutableArray parameters, StringBuilder builder)