-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathTypeSyntaxExtensions.cs
72 lines (66 loc) · 2.49 KB
/
TypeSyntaxExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace Architect.DomainModeling.Generator;
/// <summary>
/// Provides extensions on <see cref="TypeSyntax"/>.
/// </summary>
internal static class TypeSyntaxExtensions
{
/// <summary>
/// Returns whether the given <see cref="TypeSyntax"/> has the given arity (type parameter count) and (unqualified) name.
/// </summary>
/// <param name="arity">Pass null to accept any arity.</param>
public static bool HasArityAndName(this TypeSyntax typeSyntax, int? arity, string unqualifiedName)
{
return TryGetArityAndUnqualifiedName(typeSyntax, out var actualArity, out var actualUnqualifiedName) &&
(arity is null || actualArity == arity) &&
actualUnqualifiedName == unqualifiedName;
}
/// <summary>
/// Returns whether the given <see cref="TypeSyntax"/> has the given arity (type parameter count) and (unqualified) name suffix.
/// </summary>
/// <param name="arity">Pass null to accept any arity.</param>
public static bool HasArityAndNameSuffix(this TypeSyntax typeSyntax, int? arity, string unqualifiedName)
{
return TryGetArityAndUnqualifiedName(typeSyntax, out var actualArity, out var actualUnqualifiedName) &&
(arity is null || actualArity == arity) &&
actualUnqualifiedName.EndsWith(unqualifiedName);
}
private static bool TryGetArityAndUnqualifiedName(TypeSyntax typeSyntax, out int arity, out string unqualifiedName)
{
if (typeSyntax is SimpleNameSyntax simpleName)
{
arity = simpleName.Arity;
unqualifiedName = simpleName.Identifier.ValueText;
}
else if (typeSyntax is QualifiedNameSyntax qualifiedName)
{
arity = qualifiedName.Arity;
unqualifiedName = qualifiedName.Right.Identifier.ValueText;
}
else if (typeSyntax is AliasQualifiedNameSyntax aliasQualifiedName)
{
arity = aliasQualifiedName.Arity;
unqualifiedName = aliasQualifiedName.Name.Identifier.ValueText;
}
else
{
arity = -1;
unqualifiedName = null!;
return false;
}
return true;
}
/// <summary>
/// Returns the given <see cref="TypeSyntax"/>'s name, or null if no name can be obtained.
/// </summary>
public static string? GetNameOrDefault(this TypeSyntax typeSyntax)
{
return typeSyntax switch
{
SimpleNameSyntax simpleName => simpleName.Identifier.ValueText,
QualifiedNameSyntax qualifiedName => qualifiedName.Right.Identifier.ValueText,
AliasQualifiedNameSyntax aliasQualifiedName => aliasQualifiedName.Name.Identifier.ValueText,
_ => null,
};
}
}