EntityClassDeclarationAnalyzer.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using System.Collections.Immutable;
  2. using Microsoft.CodeAnalysis;
  3. using Microsoft.CodeAnalysis.Diagnostics;
  4. namespace ET.Analyzer
  5. {
  6. [DiagnosticAnalyzer(LanguageNames.CSharp)]
  7. public class EntityClassDeclarationAnalyzer: DiagnosticAnalyzer
  8. {
  9. private const string Title = "实体类限制多层继承";
  10. private const string MessageFormat = "类: {0} 不能继承Entiy的子类 请直接继承Entity";
  11. private const string Description = "实体类限制多层继承.";
  12. private const string EntityType = "ET.Entity";
  13. private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticIds.EntityClassDeclarationAnalyzerRuleId,
  14. Title,
  15. MessageFormat,
  16. DiagnosticCategories.All,
  17. DiagnosticSeverity.Error, true, Description);
  18. public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);
  19. public override void Initialize(AnalysisContext context)
  20. {
  21. if (!AnalyzerGlobalSetting.EnableAnalyzer)
  22. {
  23. return;
  24. }
  25. context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
  26. context.EnableConcurrentExecution();
  27. context.RegisterSymbolAction(this.Analyzer, SymbolKind.NamedType);
  28. }
  29. private void Analyzer(SymbolAnalysisContext context)
  30. {
  31. if (!(context.Symbol is INamedTypeSymbol namedTypeSymbol))
  32. {
  33. return;
  34. }
  35. if (namedTypeSymbol.BaseType?.BaseType?.ToString() != EntityType)
  36. {
  37. return;
  38. }
  39. foreach (SyntaxReference? declaringSyntaxReference in namedTypeSymbol.DeclaringSyntaxReferences)
  40. {
  41. SyntaxNode classSyntax = declaringSyntaxReference.GetSyntax();
  42. Diagnostic diagnostic = Diagnostic.Create(Rule, classSyntax.GetLocation(), namedTypeSymbol.Name, context.Compilation.AssemblyName);
  43. context.ReportDiagnostic(diagnostic);
  44. }
  45. }
  46. }
  47. }