Forge
csharpdeeb25a2
1using System.Collections.Immutable;
2using Microsoft.CodeAnalysis;
3using Microsoft.CodeAnalysis.CSharp;
4using Microsoft.CodeAnalysis.CSharp.Syntax;
5using Microsoft.CodeAnalysis.Diagnostics;
6
7namespace CascadeIDE.ArchitectureAnalyzers;
8
9/// <summary>
10/// ADR 0079: кабина (<c>Cockpit/</c>) не импортирует контур <c>CascadeIDE.IdeDisplay</c>.
11/// </summary>
12[DiagnosticAnalyzer(LanguageNames.CSharp)]
13public sealed class CockpitIdeDisplayBoundaryAnalyzer : DiagnosticAnalyzer
14{
15 public const string DiagnosticId = "CASCOPE016";
16
17 private static readonly DiagnosticDescriptor Rule = new(
18 DiagnosticId,
19 "Cockpit не должен ссылаться на CascadeIDE.IdeDisplay",
20 "В Cockpit (ADR 0079) запрещён импорт CascadeIDE.IdeDisplay — CDS и IDS разделены",
21 "Architecture",
22 DiagnosticSeverity.Error,
23 isEnabledByDefault: true,
24 description: "Семантика кабины не зависит от композиторов/снимков IDE-оверлеев.");
25
26 public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);
27
28 public override void Initialize(AnalysisContext context)
29 {
30 context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
31 context.EnableConcurrentExecution();
32 context.RegisterSyntaxNodeAction(AnalyzeUsingDirective, SyntaxKind.UsingDirective);
33 }
34
35 private static void AnalyzeUsingDirective(SyntaxNodeAnalysisContext context)
36 {
37 if (context.Node is not UsingDirectiveSyntax u)
38 return;
39 if (!IsCockpitFilePath(context.Node.SyntaxTree.FilePath))
40 return;
41
42 var name = u.Name?.ToString() ?? "";
43 if (name.StartsWith("CascadeIDE.IdeDisplay", StringComparison.Ordinal) || name == "CascadeIDE.IdeDisplay")
44 context.ReportDiagnostic(Diagnostic.Create(Rule, u.GetLocation()));
45 }
46
47 private static bool IsCockpitFilePath(string? filePath)
48 {
49 if (string.IsNullOrEmpty(filePath))
50 return false;
51 var n = filePath.Replace('\\', '/');
52 return n.Contains("/Cockpit/", StringComparison.OrdinalIgnoreCase);
53 }
54}
55
View only · write via MCP/CIDE