Skip to content

Commit 6ecc256

Browse files
author
Julien Couvreur
authored
Extensions: handle extensions in VB SymbolDisplay (#78512)
1 parent 537b86f commit 6ecc256

File tree

2 files changed

+115
-3
lines changed

2 files changed

+115
-3
lines changed

src/Compilers/VisualBasic/Portable/SymbolDisplay/SymbolDisplayVisitor.Types.vb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
239239
End If
240240

241241
If symbolName Is Nothing Then
242-
symbolName = symbol.Name
242+
symbolName = If(symbol.IsExtension, symbol.MetadataName, symbol.Name)
243243
End If
244244

245245
If Format.MiscellaneousOptions.IncludesOption(SymbolDisplayMiscellaneousOptions.UseErrorTypeSymbolName) AndAlso
@@ -252,7 +252,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
252252

253253
Select Case symbol.TypeKind
254254
Case TypeKind.Class,
255-
TypeKind.Submission
255+
TypeKind.Submission,
256+
TypeKind.Extension
256257
partKind = SymbolDisplayPartKind.ClassName
257258
Case TypeKind.Delegate
258259
partKind = SymbolDisplayPartKind.DelegateName

src/Compilers/VisualBasic/Test/Symbol/SymbolDisplay/SymbolDisplayTests.vb

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5898,7 +5898,7 @@ class Program
58985898
SymbolDisplayPartKind.Keyword,
58995899
SymbolDisplayPartKind.Space,
59005900
SymbolDisplayPartKind.Keyword)
5901-
End sub
5901+
End Sub
59025902

59035903
<Fact>
59045904
Public Sub UseLongHandValueTuple()
@@ -6032,6 +6032,117 @@ end class"
60326032
actual:=displayParts)
60336033
End Sub
60346034

6035+
<Theory, CombinatorialData>
6036+
Public Sub TestExtensionBlockCSharp_01(useMetadata As Boolean)
6037+
Dim text =
6038+
<text>
6039+
static class E
6040+
{
6041+
extension(object o)
6042+
{
6043+
public void M() { }
6044+
}
6045+
}
6046+
</text>.Value
6047+
6048+
Dim format = New SymbolDisplayFormat(
6049+
typeQualificationStyle:=SymbolDisplayTypeQualificationStyle.NameAndContainingTypesAndNamespaces,
6050+
memberOptions:=SymbolDisplayMemberOptions.IncludeParameters Or
6051+
SymbolDisplayMemberOptions.IncludeModifiers Or
6052+
SymbolDisplayMemberOptions.IncludeAccessibility Or
6053+
SymbolDisplayMemberOptions.IncludeType Or
6054+
SymbolDisplayMemberOptions.IncludeContainingType,
6055+
kindOptions:=SymbolDisplayKindOptions.IncludeMemberKeyword,
6056+
parameterOptions:=SymbolDisplayParameterOptions.IncludeType Or
6057+
SymbolDisplayParameterOptions.IncludeName Or
6058+
SymbolDisplayParameterOptions.IncludeDefaultValue,
6059+
miscellaneousOptions:=SymbolDisplayMiscellaneousOptions.UseSpecialTypes)
6060+
6061+
Dim parseOptions = CSharp.CSharpParseOptions.Default.WithLanguageVersion(CSharp.LanguageVersion.Preview)
6062+
Dim comp As Compilation
6063+
If useMetadata Then
6064+
Dim libComp = CreateCSharpCompilation("c", text, parseOptions:=parseOptions)
6065+
comp = CreateCSharpCompilation("d", code:="", parseOptions:=parseOptions, referencedAssemblies:={libComp.EmitToImageReference()})
6066+
Else
6067+
comp = CreateCSharpCompilation("c", text, parseOptions:=parseOptions)
6068+
End If
6069+
6070+
Dim e = DirectCast(comp.GlobalNamespace.GetMembers("E").Single(), ITypeSymbol)
6071+
Dim extension = e.GetMembers().OfType(Of ITypeSymbol).Single()
6072+
6073+
Assert.Equal("E.<>E__0", SymbolDisplay.ToDisplayString(extension, format))
6074+
6075+
Dim parts = SymbolDisplay.ToDisplayParts(extension, format)
6076+
Verify(parts,
6077+
"E.<>E__0",
6078+
SymbolDisplayPartKind.ClassName,
6079+
SymbolDisplayPartKind.Operator,
6080+
SymbolDisplayPartKind.ClassName)
6081+
6082+
Dim skeletonM = extension.GetMembers("M").Single()
6083+
Assert.Equal("Public Sub E.<>E__0.M()", SymbolDisplay.ToDisplayString(skeletonM, format))
6084+
End Sub
6085+
6086+
<Theory, CombinatorialData>
6087+
Public Sub TestExtensionBlockCSharp_02(useMetadata As Boolean)
6088+
Dim text =
6089+
<text>
6090+
<![CDATA[
6091+
static class E
6092+
{
6093+
extension<T>(T t)
6094+
{
6095+
public void M() { }
6096+
}
6097+
}
6098+
]]>
6099+
</text>.Value
6100+
6101+
Dim format = New SymbolDisplayFormat(
6102+
typeQualificationStyle:=SymbolDisplayTypeQualificationStyle.NameAndContainingTypesAndNamespaces,
6103+
memberOptions:=SymbolDisplayMemberOptions.IncludeParameters Or
6104+
SymbolDisplayMemberOptions.IncludeModifiers Or
6105+
SymbolDisplayMemberOptions.IncludeAccessibility Or
6106+
SymbolDisplayMemberOptions.IncludeType Or
6107+
SymbolDisplayMemberOptions.IncludeContainingType,
6108+
kindOptions:=SymbolDisplayKindOptions.IncludeMemberKeyword,
6109+
genericsOptions:=SymbolDisplayGenericsOptions.IncludeTypeParameters,
6110+
parameterOptions:=SymbolDisplayParameterOptions.IncludeType Or
6111+
SymbolDisplayParameterOptions.IncludeName Or
6112+
SymbolDisplayParameterOptions.IncludeDefaultValue,
6113+
miscellaneousOptions:=SymbolDisplayMiscellaneousOptions.UseSpecialTypes)
6114+
6115+
Dim parseOptions = CSharp.CSharpParseOptions.Default.WithLanguageVersion(CSharp.LanguageVersion.Preview)
6116+
Dim comp As Compilation
6117+
If useMetadata Then
6118+
Dim libComp = CreateCSharpCompilation("c", text, parseOptions:=parseOptions)
6119+
comp = CreateCSharpCompilation("d", code:="", parseOptions:=parseOptions, referencedAssemblies:={libComp.EmitToImageReference()})
6120+
Else
6121+
comp = CreateCSharpCompilation("c", text, parseOptions:=parseOptions)
6122+
End If
6123+
6124+
Dim e = DirectCast(comp.GlobalNamespace.GetMembers("E").Single(), ITypeSymbol)
6125+
Dim extension = e.GetMembers().OfType(Of ITypeSymbol).Single()
6126+
6127+
' Tracked by https://github.com/dotnet/roslyn/issues/76130 : the arity should not be included in the extension type name
6128+
Assert.Equal("E.<>E__0`1(Of T)", SymbolDisplay.ToDisplayString(extension, format))
6129+
6130+
Dim parts = SymbolDisplay.ToDisplayParts(extension, format)
6131+
Verify(parts,
6132+
"E.<>E__0`1(Of T)",
6133+
SymbolDisplayPartKind.ClassName,
6134+
SymbolDisplayPartKind.Operator,
6135+
SymbolDisplayPartKind.ClassName,
6136+
SymbolDisplayPartKind.Punctuation,
6137+
SymbolDisplayPartKind.Keyword,
6138+
SymbolDisplayPartKind.Space,
6139+
SymbolDisplayPartKind.TypeParameterName,
6140+
SymbolDisplayPartKind.Punctuation)
6141+
6142+
Dim skeletonM = extension.GetMembers("M").Single()
6143+
Assert.Equal("Public Sub E.<>E__0`1(Of T).M()", SymbolDisplay.ToDisplayString(skeletonM, format))
6144+
End Sub
6145+
60356146
#Region "Helpers"
60366147

60376148
Private Shared Sub TestSymbolDescription(

0 commit comments

Comments
 (0)