| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- using System.Collections.Immutable;
- using System.Linq;
- using Microsoft.CodeAnalysis;
- using Microsoft.CodeAnalysis.CSharp;
- using Microsoft.CodeAnalysis.CSharp.Syntax;
- using Microsoft.CodeAnalysis.Diagnostics;
- namespace ET.Analyzer
- {
- [DiagnosticAnalyzer(LanguageNames.CSharp)]
- public class ClassDeclarationInHotfixAnalyzer: DiagnosticAnalyzer
- {
- private const string Title = "Hotfix程序集中 只能声明含有BaseAttribute子类特性的类或静态类";
- private const string MessageFormat = "Hotfix程序集中 只能声明含有BaseAttribute子类特性的类或静态类 类: {0}";
- private const string Description = "Hotfix程序集中 只能声明含有BaseAttribute子类特性的类或静态类.";
- private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticIds.ClassDeclarationInHotfixAnalyzerRuleId,
- Title,
- MessageFormat,
- DiagnosticCategories.Hotfix,
- DiagnosticSeverity.Error, true, Description);
- public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);
- public override void Initialize(AnalysisContext context)
- {
- if (!AnalyzerGlobalSetting.EnableAnalyzer)
- {
- return;
- }
- context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
- context.EnableConcurrentExecution();
- context.RegisterCompilationStartAction((analysisContext =>
- {
- if (analysisContext.Compilation.AssemblyName==AnalyzeAssembly.UnityCodes)
- {
- analysisContext.RegisterSemanticModelAction((modelAnalysisContext =>
- {
- if (AnalyzerHelper.IsSemanticModelNeedAnalyze(modelAnalysisContext.SemanticModel,UnityCodesPath.AllHotfix))
- {
- AnalyzeSemanticModel(modelAnalysisContext);
- }
-
- } ));
- return;
- }
-
- if (AnalyzerHelper.IsAssemblyNeedAnalyze(analysisContext.Compilation.AssemblyName,AnalyzeAssembly.AllHotfix))
- {
- analysisContext.RegisterSemanticModelAction((this.AnalyzeSemanticModel));
- }
- } ));
- }
- private void AnalyzeSemanticModel(SemanticModelAnalysisContext analysisContext)
- {
- foreach (var classDeclarationSyntax in analysisContext.SemanticModel.SyntaxTree.GetRoot().DescendantNodes<ClassDeclarationSyntax>())
- {
- var classTypeSymbol = analysisContext.SemanticModel.GetDeclaredSymbol(classDeclarationSyntax);
- if (classTypeSymbol!=null)
- {
- Analyzer(analysisContext, classTypeSymbol);
- }
- }
- }
-
- private void Analyzer(SemanticModelAnalysisContext context, INamedTypeSymbol namedTypeSymbol)
- {
- if (namedTypeSymbol.IsStatic)
- {
- return;
- }
- if (!this.CheckIsTypeOrBaseTypeHasBaseAttributeInherit(namedTypeSymbol))
- {
- foreach (SyntaxReference? declaringSyntaxReference in namedTypeSymbol.DeclaringSyntaxReferences)
- {
- Diagnostic diagnostic = Diagnostic.Create(Rule, declaringSyntaxReference.GetSyntax()?.GetLocation(), namedTypeSymbol.Name);
- //Diagnostic diagnostic = Diagnostic.Create(Rule, declaringSyntaxReference.GetSyntax()?.GetLocation(), context.SemanticModel.SyntaxTree.FilePath);
- context.ReportDiagnostic(diagnostic);
- }
- }
- }
- /// <summary>
- /// 检查该类或其基类是否有BaseAttribute的子类特性标记
- /// </summary>
- private bool CheckIsTypeOrBaseTypeHasBaseAttributeInherit(INamedTypeSymbol namedTypeSymbol)
- {
- INamedTypeSymbol? typeSymbol = namedTypeSymbol;
- while (typeSymbol != null)
- {
- if (typeSymbol.HasBaseAttribute(Definition.BaseAttribute))
- {
- return true;
- }
- typeSymbol = typeSymbol.BaseType;
- }
- return false;
- }
- }
- }
|