EntityClassDeclarationAnalyzer.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System.Collections.Immutable;
  2. using System.Linq;
  3. using Microsoft.CodeAnalysis;
  4. using Microsoft.CodeAnalysis.Diagnostics;
  5. namespace ET.Analyzer
  6. {
  7. [DiagnosticAnalyzer(LanguageNames.CSharp)]
  8. public class EntityClassDeclarationAnalyzer: DiagnosticAnalyzer
  9. {
  10. public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(EntityClassDeclarationAnalyzerRule.Rule,EntityCannotDeclareGenericTypeRule.Rule);
  11. public override void Initialize(AnalysisContext context)
  12. {
  13. if (!AnalyzerGlobalSetting.EnableAnalyzer)
  14. {
  15. return;
  16. }
  17. context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
  18. context.EnableConcurrentExecution();
  19. context.RegisterSymbolAction(this.Analyzer, SymbolKind.NamedType);
  20. }
  21. private void Analyzer(SymbolAnalysisContext context)
  22. {
  23. if (!(context.Symbol is INamedTypeSymbol namedTypeSymbol))
  24. {
  25. return;
  26. }
  27. string? t = namedTypeSymbol.BaseType?.BaseType?.ToString();
  28. if (t=="ET.LSEntity")
  29. {
  30. foreach (SyntaxReference? declaringSyntaxReference in namedTypeSymbol.DeclaringSyntaxReferences)
  31. {
  32. SyntaxNode classSyntax = declaringSyntaxReference.GetSyntax();
  33. Diagnostic diagnostic = Diagnostic.Create(EntityClassDeclarationAnalyzerRule.Rule, classSyntax.GetLocation(), namedTypeSymbol.Name,Definition.LSEntityType );
  34. context.ReportDiagnostic(diagnostic);
  35. }
  36. return;
  37. }
  38. if (namedTypeSymbol.BaseType?.ToString()!="ET.LSEntity" && t == Definition.EntityType)
  39. {
  40. foreach (SyntaxReference? declaringSyntaxReference in namedTypeSymbol.DeclaringSyntaxReferences)
  41. {
  42. SyntaxNode classSyntax = declaringSyntaxReference.GetSyntax();
  43. Diagnostic diagnostic = Diagnostic.Create(EntityClassDeclarationAnalyzerRule.Rule, classSyntax.GetLocation(), namedTypeSymbol.Name,Definition.EntityType);
  44. context.ReportDiagnostic(diagnostic);
  45. }
  46. return;
  47. }
  48. var baseType = namedTypeSymbol.BaseType?.ToString();
  49. if (baseType == Definition.EntityType || baseType == Definition.LSEntityType)
  50. {
  51. if (namedTypeSymbol.IsGenericType)
  52. {
  53. var entitySyntax = namedTypeSymbol.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax();
  54. Diagnostic diagnostic = Diagnostic.Create(EntityCannotDeclareGenericTypeRule.Rule, entitySyntax?.GetLocation(),
  55. namedTypeSymbol.Name);
  56. context.ReportDiagnostic(diagnostic);
  57. }
  58. }
  59. }
  60. }
  61. }