EntityMemberDeclarationAnalyzer.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using System;
  2. using System.Collections.Immutable;
  3. using System.Linq;
  4. using Microsoft.CodeAnalysis;
  5. using Microsoft.CodeAnalysis.Diagnostics;
  6. namespace ET.Analyzer
  7. {
  8. [DiagnosticAnalyzer(LanguageNames.CSharp)]
  9. public class EntityMemberDeclarationAnalyzer: DiagnosticAnalyzer
  10. {
  11. public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics =>ImmutableArray.Create(EntityDelegateDeclarationAnalyzerRule.Rule,EntityFieldDeclarationInEntityAnalyzerRule.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.RegisterSymbolAction(this.Analyzer, SymbolKind.NamedType);
  21. }
  22. private void Analyzer(SymbolAnalysisContext context)
  23. {
  24. if (!AnalyzerHelper.IsAssemblyNeedAnalyze(context.Compilation.AssemblyName, AnalyzeAssembly.AllModel))
  25. {
  26. return;
  27. }
  28. if (!(context.Symbol is INamedTypeSymbol namedTypeSymbol))
  29. {
  30. return;
  31. }
  32. // 筛选出实体类
  33. if (namedTypeSymbol.BaseType?.ToString() != Definition.EntityType)
  34. {
  35. return;
  36. }
  37. AnalyzeDelegateMember(context, namedTypeSymbol);
  38. AnalyzeEntityMember(context, namedTypeSymbol);
  39. }
  40. /// <summary>
  41. /// 检查委托成员
  42. /// </summary>
  43. private void AnalyzeDelegateMember(SymbolAnalysisContext context,INamedTypeSymbol namedTypeSymbol)
  44. {
  45. foreach (var member in namedTypeSymbol.GetMembers())
  46. {
  47. if (member is IFieldSymbol fieldSymbol && fieldSymbol.Type.BaseType?.ToString()==typeof(MulticastDelegate).FullName)
  48. {
  49. ReportDiagnostic(fieldSymbol,fieldSymbol.Name);
  50. continue;
  51. }
  52. if (member is IPropertySymbol propertySymbol && propertySymbol.Type.BaseType?.ToString()==typeof(MulticastDelegate).FullName)
  53. {
  54. ReportDiagnostic(propertySymbol,propertySymbol.Name);
  55. continue;
  56. }
  57. }
  58. void ReportDiagnostic(ISymbol symbol,string delegateName)
  59. {
  60. foreach (var syntaxReference in symbol.DeclaringSyntaxReferences)
  61. {
  62. var syntax = syntaxReference.GetSyntax();
  63. Diagnostic diagnostic = Diagnostic.Create(EntityDelegateDeclarationAnalyzerRule.Rule, syntax.GetLocation(),namedTypeSymbol.Name,delegateName);
  64. context.ReportDiagnostic(diagnostic);
  65. }
  66. }
  67. }
  68. /// <summary>
  69. /// 检查实体成员
  70. /// </summary>
  71. private void AnalyzeEntityMember(SymbolAnalysisContext context, INamedTypeSymbol namedTypeSymbol)
  72. {
  73. foreach (var member in namedTypeSymbol.GetMembers())
  74. {
  75. if (member is not IFieldSymbol fieldSymbol)
  76. {
  77. continue;
  78. }
  79. // 忽略静态字段 允许单例实体类
  80. if (fieldSymbol.IsStatic)
  81. {
  82. continue;
  83. }
  84. if (fieldSymbol.Type.ToString()== Definition.EntityType || fieldSymbol.Type.BaseType?.ToString()== Definition.EntityType)
  85. {
  86. var syntaxReference = fieldSymbol.DeclaringSyntaxReferences.FirstOrDefault();
  87. if (syntaxReference==null)
  88. {
  89. continue;
  90. }
  91. Diagnostic diagnostic = Diagnostic.Create(EntityFieldDeclarationInEntityAnalyzerRule.Rule, syntaxReference.GetSyntax().GetLocation(),namedTypeSymbol.Name,fieldSymbol.Name);
  92. context.ReportDiagnostic(diagnostic);
  93. }
  94. }
  95. }
  96. }
  97. }