StaticFieldDeclarationAnalyzer.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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 StaticFieldDeclarationAnalyzer : DiagnosticAnalyzer
  9. {
  10. public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics =>ImmutableArray.Create(StaticFieldDeclarationAnalyzerRule.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 (!AnalyzerHelper.IsAssemblyNeedAnalyze(context.Compilation.AssemblyName, AnalyzeAssembly.All))
  24. {
  25. return;
  26. }
  27. if (!(context.Symbol is INamedTypeSymbol namedTypeSymbol))
  28. {
  29. return;
  30. }
  31. foreach (ISymbol? memberSymbol in namedTypeSymbol.GetMembers())
  32. {
  33. if (memberSymbol is IFieldSymbol { IsConst: false,IsStatic:true } or IPropertySymbol { IsStatic: true })
  34. {
  35. bool hasAttr = memberSymbol.GetAttributes().Any(x => x.AttributeClass?.ToString() == Definition.StaticFieldAttribute);
  36. if (!hasAttr)
  37. {
  38. ReportDiagnostic(memberSymbol);
  39. }
  40. }
  41. }
  42. void ReportDiagnostic(ISymbol symbol)
  43. {
  44. foreach (SyntaxReference? declaringSyntaxReference in symbol.DeclaringSyntaxReferences)
  45. {
  46. Diagnostic diagnostic = Diagnostic.Create(StaticFieldDeclarationAnalyzerRule.Rule, declaringSyntaxReference.GetSyntax()?.GetLocation(), symbol.Name);
  47. context.ReportDiagnostic(diagnostic);
  48. }
  49. }
  50. }
  51. }
  52. }