using System.Linq; using System.Text; using GFramework.SourceGenerators.Common.constants; using GFramework.SourceGenerators.Common.generator; using GFramework.SourceGenerators.diagnostics; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace GFramework.SourceGenerators.rule; [Generator] public sealed class ContextAwareGenerator : MetadataAttributeClassGeneratorBase { /// /// 获取属性元数据的完整名称,用于标识ContextAwareAttribute的完全限定名 /// /// 返回ContextAwareAttribute的完全限定名字符串 protected override string AttributeMetadataName => $"{PathContests.SourceGeneratorsAbstractionsPath}.rule.ContextAwareAttribute"; /// /// 仅用于 Syntax 粗筛选 /// /// 返回属性的简短名称,不包含后缀 protected override string AttributeShortNameWithoutSuffix => "ContextAware"; /// /// 额外语义校验:必须实现 IContextAware /// protected override bool ValidateSymbol( SourceProductionContext context, Compilation compilation, ClassDeclarationSyntax syntax, INamedTypeSymbol symbol, AttributeData attr) { var iContextAware = compilation .GetTypeByMetadataName( $"{PathContests.CoreAbstractionsNamespace}.rule.IContextAware"); if (iContextAware is null) { context.ReportDiagnostic(Diagnostic.Create( ContextAwareDiagnostic.ClassMustImplementIContextAware, syntax.Identifier.GetLocation(), symbol.Name)); return false; } if (!symbol.AllInterfaces.Any(i => SymbolEqualityComparer.Default.Equals(i, iContextAware))) { context.ReportDiagnostic(Diagnostic.Create( ContextAwareDiagnostic.ClassMustImplementIContextAware, syntax.Identifier.GetLocation(), symbol.Name)); return false; } return true; } /// /// 生成源码 /// protected override string Generate( INamedTypeSymbol symbol, AttributeData attr) { var ns = symbol.ContainingNamespace.IsGlobalNamespace ? null : symbol.ContainingNamespace.ToDisplayString(); var sb = new StringBuilder(); sb.AppendLine("// "); sb.AppendLine("#nullable enable"); sb.AppendLine(); if (ns is not null) { sb.AppendLine($"namespace {ns};"); sb.AppendLine(); } sb.AppendLine($"partial class {symbol.Name}"); sb.AppendLine("{"); // 属性 sb.AppendLine(" /// "); sb.AppendLine(" /// 自动注入的架构上下文"); sb.AppendLine(" /// "); sb.AppendLine( $" protected {PathContests.CoreAbstractionsNamespace}.architecture.IArchitectureContext Context {{ get; private set; }} = null!;"); sb.AppendLine(); // 方法 sb.AppendLine( $" void {PathContests.CoreAbstractionsNamespace}.rule.IContextAware.SetContext("); sb.AppendLine( $" {PathContests.CoreAbstractionsNamespace}.architecture.IArchitectureContext context)"); sb.AppendLine(" {"); sb.AppendLine(" Context = context;"); sb.AppendLine(" }"); sb.AppendLine("}"); return sb.ToString().TrimEnd(); } /// /// 自定义生成文件名 /// protected override string GetHintName(INamedTypeSymbol symbol) { // 包含命名空间和生成器类名路径 return $"{symbol.Name}.ContextAware.g.cs"; } }