Forge
csharpdeeb25a2
1#nullable enable
2
3using System.Collections.Immutable;
4using Microsoft.CodeAnalysis;
5using Microsoft.CodeAnalysis.CSharp.Syntax;
6
7namespace CascadeIDE.ArchitectureAnalyzers;
8
9internal 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
View only · write via MCP/CIDE