diff --git a/GFramework.SourceGenerators/logging/LoggerGenerator.cs b/GFramework.SourceGenerators/logging/LoggerGenerator.cs index 8ace031..3aaa4a8 100644 --- a/GFramework.SourceGenerators/logging/LoggerGenerator.cs +++ b/GFramework.SourceGenerators/logging/LoggerGenerator.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Text; using GFramework.SourceGenerators.Abstractions.logging; @@ -77,6 +78,26 @@ public sealed class LoggerGenerator : TypeAttributeClassGeneratorBase var isStatic = isStaticObj is not bool b || b; // 默认 true var staticKeyword = isStatic ? "static " : ""; + // 泛型参数和约束 + var typeParams = symbol.TypeParameters.Length > 0 + ? "<" + string.Join(", ", symbol.TypeParameters.Select(tp => tp.Name)) + ">" + : ""; + + var constraints = symbol.TypeParameters + .Where(tp => tp.ConstraintTypes.Length > 0 || tp.HasReferenceTypeConstraint || tp.HasValueTypeConstraint || + tp.HasConstructorConstraint) + .Select(tp => + { + var parts = new List(); + + if (tp.HasReferenceTypeConstraint) parts.Add("class"); + if (tp.HasValueTypeConstraint) parts.Add("struct"); + parts.AddRange(tp.ConstraintTypes.Select(t => t.ToDisplayString())); + if (tp.HasConstructorConstraint) parts.Add("new()"); + + return $"where {tp.Name} : {string.Join(", ", parts)}"; + }); + var sb = new StringBuilder(); sb.AppendLine("// "); sb.AppendLine($"using {PathContests.CoreAbstractionsNamespace}.logging;"); @@ -88,7 +109,12 @@ public sealed class LoggerGenerator : TypeAttributeClassGeneratorBase sb.AppendLine(); } - sb.AppendLine($"partial class {className}"); + sb.AppendLine($"partial class {className}{typeParams}"); + foreach (var c in constraints) + { + sb.AppendLine($" {c}"); + } + sb.AppendLine("{"); sb.AppendLine(" /// Auto-generated logger"); sb.AppendLine( @@ -98,6 +124,7 @@ public sealed class LoggerGenerator : TypeAttributeClassGeneratorBase return sb.ToString().TrimEnd(); } + /// /// 可以自定义生成文件名 ///