Skip to content

Commit 2a8d1db

Browse files
committed
Update some type extensions
1 parent 2c124e5 commit 2a8d1db

File tree

2 files changed

+79
-51
lines changed

2 files changed

+79
-51
lines changed

CommunityToolkit.Mvvm.SourceGenerators/Extensions/INamedTypeSymbolExtensions.cs

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33
// See the LICENSE file in the project root for more information.
44

5-
using System;
65
using System.Collections.Generic;
7-
using CommunityToolkit.Mvvm.SourceGenerators.Helpers;
86
using Microsoft.CodeAnalysis;
97

108
namespace CommunityToolkit.Mvvm.SourceGenerators.Extensions;
@@ -14,55 +12,6 @@ namespace CommunityToolkit.Mvvm.SourceGenerators.Extensions;
1412
/// </summary>
1513
internal static class INamedTypeSymbolExtensions
1614
{
17-
/// <summary>
18-
/// Gets a fully qualified metadata name for a given <see cref="INamedTypeSymbol"/> instance.
19-
/// </summary>
20-
/// <param name="symbol">The input <see cref="INamedTypeSymbol"/> instance.</param>
21-
/// <returns>The fully qualified metadata name for <paramref name="symbol"/>.</returns>
22-
public static string GetFullyQualifiedMetadataName(this INamedTypeSymbol symbol)
23-
{
24-
using ImmutableArrayBuilder<char> builder = ImmutableArrayBuilder<char>.Rent();
25-
26-
static void BuildFrom(ISymbol? symbol, in ImmutableArrayBuilder<char> builder)
27-
{
28-
switch (symbol)
29-
{
30-
// Namespaces that are nested also append a leading '.'
31-
case INamespaceSymbol { ContainingNamespace.IsGlobalNamespace: false }:
32-
BuildFrom(symbol.ContainingNamespace, in builder);
33-
builder.Add('.');
34-
builder.AddRange(symbol.MetadataName.AsSpan());
35-
break;
36-
// Other namespaces (ie. the one right before global) skip the leading '.'
37-
case INamespaceSymbol { IsGlobalNamespace: false }:
38-
builder.AddRange(symbol.MetadataName.AsSpan());
39-
break;
40-
// Types with no namespace just have their metadata name directly written
41-
case ITypeSymbol { ContainingSymbol: INamespaceSymbol { IsGlobalNamespace: true } }:
42-
builder.AddRange(symbol.MetadataName.AsSpan());
43-
break;
44-
// Types with a containing non-global namespace also append a leading '.'
45-
case ITypeSymbol { ContainingSymbol: INamespaceSymbol namespaceSymbol }:
46-
BuildFrom(namespaceSymbol, in builder);
47-
builder.Add('.');
48-
builder.AddRange(symbol.MetadataName.AsSpan());
49-
break;
50-
// Nested types append a leading '+'
51-
case ITypeSymbol { ContainingSymbol: ITypeSymbol typeSymbol }:
52-
BuildFrom(typeSymbol, in builder);
53-
builder.Add('+');
54-
builder.AddRange(symbol.MetadataName.AsSpan());
55-
break;
56-
default:
57-
break;
58-
}
59-
}
60-
61-
BuildFrom(symbol, in builder);
62-
63-
return builder.ToString();
64-
}
65-
6615
/// <summary>
6716
/// Gets all member symbols from a given <see cref="INamedTypeSymbol"/> instance, including inherited ones.
6817
/// </summary>

CommunityToolkit.Mvvm.SourceGenerators/Extensions/ITypeSymbolExtensions.cs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
using System;
66
using System.Linq;
7+
using CommunityToolkit.Mvvm.SourceGenerators.Helpers;
78
using Microsoft.CodeAnalysis;
89

910
namespace CommunityToolkit.Mvvm.SourceGenerators.Extensions;
@@ -128,4 +129,82 @@ public static bool InheritsAttributeWithFullyQualifiedName(this ITypeSymbol type
128129

129130
return false;
130131
}
132+
133+
/// <summary>
134+
/// Checks whether or not a given type symbol has a specified fully qualified metadata name.
135+
/// </summary>
136+
/// <param name="symbol">The input <see cref="ITypeSymbol"/> instance to check.</param>
137+
/// <param name="name">The full name to check.</param>
138+
/// <returns>Whether <paramref name="symbol"/> has a full name equals to <paramref name="name"/>.</returns>
139+
public static bool HasFullyQualifiedMetadataName(this ITypeSymbol symbol, string name)
140+
{
141+
using ImmutableArrayBuilder<char> builder = ImmutableArrayBuilder<char>.Rent();
142+
143+
symbol.AppendFullyQualifiedMetadataName(in builder);
144+
145+
return builder.WrittenSpan.SequenceEqual(name.AsSpan());
146+
}
147+
148+
/// <summary>
149+
/// Gets the fully qualified metadata name for a given <see cref="ITypeSymbol"/> instance.
150+
/// </summary>
151+
/// <param name="symbol">The input <see cref="ITypeSymbol"/> instance.</param>
152+
/// <returns>The fully qualified metadata name for <paramref name="symbol"/>.</returns>
153+
public static string GetFullyQualifiedMetadataName(this ITypeSymbol symbol)
154+
{
155+
using ImmutableArrayBuilder<char> builder = ImmutableArrayBuilder<char>.Rent();
156+
157+
symbol.AppendFullyQualifiedMetadataName(in builder);
158+
159+
return builder.ToString();
160+
}
161+
162+
/// <summary>
163+
/// Appends the fully qualified metadata name for a given symbol to a target builder.
164+
/// </summary>
165+
/// <param name="symbol">The input <see cref="ITypeSymbol"/> instance.</param>
166+
/// <param name="builder">The target <see cref="ImmutableArrayBuilder{T}"/> instance.</param>
167+
public static void AppendFullyQualifiedMetadataName(this ITypeSymbol symbol, in ImmutableArrayBuilder<char> builder)
168+
{
169+
static void BuildFrom(ISymbol? symbol, in ImmutableArrayBuilder<char> builder)
170+
{
171+
switch (symbol)
172+
{
173+
// Namespaces that are nested also append a leading '.'
174+
case INamespaceSymbol { ContainingNamespace.IsGlobalNamespace: false }:
175+
BuildFrom(symbol.ContainingNamespace, in builder);
176+
builder.Add('.');
177+
builder.AddRange(symbol.MetadataName.AsSpan());
178+
break;
179+
180+
// Other namespaces (ie. the one right before global) skip the leading '.'
181+
case INamespaceSymbol { IsGlobalNamespace: false }:
182+
builder.AddRange(symbol.MetadataName.AsSpan());
183+
break;
184+
185+
// Types with no namespace just have their metadata name directly written
186+
case ITypeSymbol { ContainingSymbol: INamespaceSymbol { IsGlobalNamespace: true } }:
187+
builder.AddRange(symbol.MetadataName.AsSpan());
188+
break;
189+
190+
// Types with a containing non-global namespace also append a leading '.'
191+
case ITypeSymbol { ContainingSymbol: INamespaceSymbol namespaceSymbol }:
192+
BuildFrom(namespaceSymbol, in builder);
193+
builder.Add('.');
194+
builder.AddRange(symbol.MetadataName.AsSpan());
195+
break;
196+
197+
// Nested types append a leading '+'
198+
case ITypeSymbol { ContainingSymbol: ITypeSymbol typeSymbol }:
199+
BuildFrom(typeSymbol, in builder);
200+
builder.Add('+');
201+
builder.AddRange(symbol.MetadataName.AsSpan());
202+
break;
203+
default:
204+
break;
205+
}
206+
}
207+
208+
BuildFrom(symbol, in builder);
209+
}
131210
}

0 commit comments

Comments
 (0)