| 1 | #nullable enable |
| 2 | |
| 3 | using System.Collections.Immutable; |
| 4 | using Microsoft.CodeAnalysis; |
| 5 | using Microsoft.CodeAnalysis.CSharp.Syntax; |
| 6 | |
| 7 | namespace CascadeIDE.ArchitectureAnalyzers; |
| 8 | |
| 9 | internal static class ArchitectureForbiddenApiSyntax |
| 10 | { |
| 11 | internal static readonly ImmutableHashSet<string> ForbiddenExternalTypeNames = |
| 12 | ImmutableHashSet.Create( |
| 13 | StringComparer.Ordinal, |
| 14 | "File", |
| 15 | "Directory", |
| 16 | "FileInfo", |
| 17 | "DirectoryInfo", |
| 18 | "Process", |
| 19 | "HttpClient"); |
| 20 | |
| 21 | internal static string? GetForbiddenApiTypeName(ExpressionSyntax expression) => |
| 22 | expression switch |
| 23 | { |
| 24 | IdentifierNameSyntax id when ForbiddenExternalTypeNames.Contains(id.Identifier.ValueText) |
| 25 | => id.Identifier.ValueText, |
| 26 | MemberAccessExpressionSyntax ma when ForbiddenExternalTypeNames.Contains(ma.Name.Identifier.ValueText) |
| 27 | => ma.Name.Identifier.ValueText, |
| 28 | MemberAccessExpressionSyntax ma => GetForbiddenApiTypeName(ma.Expression), |
| 29 | AliasQualifiedNameSyntax alias when ForbiddenExternalTypeNames.Contains(alias.Name.Identifier.ValueText) |
| 30 | => alias.Name.Identifier.ValueText, |
| 31 | QualifiedNameSyntax qualified when ForbiddenExternalTypeNames.Contains(qualified.Right.Identifier.ValueText) |
| 32 | => qualified.Right.Identifier.ValueText, |
| 33 | _ => null |
| 34 | }; |
| 35 | |
| 36 | internal static string? ExtractSimpleTypeName(TypeSyntax typeSyntax) => |
| 37 | typeSyntax switch |
| 38 | { |
| 39 | IdentifierNameSyntax i => i.Identifier.ValueText, |
| 40 | QualifiedNameSyntax q => q.Right.Identifier.ValueText, |
| 41 | GenericNameSyntax g => g.Identifier.ValueText, |
| 42 | AliasQualifiedNameSyntax a => a.Name.Identifier.ValueText, |
| 43 | _ => null |
| 44 | }; |
| 45 | } |
| 46 | |