diff --git a/src/Compilers/VisualBasic/Portable/SymbolDisplay/SymbolDisplayVisitor.Types.vb b/src/Compilers/VisualBasic/Portable/SymbolDisplay/SymbolDisplayVisitor.Types.vb index 094967a928b7..4122c175253d 100644 --- a/src/Compilers/VisualBasic/Portable/SymbolDisplay/SymbolDisplayVisitor.Types.vb +++ b/src/Compilers/VisualBasic/Portable/SymbolDisplay/SymbolDisplayVisitor.Types.vb @@ -239,7 +239,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic End If If symbolName Is Nothing Then - symbolName = symbol.Name + symbolName = If(symbol.IsExtension, symbol.MetadataName, symbol.Name) End If If Format.MiscellaneousOptions.IncludesOption(SymbolDisplayMiscellaneousOptions.UseErrorTypeSymbolName) AndAlso @@ -252,7 +252,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Select Case symbol.TypeKind Case TypeKind.Class, - TypeKind.Submission + TypeKind.Submission, + TypeKind.Extension partKind = SymbolDisplayPartKind.ClassName Case TypeKind.Delegate partKind = SymbolDisplayPartKind.DelegateName diff --git a/src/Compilers/VisualBasic/Test/Symbol/SymbolDisplay/SymbolDisplayTests.vb b/src/Compilers/VisualBasic/Test/Symbol/SymbolDisplay/SymbolDisplayTests.vb index 5f52b065c237..5c6423f123c8 100644 --- a/src/Compilers/VisualBasic/Test/Symbol/SymbolDisplay/SymbolDisplayTests.vb +++ b/src/Compilers/VisualBasic/Test/Symbol/SymbolDisplay/SymbolDisplayTests.vb @@ -5898,7 +5898,7 @@ class Program SymbolDisplayPartKind.Keyword, SymbolDisplayPartKind.Space, SymbolDisplayPartKind.Keyword) - End sub + End Sub Public Sub UseLongHandValueTuple() @@ -6032,6 +6032,117 @@ end class" actual:=displayParts) End Sub + + Public Sub TestExtensionBlockCSharp_01(useMetadata As Boolean) + Dim text = + +static class E +{ + extension(object o) + { + public void M() { } + } +} +.Value + + Dim format = New SymbolDisplayFormat( + typeQualificationStyle:=SymbolDisplayTypeQualificationStyle.NameAndContainingTypesAndNamespaces, + memberOptions:=SymbolDisplayMemberOptions.IncludeParameters Or + SymbolDisplayMemberOptions.IncludeModifiers Or + SymbolDisplayMemberOptions.IncludeAccessibility Or + SymbolDisplayMemberOptions.IncludeType Or + SymbolDisplayMemberOptions.IncludeContainingType, + kindOptions:=SymbolDisplayKindOptions.IncludeMemberKeyword, + parameterOptions:=SymbolDisplayParameterOptions.IncludeType Or + SymbolDisplayParameterOptions.IncludeName Or + SymbolDisplayParameterOptions.IncludeDefaultValue, + miscellaneousOptions:=SymbolDisplayMiscellaneousOptions.UseSpecialTypes) + + Dim parseOptions = CSharp.CSharpParseOptions.Default.WithLanguageVersion(CSharp.LanguageVersion.Preview) + Dim comp As Compilation + If useMetadata Then + Dim libComp = CreateCSharpCompilation("c", text, parseOptions:=parseOptions) + comp = CreateCSharpCompilation("d", code:="", parseOptions:=parseOptions, referencedAssemblies:={libComp.EmitToImageReference()}) + Else + comp = CreateCSharpCompilation("c", text, parseOptions:=parseOptions) + End If + + Dim e = DirectCast(comp.GlobalNamespace.GetMembers("E").Single(), ITypeSymbol) + Dim extension = e.GetMembers().OfType(Of ITypeSymbol).Single() + + Assert.Equal("E.<>E__0", SymbolDisplay.ToDisplayString(extension, format)) + + Dim parts = SymbolDisplay.ToDisplayParts(extension, format) + Verify(parts, + "E.<>E__0", + SymbolDisplayPartKind.ClassName, + SymbolDisplayPartKind.Operator, + SymbolDisplayPartKind.ClassName) + + Dim skeletonM = extension.GetMembers("M").Single() + Assert.Equal("Public Sub E.<>E__0.M()", SymbolDisplay.ToDisplayString(skeletonM, format)) + End Sub + + + Public Sub TestExtensionBlockCSharp_02(useMetadata As Boolean) + Dim text = + + (T t) + { + public void M() { } + } +} + ]]> +.Value + + Dim format = New SymbolDisplayFormat( + typeQualificationStyle:=SymbolDisplayTypeQualificationStyle.NameAndContainingTypesAndNamespaces, + memberOptions:=SymbolDisplayMemberOptions.IncludeParameters Or + SymbolDisplayMemberOptions.IncludeModifiers Or + SymbolDisplayMemberOptions.IncludeAccessibility Or + SymbolDisplayMemberOptions.IncludeType Or + SymbolDisplayMemberOptions.IncludeContainingType, + kindOptions:=SymbolDisplayKindOptions.IncludeMemberKeyword, + genericsOptions:=SymbolDisplayGenericsOptions.IncludeTypeParameters, + parameterOptions:=SymbolDisplayParameterOptions.IncludeType Or + SymbolDisplayParameterOptions.IncludeName Or + SymbolDisplayParameterOptions.IncludeDefaultValue, + miscellaneousOptions:=SymbolDisplayMiscellaneousOptions.UseSpecialTypes) + + Dim parseOptions = CSharp.CSharpParseOptions.Default.WithLanguageVersion(CSharp.LanguageVersion.Preview) + Dim comp As Compilation + If useMetadata Then + Dim libComp = CreateCSharpCompilation("c", text, parseOptions:=parseOptions) + comp = CreateCSharpCompilation("d", code:="", parseOptions:=parseOptions, referencedAssemblies:={libComp.EmitToImageReference()}) + Else + comp = CreateCSharpCompilation("c", text, parseOptions:=parseOptions) + End If + + Dim e = DirectCast(comp.GlobalNamespace.GetMembers("E").Single(), ITypeSymbol) + Dim extension = e.GetMembers().OfType(Of ITypeSymbol).Single() + + ' Tracked by https://github.com/dotnet/roslyn/issues/76130 : the arity should not be included in the extension type name + Assert.Equal("E.<>E__0`1(Of T)", SymbolDisplay.ToDisplayString(extension, format)) + + Dim parts = SymbolDisplay.ToDisplayParts(extension, format) + Verify(parts, + "E.<>E__0`1(Of T)", + SymbolDisplayPartKind.ClassName, + SymbolDisplayPartKind.Operator, + SymbolDisplayPartKind.ClassName, + SymbolDisplayPartKind.Punctuation, + SymbolDisplayPartKind.Keyword, + SymbolDisplayPartKind.Space, + SymbolDisplayPartKind.TypeParameterName, + SymbolDisplayPartKind.Punctuation) + + Dim skeletonM = extension.GetMembers("M").Single() + Assert.Equal("Public Sub E.<>E__0`1(Of T).M()", SymbolDisplay.ToDisplayString(skeletonM, format)) + End Sub + #Region "Helpers" Private Shared Sub TestSymbolDescription(