EntityClassDeclarationAnalyzer.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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. public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(EntityClassDeclarationAnalyzerRule.Rule);
  10. public override void Initialize(AnalysisContext context)
  11. {
  12. if (!AnalyzerGlobalSetting.EnableAnalyzer)
  13. {
  14. return;
  15. }
  16. context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
  17. context.EnableConcurrentExecution();
  18. context.RegisterSymbolAction(this.Analyzer, SymbolKind.NamedType);
  19. }
  20. private void Analyzer(SymbolAnalysisContext context)
  21. {
  22. if (!(context.Symbol is INamedTypeSymbol namedTypeSymbol))
  23. {
  24. return;
  25. }
  26. string? t = namedTypeSymbol.BaseType?.BaseType?.ToString();
  27. if (t=="ET.LSEntity")
  28. {
  29. foreach (SyntaxReference? declaringSyntaxReference in namedTypeSymbol.DeclaringSyntaxReferences)
  30. {
  31. SyntaxNode classSyntax = declaringSyntaxReference.GetSyntax();
  32. Diagnostic diagnostic = Diagnostic.Create(EntityClassDeclarationAnalyzerRule.Rule, classSyntax.GetLocation(), namedTypeSymbol.Name,Definition.LSEntityType );
  33. context.ReportDiagnostic(diagnostic);
  34. }
  35. return;
  36. }
  37. if (namedTypeSymbol.BaseType?.ToString()!="ET.LSEntity" && t == Definition.EntityType)
  38. {
  39. foreach (SyntaxReference? declaringSyntaxReference in namedTypeSymbol.DeclaringSyntaxReferences)
  40. {
  41. SyntaxNode classSyntax = declaringSyntaxReference.GetSyntax();
  42. Diagnostic diagnostic = Diagnostic.Create(EntityClassDeclarationAnalyzerRule.Rule, classSyntax.GetLocation(), namedTypeSymbol.Name,Definition.EntityType);
  43. context.ReportDiagnostic(diagnostic);
  44. }
  45. }
  46. }
  47. }
  48. }