diff --git a/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs b/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs index 5cdb81ea..e59f61a5 100644 --- a/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs +++ b/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs @@ -2333,16 +2333,36 @@ public class CqrsHandlerRegistryGeneratorTests } /// - /// 验证当 runtime 缺少 generated registry 需要实现的基础注册接口时, + /// 验证当 runtime 缺少 generated registry 需要依赖的基础合同时, /// 生成器会整体跳过发射,避免产出无法承载运行时注册合同的半成品源码。 /// - [Test] - public void Does_Not_Generate_Registry_When_Runtime_Lacks_Handler_Registry_Interface() + /// 待移除 runtime 合同块的起始标记。 + /// 待移除 runtime 合同块之后的下一个稳定标记。 + [TestCase( + "public interface ICqrsHandlerRegistry", + "[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]")] + [TestCase( + "public interface INotificationHandler", + "public interface IStreamRequestHandler")] + [TestCase( + "public interface IStreamRequestHandler", + "rename:MissingIStreamRequestHandler")] + [TestCase( + "[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]", + "[AttributeUsage(AttributeTargets.Assembly)]")] + public void Does_Not_Generate_Registry_When_Runtime_Lacks_Required_Generation_Contract( + string startMarker, + string endMarker) { - var source = RemoveBlock( - HiddenNestedHandlerSelfRegistrationSource, - "public interface ICqrsHandlerRegistry", - "[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]"); + var source = endMarker.StartsWith("rename:", StringComparison.Ordinal) + ? RenameTypeIdentifier( + HiddenNestedHandlerSelfRegistrationSource, + startMarker.Replace("public interface ", string.Empty, StringComparison.Ordinal), + endMarker["rename:".Length..]) + : RemoveBlock( + HiddenNestedHandlerSelfRegistrationSource, + startMarker, + endMarker); var execution = ExecuteGenerator(source); var inputCompilationErrors = execution.InputCompilationDiagnostics .Where(static diagnostic => diagnostic.Severity == DiagnosticSeverity.Error) diff --git a/ai-plan/public/cqrs-rewrite/todos/cqrs-rewrite-migration-tracking.md b/ai-plan/public/cqrs-rewrite/todos/cqrs-rewrite-migration-tracking.md index 5dd0cdfe..a30309b7 100644 --- a/ai-plan/public/cqrs-rewrite/todos/cqrs-rewrite-migration-tracking.md +++ b/ai-plan/public/cqrs-rewrite/todos/cqrs-rewrite-migration-tracking.md @@ -7,15 +7,16 @@ CQRS 迁移与收敛。 ## 当前恢复点 -- 恢复点编号:`CQRS-REWRITE-RP-079` +- 恢复点编号:`CQRS-REWRITE-RP-080` - 当前阶段:`Phase 8` - 当前 PR 锚点:`PR #307` - 当前结论: - `GFramework.Cqrs` 已完成对外部 `Mediator` 的生产级替代,当前主线已从“是否可替代”转向“仓库内部收口与能力深化顺序” - `dispatch/invoker` 生成前移已扩展到 request / stream 路径,`RP-077` 已补齐 request invoker provider gate 与 stream gate 对称的 descriptor / descriptor entry runtime 合同回归 - `RP-078` 已补齐 mixed fallback metadata 在 runtime 不允许多个 fallback attribute 实例时的单字符串 attribute 回退回归 - - 当前 `RP-079` 已补齐 runtime 缺少 generated handler registry interface 时的 generator 静默跳过回归 - - `ai-plan` active 入口现以 `PR #307` 和 `RP-079` 为唯一权威恢复锚点;更早 PR 与阶段细节均以下方归档为准 + - `RP-079` 已补齐 runtime 缺少 generated handler registry interface 时的 generator 静默跳过回归 + - 当前 `RP-080` 已将基础 generation gate 回归扩展到 notification handler interface、stream handler interface 与 registry attribute 缺失分支 + - `ai-plan` active 入口现以 `PR #307` 和 `RP-080` 为唯一权威恢复锚点;更早 PR 与阶段细节均以下方归档为准 ## 当前活跃事实 @@ -60,11 +61,18 @@ CQRS 迁移与收敛。 - 备注:当前 WSL worktree 需要显式绑定 `GIT_DIR` / `GIT_WORK_TREE` 后运行 - `git diff --check` - 结果:通过 +- `dotnet test GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj -c Release --filter "FullyQualifiedName~CqrsHandlerRegistryGeneratorTests.Does_Not_Generate_Registry_When_Runtime_Lacks_Required_Generation_Contract"` + - 结果:通过,`4/4` passed +- `python3 scripts/license-header.py --check` + - 结果:通过 + - 备注:当前 WSL worktree 需要显式绑定 `GIT_DIR` / `GIT_WORK_TREE` 后运行 +- `git diff --check` + - 结果:通过 ## 下一推荐步骤 1. 继续处理 `PR #307` 的剩余 review 收尾,优先保持 `ai-plan` active 入口与 trace 的单一锚点一致 -2. 若继续推进代码切片,优先复核基础 generation gate 中其他必需 runtime contracts 是否也需要同类回归覆盖 +2. 若继续推进代码切片,优先复核基础 generation gate 中 logging / DI 依赖是否已有合适的输入编译安全回归覆盖方式 3. 在进入下一批 runtime / generator 收敛前,保持最小 Release build 或 targeted test 作为权威验证 ## 活跃文档 diff --git a/ai-plan/public/cqrs-rewrite/traces/cqrs-rewrite-migration-trace.md b/ai-plan/public/cqrs-rewrite/traces/cqrs-rewrite-migration-trace.md index 33f9909a..14a7e196 100644 --- a/ai-plan/public/cqrs-rewrite/traces/cqrs-rewrite-migration-trace.md +++ b/ai-plan/public/cqrs-rewrite/traces/cqrs-rewrite-migration-trace.md @@ -109,3 +109,28 @@ 1. 继续复算 branch diff vs `origin/main`,若仍低于 `25` 个文件可继续下一批 2. 下一批优先复核基础 generation gate 中其他必需 runtime contracts 是否也需要同类回归覆盖 + +### 阶段:基础 generated registry contract gate 扩展回归(CQRS-REWRITE-RP-080) + +- 将 `RP-079` 的单一 handler registry interface 缺失回归扩展为基础 generation gate 参数化测试 +- 已补齐缺失分支: + - `ICqrsHandlerRegistry` + - `INotificationHandler` + - `IStreamRequestHandler` + - `CqrsHandlerRegistryAttribute` +- stream handler interface 变体采用类型重命名构造 runtime metadata miss,避免删除命名空间尾部单行接口时引入输入编译错误 + +### 验证(RP-080) + +- `dotnet test GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj -c Release --filter "FullyQualifiedName~CqrsHandlerRegistryGeneratorTests.Does_Not_Generate_Registry_When_Runtime_Lacks_Required_Generation_Contract"` + - 结果:通过,`4/4` passed +- `python3 scripts/license-header.py --check` + - 结果:通过 + - 备注:当前 WSL worktree 需要显式绑定 `GIT_DIR` / `GIT_WORK_TREE` 后运行 +- `git diff --check` + - 结果:通过 + +### 当前下一步(RP-080) + +1. 继续复算 branch diff vs `origin/main`,若仍低于 `25` 个文件可继续下一批 +2. 下一批优先复核基础 generation gate 中 logging / DI 依赖是否已有合适的输入编译安全回归覆盖方式