refactor(generator): 重构日志生成器以使用新属性名称和日志接口

- 将LogAttribute中的Category属性重命名为Name
- 更新构造函数参数名称从category到name
- 添加类和方法的XML文档注释
- 将生成的日志字段类型从ILog改为ILogger
- 更新日志创建方式从Log.CreateLogger到ConsoleLoggerFactory.GetLogger
- 移除项目中的空文件夹引用
- 优化代码结构和注释格式
This commit is contained in:
GeWuYou 2025-12-25 08:42:03 +08:00
parent 485b2a11fe
commit bc2b73b19a
3 changed files with 34 additions and 15 deletions

View File

@ -6,11 +6,6 @@
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<Folder Include="entities\" />
<Folder Include="logging\" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\GFramework.Core\GFramework.Core.csproj" /> <ProjectReference Include="..\GFramework.Core\GFramework.Core.csproj" />
</ItemGroup> </ItemGroup>

View File

@ -10,7 +10,7 @@ namespace GFramework.Generator.Attributes.generator.logging;
public sealed class LogAttribute : Attribute public sealed class LogAttribute : Attribute
{ {
/// <summary>日志分类名(默认使用类名)</summary> /// <summary>日志分类名(默认使用类名)</summary>
public string? Category { get; set; } public string? Name { get; set; }
/// <summary>生成字段名</summary> /// <summary>生成字段名</summary>
public string FieldName { get; set; } = "_log"; public string FieldName { get; set; } = "_log";
@ -24,9 +24,9 @@ public sealed class LogAttribute : Attribute
/// <summary> /// <summary>
/// 初始化 LogAttribute 类的新实例 /// 初始化 LogAttribute 类的新实例
/// </summary> /// </summary>
/// <param name="category">日志分类名,默认使用类名</param> /// <param name="name">日志分类名,默认使用类名</param>
public LogAttribute(string? category) public LogAttribute(string? name)
{ {
Category = category; Name = name;
} }
} }

View File

@ -9,6 +9,9 @@ using Microsoft.CodeAnalysis.Text;
namespace GFramework.Generator.generator.logging namespace GFramework.Generator.generator.logging
{ {
/// <summary>
/// 日志生成器用于为标记了LogAttribute的类自动生成日志字段
/// </summary>
[Generator] [Generator]
public sealed class LoggerGenerator : IIncrementalGenerator public sealed class LoggerGenerator : IIncrementalGenerator
{ {
@ -17,6 +20,10 @@ namespace GFramework.Generator.generator.logging
private const string AttributeShortName = "LogAttribute"; private const string AttributeShortName = "LogAttribute";
private const string AttributeShortNameWithoutSuffix = "Log"; private const string AttributeShortNameWithoutSuffix = "Log";
/// <summary>
/// 初始化生成器,设置语法过滤和代码生成逻辑
/// </summary>
/// <param name="context">增量生成器初始化上下文</param>
public void Initialize(IncrementalGeneratorInitializationContext context) public void Initialize(IncrementalGeneratorInitializationContext context)
{ {
// 1. 语法过滤:快速筛选候选类 // 1. 语法过滤:快速筛选候选类
@ -78,6 +85,11 @@ namespace GFramework.Generator.generator.logging
}); });
} }
/// <summary>
/// 获取类符号上的LogAttribute特性
/// </summary>
/// <param name="classSymbol">类符号</param>
/// <returns>LogAttribute特性数据如果不存在则返回null</returns>
private static AttributeData? GetAttribute(INamedTypeSymbol classSymbol) private static AttributeData? GetAttribute(INamedTypeSymbol classSymbol)
{ {
return classSymbol.GetAttributes().FirstOrDefault(a => return classSymbol.GetAttributes().FirstOrDefault(a =>
@ -91,6 +103,12 @@ namespace GFramework.Generator.generator.logging
}); });
} }
/// <summary>
/// 生成日志字段代码
/// </summary>
/// <param name="classSymbol">类符号</param>
/// <param name="attr">LogAttribute特性数据</param>
/// <returns>生成的C#代码字符串</returns>
private static string Generate(INamedTypeSymbol classSymbol, AttributeData attr) private static string Generate(INamedTypeSymbol classSymbol, AttributeData attr)
{ {
var ns = classSymbol.ContainingNamespace.IsGlobalNamespace var ns = classSymbol.ContainingNamespace.IsGlobalNamespace
@ -99,15 +117,15 @@ namespace GFramework.Generator.generator.logging
var className = classSymbol.Name; var className = classSymbol.Name;
// === 解析 Category === // === 解析 Name ===
var category = className; // 默认使用类名 var name = className; // 默认使用类名
// 检查是否有构造函数参数 // 检查是否有构造函数参数
if (attr.ConstructorArguments.Length > 0) if (attr.ConstructorArguments.Length > 0)
{ {
var argValue = attr.ConstructorArguments[0].Value; var argValue = attr.ConstructorArguments[0].Value;
category = argValue switch name = argValue switch
{ {
// 情况 1: 参数存在,但值为 null (例如 [Log] 且构造函数有默认值 null) // 情况 1: 参数存在,但值为 null (例如 [Log] 且构造函数有默认值 null)
null => className, null => className,
@ -143,8 +161,8 @@ namespace GFramework.Generator.generator.logging
sb.AppendLine(" {"); sb.AppendLine(" {");
sb.AppendLine($" /// <summary>Auto-generated logger</summary>"); sb.AppendLine($" /// <summary>Auto-generated logger</summary>");
sb.AppendLine( sb.AppendLine(
$" {access} {staticKeyword}readonly ILog {fieldName} = " + $" {access} {staticKeyword}readonly ILogger {fieldName} = " +
$"Log.CreateLogger(\"{category}\");"); $"new ConsoleLoggerFactory.GetLogger(\"{name}\");");
sb.AppendLine(" }"); sb.AppendLine(" }");
if (ns is not null) if (ns is not null)
@ -153,6 +171,12 @@ namespace GFramework.Generator.generator.logging
return sb.ToString(); return sb.ToString();
} }
/// <summary>
/// 从特性数据中获取命名参数的值
/// </summary>
/// <param name="attr">特性数据</param>
/// <param name="name">参数名称</param>
/// <returns>参数值如果不存在则返回null</returns>
private static object? GetNamedArg(AttributeData attr, string name) private static object? GetNamedArg(AttributeData attr, string name)
{ {
return (from kv in attr.NamedArguments where kv.Key == name select kv.Value.Value).FirstOrDefault(); return (from kv in attr.NamedArguments where kv.Key == name select kv.Value.Value).FirstOrDefault();