Skip to content

Commit 16f9bd2

Browse files
[release/dev18.3] Extensions: Optimize GetExtensionMembers (#82153)
Backport of #82124 to release/dev18.3
1 parent cacd2e7 commit 16f9bd2

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

src/Compilers/CSharp/Portable/Symbols/NamedTypeSymbol.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ internal void GetExtensionMembers(ArrayBuilder<Symbol> members, string? name, st
420420

421421
if (!this.IsClassType() || !IsStatic || IsGenericType || !MightContainExtensionMethods) return;
422422

423-
foreach (NamedTypeSymbol nestedType in GetTypeMembersUnordered())
423+
foreach (NamedTypeSymbol nestedType in GetTypeMembers(name: ""))
424424
{
425425
if (nestedType is not { IsExtension: true, ExtensionParameter: { } extensionParameter }
426426
|| !IsValidExtensionReceiverParameter(extensionParameter))

src/Compilers/CSharp/Portable/Symbols/Retargeting/RetargetingNamespaceSymbol.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ internal sealed class RetargetingNamespaceSymbol
3636
/// </summary>
3737
private readonly NamespaceSymbol _underlyingNamespace;
3838

39+
/// <summary>
40+
/// Cache of the type members.
41+
/// </summary>
42+
private ImmutableArray<NamedTypeSymbol> _lazyTypeMembers;
43+
3944
public RetargetingNamespaceSymbol(RetargetingModuleSymbol retargetingModule, NamespaceSymbol underlyingNamespace)
4045
{
4146
Debug.Assert((object)retargetingModule != null);
@@ -105,12 +110,18 @@ public override ImmutableArray<Symbol> GetMembers(ReadOnlyMemory<char> name)
105110

106111
internal override ImmutableArray<NamedTypeSymbol> GetTypeMembersUnordered()
107112
{
108-
return RetargetTypeMembers(_underlyingNamespace.GetTypeMembersUnordered());
113+
return GetTypeMembers().ConditionallyDeOrder();
109114
}
110115

111116
public override ImmutableArray<NamedTypeSymbol> GetTypeMembers()
112117
{
113-
return RetargetTypeMembers(_underlyingNamespace.GetTypeMembers());
118+
if (_lazyTypeMembers.IsDefault)
119+
{
120+
var typeMembers = RetargetTypeMembers(_underlyingNamespace.GetTypeMembers());
121+
ImmutableInterlocked.InterlockedInitialize(ref _lazyTypeMembers, typeMembers);
122+
}
123+
124+
return _lazyTypeMembers;
114125
}
115126

116127
private ImmutableArray<NamedTypeSymbol> RetargetTypeMembers(ImmutableArray<NamedTypeSymbol> underlyingMembers)

0 commit comments

Comments
 (0)