-
Notifications
You must be signed in to change notification settings - Fork 1
/
TypeSymbolXtn.cs
49 lines (44 loc) · 1.73 KB
/
TypeSymbolXtn.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
namespace ThunderLib.Core.GeneratorHelpers
{
using System;
using System.Linq;
using Microsoft.CodeAnalysis;
public static class TypeSymbolXtn
{
public static String GloballyQualifiedTypeName(this ITypeSymbol symbol, Boolean withGenerics = false)
{
static String RecName(INamespaceOrTypeSymbol symbol)
{
if(symbol is ITypeSymbol ts)
{
if(ts.ContainingType is null)
{
if(ts.ContainingNamespace is null)
{
return ts.Name;
}
return $"{RecName(ts.ContainingNamespace)}.{ts.Name}";
} else
{
return $"{RecName(symbol.ContainingType)}.{ts.Name}";
}
}
if(symbol is INamespaceSymbol ns)
{
if(ns.ContainingNamespace is null || String.IsNullOrWhiteSpace(ns.ContainingNamespace.Name))
{
return ns.Name;
}
return $"{RecName(ns.ContainingNamespace)}.{ns.Name}";
}
return null;
}
return $"global::{RecName(symbol)}{(withGenerics ? symbol.GetGenerics() : "")}";
}
public static String GetGenerics(this ITypeSymbol symbol)
{
if(symbol is not INamedTypeSymbol nts || nts.TypeArguments.Length <= 0 || !nts.IsGenericType || nts.TypeParameters.Length <= 0) return "";
return $"<{String.Join(", ", nts.TypeArguments.Select(s => s.GloballyQualifiedTypeName(true)))}>";
}
}
}