refactor(sourcegenerators-tests): 收敛 Cqrs 隐藏处理器测试长方法

- 重构 HiddenNestedHandlerSelfRegistration 场景的共享 source fixture,清理当前 MA0051 位点

- 更新 analyzer-warning-reduction 的 tracking 与 trace,记录第二个有效 subagent 写集和基线降至 13 条
This commit is contained in:
gewuyou 2026-04-23 20:12:58 +08:00
parent 8975ef1a20
commit 099a541475
3 changed files with 109 additions and 73 deletions

View File

@ -10,6 +10,75 @@ namespace GFramework.SourceGenerators.Tests.Cqrs;
[TestFixture] [TestFixture]
public class CqrsHandlerRegistryGeneratorTests public class CqrsHandlerRegistryGeneratorTests
{ {
private const string HiddenNestedHandlerSelfRegistrationSource = """
using System;
namespace Microsoft.Extensions.DependencyInjection
{
public interface IServiceCollection { }
public static class ServiceCollectionServiceExtensions
{
public static void AddTransient(IServiceCollection services, Type serviceType, Type implementationType) { }
}
}
namespace GFramework.Core.Abstractions.Logging
{
public interface ILogger
{
void Debug(string msg);
}
}
namespace GFramework.Cqrs.Abstractions.Cqrs
{
public interface IRequest<TResponse> { }
public interface INotification { }
public interface IStreamRequest<TResponse> { }
public interface IRequestHandler<in TRequest, TResponse> where TRequest : IRequest<TResponse> { }
public interface INotificationHandler<in TNotification> where TNotification : INotification { }
public interface IStreamRequestHandler<in TRequest, out TResponse> where TRequest : IStreamRequest<TResponse> { }
}
namespace GFramework.Cqrs
{
public interface ICqrsHandlerRegistry
{
void Register(Microsoft.Extensions.DependencyInjection.IServiceCollection services, GFramework.Core.Abstractions.Logging.ILogger logger);
}
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
public sealed class CqrsHandlerRegistryAttribute : Attribute
{
public CqrsHandlerRegistryAttribute(Type registryType) { }
}
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class CqrsReflectionFallbackAttribute : Attribute
{
public CqrsReflectionFallbackAttribute(params string[] fallbackHandlerTypeNames) { }
}
}
namespace TestApp
{
using GFramework.Cqrs.Abstractions.Cqrs;
public sealed record VisibleRequest() : IRequest<string>;
public sealed class Container
{
private sealed record HiddenRequest() : IRequest<string>;
private sealed class HiddenHandler : IRequestHandler<HiddenRequest, string> { }
}
public sealed class VisibleHandler : IRequestHandler<VisibleRequest, string> { }
}
""";
private const string HiddenNestedHandlerSelfRegistrationExpected = """ private const string HiddenNestedHandlerSelfRegistrationExpected = """
// <auto-generated /> // <auto-generated />
#nullable enable #nullable enable
@ -453,77 +522,8 @@ public class CqrsHandlerRegistryGeneratorTests
public async Task public async Task
Generates_Visible_Handlers_And_Self_Registers_Private_Nested_Handler_When_Assembly_Contains_Hidden_Handler() Generates_Visible_Handlers_And_Self_Registers_Private_Nested_Handler_When_Assembly_Contains_Hidden_Handler()
{ {
const string source = """
using System;
namespace Microsoft.Extensions.DependencyInjection
{
public interface IServiceCollection { }
public static class ServiceCollectionServiceExtensions
{
public static void AddTransient(IServiceCollection services, Type serviceType, Type implementationType) { }
}
}
namespace GFramework.Core.Abstractions.Logging
{
public interface ILogger
{
void Debug(string msg);
}
}
namespace GFramework.Cqrs.Abstractions.Cqrs
{
public interface IRequest<TResponse> { }
public interface INotification { }
public interface IStreamRequest<TResponse> { }
public interface IRequestHandler<in TRequest, TResponse> where TRequest : IRequest<TResponse> { }
public interface INotificationHandler<in TNotification> where TNotification : INotification { }
public interface IStreamRequestHandler<in TRequest, out TResponse> where TRequest : IStreamRequest<TResponse> { }
}
namespace GFramework.Cqrs
{
public interface ICqrsHandlerRegistry
{
void Register(Microsoft.Extensions.DependencyInjection.IServiceCollection services, GFramework.Core.Abstractions.Logging.ILogger logger);
}
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
public sealed class CqrsHandlerRegistryAttribute : Attribute
{
public CqrsHandlerRegistryAttribute(Type registryType) { }
}
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class CqrsReflectionFallbackAttribute : Attribute
{
public CqrsReflectionFallbackAttribute(params string[] fallbackHandlerTypeNames) { }
}
}
namespace TestApp
{
using GFramework.Cqrs.Abstractions.Cqrs;
public sealed record VisibleRequest() : IRequest<string>;
public sealed class Container
{
private sealed record HiddenRequest() : IRequest<string>;
private sealed class HiddenHandler : IRequestHandler<HiddenRequest, string> { }
}
public sealed class VisibleHandler : IRequestHandler<VisibleRequest, string> { }
}
""";
await GeneratorTest<CqrsHandlerRegistryGenerator>.RunAsync( await GeneratorTest<CqrsHandlerRegistryGenerator>.RunAsync(
source, HiddenNestedHandlerSelfRegistrationSource,
("CqrsHandlerRegistry.g.cs", HiddenNestedHandlerSelfRegistrationExpected)); ("CqrsHandlerRegistry.g.cs", HiddenNestedHandlerSelfRegistrationExpected));
} }

View File

@ -7,9 +7,16 @@
## 当前恢复点 ## 当前恢复点
- 恢复点编号:`ANALYZER-WARNING-REDUCTION-RP-037` - 恢复点编号:`ANALYZER-WARNING-REDUCTION-RP-038`
- 当前阶段:`Phase 37` - 当前阶段:`Phase 38`
- 当前焦点: - 当前焦点:
- 已通过第二个有效 subagent 切片完成
`CqrsHandlerRegistryGeneratorTests.cs`
`Generates_Visible_Handlers_And_Self_Registers_Private_Nested_Handler_When_Assembly_Contains_Hidden_Handler()`
`MA0051` 收口:将内联 `source` 文本提取为类级常量,保持既有 expected 常量和断言语义不变
- 当前 `GFramework.SourceGenerators.Tests` Release warnings-only 基线已从 `14` 条降到 `13` 条;
行号 `454` 已从 `MA0051` 输出中消失,剩余热点继续集中在
`CqrsHandlerRegistryGeneratorTests.cs`
- 已通过 subagent 循环的首个可交付切片完成 - 已通过 subagent 循环的首个可交付切片完成
`GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs` `GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs`
`Generates_Assembly_Level_Cqrs_Handler_Registry()``MA0051` 收口: `Generates_Assembly_Level_Cqrs_Handler_Registry()``MA0051` 收口:
@ -158,6 +165,8 @@
`GFramework.SourceGenerators.Tests` Release warnings-only 基线进一步降到 `15` `GFramework.SourceGenerators.Tests` Release warnings-only 基线进一步降到 `15`
- 已完成 `RP-037` 的首个 subagent 接收:`CqrsHandlerRegistryGeneratorTests.cs` - 已完成 `RP-037` 的首个 subagent 接收:`CqrsHandlerRegistryGeneratorTests.cs`
`Generates_Assembly_Level_Cqrs_Handler_Registry()` 已抽出类级 fixture当前测试项目基线进一步降到 `14` `Generates_Assembly_Level_Cqrs_Handler_Registry()` 已抽出类级 fixture当前测试项目基线进一步降到 `14`
- 已完成 `RP-038` 的第二个 subagent 接收:`HiddenNestedHandlerSelfRegistrationSource` 已提取到类级常量,
当前测试项目基线进一步降到 `13`
## 当前活跃事实 ## 当前活跃事实
@ -210,6 +219,8 @@
`CqrsHandlerRegistryGeneratorTests` `CqrsHandlerRegistryGeneratorTests`
- `RP-037` 已验证 subagent 循环开始产生稳定吞吐,但当前一轮只消掉 `1` 个 warning 位点; - `RP-037` 已验证 subagent 循环开始产生稳定吞吐,但当前一轮只消掉 `1` 个 warning 位点;
若继续按“唯一变更文件数接近 `75`”推进,需要接受很多轮单文件、单方法级切片 若继续按“唯一变更文件数接近 `75`”推进,需要接受很多轮单文件、单方法级切片
- `RP-038` 继续验证了“单方法 + 主线程记录恢复点”的 subagent 节奏可稳定复用,但按当前速度离
“接近 `75` 个唯一变更文件”仍然非常远
- `RP-021` 使用 `$gframework-pr-review` 复核当前分支 PR #269 后,修复仍在本地成立的 4 个项:将 - `RP-021` 使用 `$gframework-pr-review` 复核当前分支 PR #269 后,修复仍在本地成立的 4 个项:将
`CqrsHandlerRegistryGenerator` 拆分为职责清晰的 partial 文件、为 `ContextAwareGenerator` 生成字段增加稳定前缀并补上 `CqrsHandlerRegistryGenerator` 拆分为职责清晰的 partial 文件、为 `ContextAwareGenerator` 生成字段增加稳定前缀并补上
`SetContextProvider` 的运行时 null 校验、为 `Option<T>` 补齐 `<remarks>`,并新增字段重名场景的生成器快照测试 `SetContextProvider` 的运行时 null 校验、为 `Option<T>` 补齐 `<remarks>`,并新增字段重名场景的生成器快照测试
@ -448,13 +459,16 @@
- `RP-037` 的验证结果: - `RP-037` 的验证结果:
- `dotnet build GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj -c Release -t:Rebuild --no-restore --disable-build-servers -m:1 -p:UseSharedCompilation=false -p:RestoreFallbackFolders="" -nologo -clp:"Summary;WarningsOnly"` - `dotnet build GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj -c Release -t:Rebuild --no-restore --disable-build-servers -m:1 -p:UseSharedCompilation=false -p:RestoreFallbackFolders="" -nologo -clp:"Summary;WarningsOnly"`
- 结果:`14 Warning(s)``0 Error(s)``CqrsHandlerRegistryGeneratorTests.cs` 的行号 `337` 已不再出现在 `MA0051` 列表中 - 结果:`14 Warning(s)``0 Error(s)``CqrsHandlerRegistryGeneratorTests.cs` 的行号 `337` 已不再出现在 `MA0051` 列表中
- `RP-038` 的验证结果:
- `dotnet build GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj -c Release -t:Rebuild --no-restore --disable-build-servers -m:1 -p:UseSharedCompilation=false -p:RestoreFallbackFolders="" -nologo -clp:"Summary;WarningsOnly"`
- 结果:`13 Warning(s)``0 Error(s)``CqrsHandlerRegistryGeneratorTests.cs` 的行号 `454` 已不再出现在 `MA0051` 列表中
- active 跟踪文件只保留当前恢复点、活跃事实、风险与下一步,不再重复保存已完成阶段的长篇历史 - active 跟踪文件只保留当前恢复点、活跃事实、风险与下一步,不再重复保存已完成阶段的长篇历史
## 下一步 ## 下一步
1. 若要继续该主题,先读 active tracking再按需展开历史归档中的 warning 热点与验证记录 1. 若要继续该主题,先读 active tracking再按需展开历史归档中的 warning 热点与验证记录
2. 下一轮优先继续 `GFramework.SourceGenerators.Tests``MA0051` 收口,并直接进入唯一剩余热点 2. 下一轮优先继续 `GFramework.SourceGenerators.Tests``MA0051` 收口,并直接进入唯一剩余热点
`CqrsHandlerRegistryGeneratorTests.cs`;优先把行号 `454`、`536`、`607``680` 对应的前半段长方法继续拆小 `CqrsHandlerRegistryGeneratorTests.cs`;优先把行号 `536`、`607``680` 对应的前半段长方法继续拆小
3. 若改回推进 `MA0158`,先设计 `net8.0` / `net9.0` / `net10.0` 多 target 条件编译方案,不直接批量替换共享源码中的 3. 若改回推进 `MA0158`,先设计 `net8.0` / `net9.0` / `net10.0` 多 target 条件编译方案,不直接批量替换共享源码中的
`object` lock `object` lock
4. 若后续继续改动 `GFramework.Godot`,先修复该项目的 Linux 侧 restore 资产,再补跑独立 build 4. 若后续继续改动 `GFramework.Godot`,先修复该项目的 Linux 侧 restore 资产,再补跑独立 build

View File

@ -1,5 +1,27 @@
# Analyzer Warning Reduction 追踪 # Analyzer Warning Reduction 追踪
## 2026-04-23 — RP-038
### 阶段subagent 循环第二个有效写集RP-038
- 启动复核:
- 在 `RP-037` 成功后,继续沿用“单方法级 subagent”节奏推进同一热点文件
- 本轮目标收敛到 `Generates_Visible_Handlers_And_Self_Registers_Private_Nested_Handler_When_Assembly_Contains_Hidden_Handler()`
- 决策:
- 仅提取该方法的内联 `source` 文本,继续复用现有 `HiddenNestedHandlerSelfRegistrationExpected`
- 保持 method name、expected 常量、生成文件名和断言语义不变
- 实施调整:
- 新增类级常量 `HiddenNestedHandlerSelfRegistrationSource`
- 将目标测试方法改为复用该常量调用 `GeneratorTest<CqrsHandlerRegistryGenerator>.RunAsync(...)`
- 验证结果:
- `dotnet build GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj -c Release -t:Rebuild --no-restore --disable-build-servers -m:1 -p:UseSharedCompilation=false -p:RestoreFallbackFolders="" -nologo -clp:"Summary;WarningsOnly"`
- 结果:`13 Warning(s)``0 Error(s)`;原先位于行号 `454``MA0051` 已消失
- 当前结论:
- subagent 循环已连续两轮产出稳定 patch但仍只是在同一个文件内逐点消除 warning
- 当前分支相对 `origin/main` 的唯一变更文件数仍远低于 `75`
- 下一步建议:
- 继续处理 `CqrsHandlerRegistryGeneratorTests.cs` 的下一处前半段热点:行号 `536`
## 2026-04-23 — RP-037 ## 2026-04-23 — RP-037
### 阶段subagent 循环首个有效写集RP-037 ### 阶段subagent 循环首个有效写集RP-037