FiberLogAnalyzer.cs 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. [DiagnosticAnalyzer(LanguageNames.CSharp)]
  8. public class FiberLogAnalyzer:DiagnosticAnalyzer
  9. {
  10. public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(FiberLogAnalyzerRule.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.RegisterCompilationStartAction((analysisContext =>
  20. {
  21. if (AnalyzerHelper.IsAssemblyNeedAnalyze(analysisContext.Compilation.AssemblyName, AnalyzeAssembly.AllModelHotfix))
  22. {
  23. analysisContext.RegisterSyntaxNodeAction(AnalyzeMemberAccessExpression,SyntaxKind.InvocationExpression);
  24. }
  25. } ));
  26. }
  27. private void AnalyzeMemberAccessExpression(SyntaxNodeAnalysisContext context)
  28. {
  29. if (!(context.Node is InvocationExpressionSyntax invocationExpressionSyntax))
  30. {
  31. return;
  32. }
  33. var methodSymbol = context.SemanticModel.GetSymbolInfo(invocationExpressionSyntax).Symbol as IMethodSymbol;
  34. if (methodSymbol==null)
  35. {
  36. return;
  37. }
  38. // 筛选出调用ET.Log的日志输出
  39. if (methodSymbol.ContainingType.ToString() != Definition.ETLog)
  40. {
  41. return;
  42. }
  43. if (invocationExpressionSyntax.GetNeareastAncestor<ClassDeclarationSyntax>() is not ClassDeclarationSyntax parentClassSyntax)
  44. {
  45. return;
  46. }
  47. if (context.SemanticModel.GetDeclaredSymbol(parentClassSyntax) is not INamedTypeSymbol parentClassSymbol)
  48. {
  49. return;
  50. }
  51. // 判断是否在实体类内部调用
  52. if (parentClassSymbol.ToString()==Definition.EntityType|| parentClassSymbol.ToString()==Definition.LSEntityType || parentClassSymbol.BaseType?.ToString()==Definition.EntityType ||parentClassSymbol.BaseType?.ToString()==Definition.LSEntityType)
  53. {
  54. Diagnostic diagnostic = Diagnostic.Create(FiberLogAnalyzerRule.Rule, invocationExpressionSyntax?.GetLocation());
  55. context.ReportDiagnostic(diagnostic);
  56. return;
  57. }
  58. // 判断是否在含实体类参数的函数内调用
  59. if (invocationExpressionSyntax.GetNeareastAncestor<MethodDeclarationSyntax>() is not MethodDeclarationSyntax methodDeclarationSyntax)
  60. {
  61. return;
  62. }
  63. if (context.SemanticModel.GetDeclaredSymbol(methodDeclarationSyntax) is not IMethodSymbol containningMethodSymbol)
  64. {
  65. return;
  66. }
  67. foreach (var parameter in containningMethodSymbol.Parameters)
  68. {
  69. var parameterType = parameter.Type.ToString();
  70. var parameterBaseType = parameter.Type.BaseType?.ToString();
  71. if (parameterType== Definition.EntityType|| parameterType==Definition.LSEntityType ||parameterBaseType==Definition.EntityType ||parameterBaseType==Definition.LSEntityType)
  72. {
  73. Diagnostic diagnostic = Diagnostic.Create(FiberLogAnalyzerRule.Rule, invocationExpressionSyntax?.GetLocation());
  74. context.ReportDiagnostic(diagnostic);
  75. return;
  76. }
  77. }
  78. }
  79. }