从零实现增量源生成器 · 第 13 / 17 篇

诊断不是附属品,而是生成器契约的一部分

好的生成器不会在非法输入上默默失败,而是会明确告诉调用方为什么不能生成。

很多生成器在非法输入上选择“什么都不做”。从实现角度看这很省事,但从使用角度看,它几乎等于没有契约。

当前项目明确把几类约束定义成诊断:

  • TSG001 目标类型必须是 partial
  • TSG002 包含类型必须是 partial
  • TSG003 目标类型不能已经声明无参 ToString
  • TSG004 目标类型不能是 static

为什么要把这些做成显式诊断

因为生成器不是私有脚本,而是会被别人引用的编译期组件。调用方最需要的不是“猜测为什么没生成”,而是尽快收到清晰错误。

显式诊断有三个直接好处:

  • 失败原因离代码更近
  • 回归时更容易写测试
  • 行为边界会稳定下来

契约思维比“尽量兼容”更重要

生成器不是越宽松越好。对于明显不满足前提的输入,越早拒绝,系统越稳定。

一旦你把契约写成诊断,后续扩展功能时就会自然地问自己:这个新规则是语义能力,还是新的契约边界?这个问题会让整个实现更清楚。

教程导航

继续阅读

当前文章已经挂到教程顺序中,建议按相邻章节继续。

上一篇 可空、泛型与嵌套类型,为什么总是高风险回归点 主路径一旦能跑,最容易被忽略的就是可空、泛型和嵌套类型;而这些恰恰最容易让生成器在真实项目里失效。 下一篇 编译级测试,为什么比字符串对比更重要 生成器测试不能只做文本断言,更关键的是验证生成结果是否能编译、诊断是否准确、边界是否被稳稳拦住。
查看系列目录 查看全部文章

标签

分类