mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-25 04:59:01 +08:00
refactor(generator): 重构日志生成器以使用新属性名称和日志接口
- 将LogAttribute中的Category属性重命名为Name - 更新构造函数参数名称从category到name - 添加类和方法的XML文档注释 - 将生成的日志字段类型从ILog改为ILogger - 更新日志创建方式从Log.CreateLogger到ConsoleLoggerFactory.GetLogger - 移除项目中的空文件夹引用 - 优化代码结构和注释格式
This commit is contained in:
parent
485b2a11fe
commit
bc2b73b19a
@ -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>
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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,9 +171,15 @@ 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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user