From d31a3dc05cdc2bff8780b90ca93e4b86606ffb1b Mon Sep 17 00:00:00 2001 From: yair halberstadt Date: Thu, 11 Mar 2021 08:19:50 +0200 Subject: [PATCH] Fix broken tests, and address feedback from @AlekseyTs --- .../SymbolDisplayVisitor.Members.cs | 45 +++++++++++-------- .../SymbolDisplay/SymbolDisplayTests.cs | 42 +++++++++++++++++ 2 files changed, 69 insertions(+), 18 deletions(-) diff --git a/src/Compilers/CSharp/Portable/SymbolDisplay/SymbolDisplayVisitor.Members.cs b/src/Compilers/CSharp/Portable/SymbolDisplay/SymbolDisplayVisitor.Members.cs index d548ea85fe601..8948541bfedf8 100644 --- a/src/Compilers/CSharp/Portable/SymbolDisplay/SymbolDisplayVisitor.Members.cs +++ b/src/Compilers/CSharp/Portable/SymbolDisplay/SymbolDisplayVisitor.Members.cs @@ -609,7 +609,10 @@ void visitFunctionPointerSignature(IMethodSymbol symbol) foreach (var param in symbol.Parameters) { - AddParameterRefKindIfRequired(param.RefKind); + if (format.MemberOptions.IncludesOption(SymbolDisplayMemberOptions.IncludeRef)) + { + AddParameterRefKind(param.RefKind); + } AddCustomModifiersIfRequired(param.RefCustomModifiers); @@ -685,10 +688,11 @@ public override void VisitParameter(IParameterSymbol symbol) // (e.g. field types, param types, etc), which just want the name whereas parameters are // used on their own or in the context of methods. - var includeType = format.ParameterOptions.IncludesOption(SymbolDisplayParameterOptions.IncludeType); - var includeName = format.ParameterOptions.IncludesOption(SymbolDisplayParameterOptions.IncludeName); + var includeName = format.ParameterOptions.IncludesOption(SymbolDisplayParameterOptions.IncludeName) + && (symbol is Symbols.PublicModel.Symbol { UnderlyingSymbol: SignatureOnlyParameterSymbol } // SignatureOnlyParameterSymbol.ContainingSymbol throws NotSupportedException + || symbol.ContainingSymbol is not IMethodSymbol { MethodKind: MethodKind.FunctionPointerSignature }); var includeBrackets = format.ParameterOptions.IncludesOption(SymbolDisplayParameterOptions.IncludeOptionalBrackets); @@ -976,21 +980,26 @@ private void AddParameterRefKindIfRequired(RefKind refKind) { if (format.ParameterOptions.IncludesOption(SymbolDisplayParameterOptions.IncludeParamsRefOut)) { - switch (refKind) - { - case RefKind.Out: - AddKeyword(SyntaxKind.OutKeyword); - AddSpace(); - break; - case RefKind.Ref: - AddKeyword(SyntaxKind.RefKeyword); - AddSpace(); - break; - case RefKind.In: - AddKeyword(SyntaxKind.InKeyword); - AddSpace(); - break; - } + AddParameterRefKind(refKind); + } + } + + private void AddParameterRefKind(RefKind refKind) + { + switch (refKind) + { + case RefKind.Out: + AddKeyword(SyntaxKind.OutKeyword); + AddSpace(); + break; + case RefKind.Ref: + AddKeyword(SyntaxKind.RefKeyword); + AddSpace(); + break; + case RefKind.In: + AddKeyword(SyntaxKind.InKeyword); + AddSpace(); + break; } } } diff --git a/src/Compilers/CSharp/Test/Symbol/SymbolDisplay/SymbolDisplayTests.cs b/src/Compilers/CSharp/Test/Symbol/SymbolDisplay/SymbolDisplayTests.cs index ec9fdd4b2be38..f12fcf5308d8d 100644 --- a/src/Compilers/CSharp/Test/Symbol/SymbolDisplay/SymbolDisplayTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/SymbolDisplay/SymbolDisplayTests.cs @@ -7715,5 +7715,47 @@ class A { format, "delegate*<(Int32 i, String s), (Int32 i, String s)>"); } + + [Fact, WorkItem(51222, "https://github.com/dotnet/roslyn/issues/51222")] + public void TestFunctionPointerWithRefParametersAndIncludeParameterRefOut() + { + var text = @" +class A { + delegate* f; +}"; + + Func findSymbol = global => + ((FieldSymbol)global.GetTypeMembers("A", 0).Single() + .GetMembers("f").Single()).Type; + + var format = new SymbolDisplayFormat(parameterOptions: SymbolDisplayParameterOptions.IncludeParamsRefOut); + + TestSymbolDescription( + text, + findSymbol, + format, + "delegate*"); + } + + [Fact, WorkItem(51222, "https://github.com/dotnet/roslyn/issues/51222")] + public void TestFunctionPointerWithRefParametersAndIncludeRef() + { + var text = @" +class A { + delegate* f; +}"; + + Func findSymbol = global => + ((FieldSymbol)global.GetTypeMembers("A", 0).Single() + .GetMembers("f").Single()).Type; + + var format = new SymbolDisplayFormat(memberOptions: SymbolDisplayMemberOptions.IncludeRef); + + TestSymbolDescription( + text, + findSymbol, + format, + "delegate*"); + } } }