NetMessageAnalyzer.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System.Collections.Immutable;
  2. using System.Linq;
  3. using Microsoft.CodeAnalysis;
  4. using Microsoft.CodeAnalysis.CSharp;
  5. using Microsoft.CodeAnalysis.CSharp.Syntax;
  6. using Microsoft.CodeAnalysis.Diagnostics;
  7. namespace ET.Analyzer
  8. {
  9. [DiagnosticAnalyzer(LanguageNames.CSharp)]
  10. public class NetMessageAnalyzer : DiagnosticAnalyzer
  11. {
  12. public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics =>ImmutableArray.Create(NetMessageAnalyzerRule.Rule);
  13. public override void Initialize(AnalysisContext context)
  14. {
  15. if (!AnalyzerGlobalSetting.EnableAnalyzer)
  16. {
  17. return;
  18. }
  19. context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
  20. context.EnableConcurrentExecution();
  21. context.RegisterSyntaxNodeAction(this.AnalyzeClassDeclaration, SyntaxKind.ClassDeclaration);
  22. }
  23. private void AnalyzeClassDeclaration(SyntaxNodeAnalysisContext context)
  24. {
  25. if (!AnalyzerHelper.IsAssemblyNeedAnalyze(context.Compilation.AssemblyName, AnalyzeAssembly.AllModel))
  26. {
  27. return;
  28. }
  29. if (context.Node is not ClassDeclarationSyntax classDeclarationSyntax)
  30. {
  31. return;
  32. }
  33. var namedTypeSymbol = context.SemanticModel.GetDeclaredSymbol(classDeclarationSyntax);
  34. if (namedTypeSymbol==null)
  35. {
  36. return;
  37. }
  38. // 筛选出继承IMessage接口的类
  39. if (!namedTypeSymbol.HasInterface(Definition.IMessageInterface))
  40. {
  41. return;
  42. }
  43. foreach (var member in namedTypeSymbol.GetMembers())
  44. {
  45. ITypeSymbol? memberType = null;
  46. if (member is IFieldSymbol fieldSymbol)
  47. {
  48. memberType = fieldSymbol.Type;
  49. }else if (member is IPropertySymbol propertySymbol)
  50. {
  51. memberType = propertySymbol.Type;
  52. }
  53. if (memberType==null)
  54. {
  55. continue;
  56. }
  57. if (!memberType.IsETEntity())
  58. {
  59. continue;
  60. }
  61. var memberSyntax = member.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax();
  62. Diagnostic diagnostic = Diagnostic.Create(NetMessageAnalyzerRule.Rule, memberSyntax?.GetLocation(),namedTypeSymbol.Name, member.Name);
  63. context.ReportDiagnostic(diagnostic);
  64. }
  65. }
  66. }
  67. }