using System.Collections.Immutable; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Diagnostics; namespace ET.Analyzer { [DiagnosticAnalyzer(LanguageNames.CSharp)] public class EntityClassDeclarationAnalyzer: DiagnosticAnalyzer { public override ImmutableArray SupportedDiagnostics => ImmutableArray.Create(EntityClassDeclarationAnalyzerRule.Rule); public override void Initialize(AnalysisContext context) { if (!AnalyzerGlobalSetting.EnableAnalyzer) { return; } context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); context.EnableConcurrentExecution(); context.RegisterSymbolAction(this.Analyzer, SymbolKind.NamedType); } private void Analyzer(SymbolAnalysisContext context) { if (!(context.Symbol is INamedTypeSymbol namedTypeSymbol)) { return; } string? t = namedTypeSymbol.BaseType?.BaseType?.ToString(); if (t=="ET.LSEntity") { foreach (SyntaxReference? declaringSyntaxReference in namedTypeSymbol.DeclaringSyntaxReferences) { SyntaxNode classSyntax = declaringSyntaxReference.GetSyntax(); Diagnostic diagnostic = Diagnostic.Create(EntityClassDeclarationAnalyzerRule.Rule, classSyntax.GetLocation(), namedTypeSymbol.Name,Definition.LSEntityType ); context.ReportDiagnostic(diagnostic); } return; } if (namedTypeSymbol.BaseType?.ToString()!="ET.LSEntity" && t == Definition.EntityType) { foreach (SyntaxReference? declaringSyntaxReference in namedTypeSymbol.DeclaringSyntaxReferences) { SyntaxNode classSyntax = declaringSyntaxReference.GetSyntax(); Diagnostic diagnostic = Diagnostic.Create(EntityClassDeclarationAnalyzerRule.Rule, classSyntax.GetLocation(), namedTypeSymbol.Name,Definition.EntityType); context.ReportDiagnostic(diagnostic); } } } } }