Skip to content

Commit 0faca8d

Browse files
committed
🐛 do not remove attribute from qualified name
1 parent 42c6a5b commit 0faca8d

3 files changed

Lines changed: 63 additions & 77 deletions

File tree

‎src/Patterns.Builder.Generator/SymbolExtensions.cs‎

Lines changed: 19 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -21,41 +21,6 @@ namespace Microsoft.CodeAnalysis;
2121
/// </summary>
2222
internal static class SymbolExtensions
2323
{
24-
/// <content>
25-
/// The <see cref="Type"/> extensions.
26-
/// </content>
27-
/// <param name="type">The type.</param>
28-
extension(Type type)
29-
{
30-
/// <summary>
31-
/// Converts the type to the <see cref="TypeSyntax"/>.
32-
/// </summary>
33-
/// <param name="parameters">The type parameters.</param>
34-
/// <returns>The type syntax.</returns>
35-
/// <exception cref="ArgumentOutOfRangeException">The parameters are the wrong length.</exception>
36-
public NameSyntax ToTypeSyntax(IEnumerable<TypeSyntax> parameters)
37-
{
38-
if (!type.IsGenericTypeDefinition)
39-
{
40-
return SyntaxFactory.QualifiedName(type.FullName);
41-
}
42-
43-
var index = type.Name.IndexOf('`');
44-
var name = type.Name[..index];
45-
var count = int.Parse(type.Name[(index + 1)..], System.Globalization.CultureInfo.InvariantCulture);
46-
47-
var parameterList = SeparatedList(parameters);
48-
if (count != parameterList.Count)
49-
{
50-
throw new ArgumentOutOfRangeException(nameof(parameters));
51-
}
52-
53-
return QualifiedName(
54-
SyntaxFactory.QualifiedName(type.Namespace),
55-
GenericName(Identifier(name), TypeArgumentList(parameterList)));
56-
}
57-
}
58-
5924
/// <content>
6025
/// The <see cref="ITypeSymbol"/> extensions.
6126
/// </content>
@@ -211,7 +176,7 @@ static SeparatedSyntaxList<TypeSyntax> GetTypeArguments(INamedTypeSymbol type)
211176
{
212177
{ SpecialType: SpecialType.System_Collections_Generic_ICollection_T } => true,
213178
{ OriginalDefinition: { } originalDefinition } when SymbolEqualityComparer.Default.Equals(originalDefinition, collectionType) => true,
214-
{ AllInterfaces: { } interfaces } when interfaces.Select(i => i.OriginalDefinition).Contains(collectionType, SymbolEqualityComparer.Default) => true,
179+
{ AllInterfaces: var interfaces } when interfaces.Select(i => i.OriginalDefinition).Contains(collectionType, SymbolEqualityComparer.Default) => true,
215180
_ => false,
216181
};
217182

@@ -221,49 +186,46 @@ static SeparatedSyntaxList<TypeSyntax> GetTypeArguments(INamedTypeSymbol type)
221186
public bool IsDictionary(ITypeSymbol? dictionaryType) => type switch
222187
{
223188
{ OriginalDefinition: { } originalDefinition } when SymbolEqualityComparer.Default.Equals(originalDefinition, dictionaryType) => true,
224-
{ AllInterfaces: { } interfaces } when interfaces.Select(i => i.OriginalDefinition).Contains(dictionaryType, SymbolEqualityComparer.Default) => true,
189+
{ AllInterfaces: var interfaces } when interfaces.Select(i => i.OriginalDefinition).Contains(dictionaryType, SymbolEqualityComparer.Default) => true,
225190
_ => false,
226191
};
227192
}
228193

229-
extension(IMethodSymbol methodSymbol)
194+
/// <content>
195+
/// The <see cref="IMethodSymbol"/> extensions.
196+
/// </content>
197+
/// <param name="method">The method symbol.</param>
198+
extension(IMethodSymbol method)
230199
{
231200
/// <summary>
232201
/// Gets the parameter list.
233202
/// </summary>
234203
/// <returns>The parameter list.</returns>
235-
public ParameterListSyntax GetParameterList()
236-
{
237-
return ParameterList(SeparatedList(GetParameters(methodSymbol)));
238-
239-
static IEnumerable<ParameterSyntax> GetParameters(IMethodSymbol methodSymbol)
240-
{
241-
return methodSymbol.Parameters.Select(parameter =>
242-
Parameter(
243-
Identifier(parameter.Name))
244-
.WithType(parameter.Type.ToType()));
245-
}
246-
}
204+
public ParameterListSyntax GetParameterList() =>
205+
ParameterList(
206+
SeparatedList(
207+
method.Parameters.Select(parameter =>
208+
Parameter(
209+
Identifier(parameter.Name))
210+
.WithType(parameter.Type.ToType()))));
247211

248212
/// <summary>
249213
/// Gets the object creation.
250214
/// </summary>
251215
/// <returns>The object creation list.</returns>
252216
public ObjectCreationExpressionSyntax GetObjectCreation()
253217
{
254-
if (methodSymbol is { MethodKind: MethodKind.Constructor, ReceiverType: { } receiverType })
218+
if (method is { MethodKind: MethodKind.Constructor, ReceiverType: { } receiverType })
255219
{
256220
return ObjectCreationExpression(
257221
SyntaxFactory.QualifiedName(receiverType.ToString()))
258-
.WithArgumentList(ArgumentList(SeparatedList(GetArguments(methodSymbol))));
222+
.WithArgumentList(
223+
ArgumentList(
224+
SeparatedList(
225+
method.Parameters.Select(static parameter => Argument(IdentifierName(parameter.Name))))));
259226
}
260227

261228
throw new InvalidOperationException();
262-
263-
static IEnumerable<ArgumentSyntax> GetArguments(IMethodSymbol methodSymbol)
264-
{
265-
return Enumerable.Select(methodSymbol.Parameters, parameter => Argument(IdentifierName(parameter.Name)));
266-
}
267229
}
268230
}
269231
}

‎src/Patterns.Builder.Generator/SyntaxExtensions.cs‎

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,54 @@
88
namespace Microsoft.CodeAnalysis.CSharp;
99
#pragma warning restore IDE0130, CheckNamespace
1010

11+
#pragma warning disable RCS1263, SA1101
12+
1113
/// <summary>
1214
/// The syntax extensions.
1315
/// </summary>
1416
internal static class SyntaxExtensions
1517
{
18+
/// <content>
19+
/// The <see cref="Type"/> extensions.
20+
/// </content>
21+
/// <param name="type">The type.</param>
22+
extension(Type type)
23+
{
24+
/// <summary>
25+
/// Converts the type to the <see cref="Syntax.TypeSyntax"/>.
26+
/// </summary>
27+
/// <param name="parameters">The type parameters.</param>
28+
/// <returns>The type syntax.</returns>
29+
/// <exception cref="ArgumentOutOfRangeException">The parameters are the wrong length.</exception>
30+
public Syntax.NameSyntax ToTypeSyntax(IEnumerable<Syntax.TypeSyntax> parameters)
31+
{
32+
if (!type.IsGenericTypeDefinition)
33+
{
34+
return type.FullName is { } fullName
35+
? SyntaxFactory.QualifiedName(fullName)
36+
: throw new InvalidOperationException();
37+
}
38+
39+
var index = type.Name.IndexOf('`');
40+
var name = type.Name[..index];
41+
var count = int.Parse(type.Name[(index + 1)..], System.Globalization.CultureInfo.InvariantCulture);
42+
43+
var parameterList = SyntaxFactory.SeparatedList(parameters);
44+
if (count != parameterList.Count)
45+
{
46+
throw new ArgumentOutOfRangeException(nameof(parameters));
47+
}
48+
49+
var @namespace = type.Namespace is { } n
50+
? SyntaxFactory.QualifiedName(n)
51+
: throw new InvalidOperationException();
52+
53+
return SyntaxFactory.QualifiedName(
54+
@namespace,
55+
SyntaxFactory.GenericName(SyntaxFactory.Identifier(name), SyntaxFactory.TypeArgumentList(parameterList)));
56+
}
57+
}
58+
1659
/// <summary>
1760
/// Converts the simple names to a qualified name.
1861
/// </summary>

‎src/Patterns.Builder.Generator/SyntaxFactoryExtensions.cs‎

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,6 @@ internal static class SyntaxFactoryExtensions
2020
/// </summary>
2121
/// <param name="fullName">The full name.</param>
2222
/// <returns><see cref="Syntax.NameSyntax"/>.</returns>
23-
public static Syntax.NameSyntax QualifiedName(string? fullName)
24-
{
25-
return GetNames(fullName).ToQualifiedName();
26-
27-
static IEnumerable<Syntax.IdentifierNameSyntax> GetNames(string? fullName)
28-
{
29-
return fullName switch
30-
{
31-
not null => fullName.Split('.').Select(RemoveAttribute).Select(SyntaxFactory.IdentifierName),
32-
_ => [],
33-
};
34-
35-
static string RemoveAttribute(string name)
36-
{
37-
return name.EndsWith(nameof(Attribute), StringComparison.Ordinal)
38-
? name[..^nameof(Attribute).Length]
39-
: name;
40-
}
41-
}
42-
}
23+
public static Syntax.NameSyntax QualifiedName(string fullName) => fullName.Split('.').Select(SyntaxFactory.IdentifierName).ToQualifiedName();
4324
}
4425
}

0 commit comments

Comments
 (0)