Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5898,7 +5898,7 @@ class Program
SymbolDisplayPartKind.Keyword,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.Keyword)
End sub
End Sub

<Fact>
Public Sub UseLongHandValueTuple()
Expand Down Expand Up @@ -6032,6 +6032,117 @@ end class"
actual:=displayParts)
End Sub

<Theory, CombinatorialData>
Public Sub TestExtensionBlockCSharp_01(useMetadata As Boolean)
Dim text =
<text>
static class E
{
extension(object o)
{
public void M() { }
}
}
</text>.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

<Theory, CombinatorialData>
Public Sub TestExtensionBlockCSharp_02(useMetadata As Boolean)
Dim text =
<text>
<![CDATA[
static class E
{
extension<T>(T t)
{
public void M() { }
}
}
]]>
</text>.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(
Expand Down