GwWuYou 4172952b11 refactor(source-generators): 重构枚举扩展生成器和日志生成器
- 将 EnumExtensionsGenerator 从 IIncrementalGenerator 迁移到 AttributeClassGeneratorBase
- 将 LoggerGenerator 从 IIncrementalGenerator 迁移到 AttributeClassGeneratorBase
- 添加 AttributeEnumGeneratorBase 基类用于枚举相关生成器
- 更新依赖引用路径,使用新的抽象层和通用生成器基类
- 改进代码生成逻辑,使用强类型 Attribute 替代字符串匹配
- 添加详细的 XML 文档注释
- 修改项目目标框架为多版本支持 (net8.0;net9.0;net10.0)
2025-12-28 11:25:24 +08:00

59 lines
2.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
namespace GFramework.SourceGenerators.Common.generator;
/// <summary>
/// 基于特性的枚举生成器基类
/// </summary>
/// <typeparam name="TAttribute">特性类型必须继承自Attribute</typeparam>
public abstract class AttributeEnumGeneratorBase<TAttribute> : IIncrementalGenerator
where TAttribute : Attribute
{
/// <summary>
/// 获取特性的短名称(不包含后缀)
/// </summary>
protected abstract string AttributeShortNameWithoutSuffix { get; }
/// <summary>
/// 初始化增量生成器
/// </summary>
/// <param name="context">增量生成器初始化上下文</param>
public void Initialize(IncrementalGeneratorInitializationContext context)
{
// 查找带有指定特性的枚举声明
var enums = context.SyntaxProvider.CreateSyntaxProvider(
(node, _) => node is EnumDeclarationSyntax decl &&
decl.AttributeLists.SelectMany(a => a.Attributes)
.Any(a => a.Name.ToString().Contains(AttributeShortNameWithoutSuffix)),
(ctx, _) =>
{
var decl = (EnumDeclarationSyntax)ctx.Node;
var symbol = ctx.SemanticModel.GetDeclaredSymbol(decl) as INamedTypeSymbol;
return (decl, symbol);
}).Where(x => x.symbol != null);
// 注册源代码输出
context.RegisterSourceOutput(enums, (spc, pair) =>
{
var attr = pair.symbol!.GetAttributes()
.FirstOrDefault(a => a.AttributeClass?.ToDisplayString() == typeof(TAttribute).FullName);
if (attr == null) return;
var src = Generate(pair.symbol!, attr);
spc.AddSource($"{pair.symbol!.Name}.EnumExtensions.g.cs", SourceText.From(src, Encoding.UTF8));
});
}
/// <summary>
/// 生成源代码
/// </summary>
/// <param name="enumSymbol">枚举符号</param>
/// <param name="attr">特性数据</param>
/// <returns>生成的源代码字符串</returns>
protected abstract string Generate(INamedTypeSymbol enumSymbol, AttributeData attr);
}