DisableNormalClassDeclaratonInModelAssemblyAnalyzer.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System.Collections.Immutable;
  2. using Microsoft.CodeAnalysis;
  3. using Microsoft.CodeAnalysis.CSharp;
  4. using Microsoft.CodeAnalysis.CSharp.Syntax;
  5. using Microsoft.CodeAnalysis.Diagnostics;
  6. namespace ET.Analyzer
  7. {
  8. [DiagnosticAnalyzer(LanguageNames.CSharp)]
  9. public class DisableNormalClassDeclaratonInModelAssemblyAnalyzer : DiagnosticAnalyzer
  10. {
  11. public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(EntityClassDeclarationAnalyzerrRule.Rule);
  12. public override void Initialize(AnalysisContext context)
  13. {
  14. if (!AnalyzerGlobalSetting.EnableAnalyzer)
  15. {
  16. return;
  17. }
  18. context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
  19. context.EnableConcurrentExecution();
  20. context.RegisterCompilationStartAction(analysisContext =>
  21. {
  22. if (AnalyzerHelper.IsAssemblyNeedAnalyze(analysisContext.Compilation.AssemblyName, AnalyzeAssembly.AllModel))
  23. {
  24. analysisContext.RegisterSyntaxNodeAction(Analyze,SyntaxKind.ClassDeclaration);
  25. }
  26. });
  27. }
  28. private void Analyze(SyntaxNodeAnalysisContext context)
  29. {
  30. if (context.Node is not ClassDeclarationSyntax classDeclarationSyntax)
  31. {
  32. return;
  33. }
  34. var namedTypeSymbol = context.SemanticModel.GetDeclaredSymbol(classDeclarationSyntax);
  35. if (namedTypeSymbol==null)
  36. {
  37. return;
  38. }
  39. if (namedTypeSymbol.IsETEntity())
  40. {
  41. return;
  42. }
  43. if (namedTypeSymbol.HasAttribute(Definition.EnableClassAttribute))
  44. {
  45. return;
  46. }
  47. Diagnostic diagnostic = Diagnostic.Create(EntityClassDeclarationAnalyzerrRule.Rule, classDeclarationSyntax.Identifier.GetLocation(), namedTypeSymbol);
  48. context.ReportDiagnostic(diagnostic);
  49. }
  50. }
  51. }