Appearance
FAQ 分册 4:测试、调试与驱动结果
Q15:如何调试源生成器?
- 症状:已经知道大概哪一步出问题,但需要更系统的排查顺序
- 可能原因:每次都从头乱试,没有固定调试路径
- 解决方案:固定顺序:先看输入类,再看中间模型,再看
.g.cs,最后跑测试 - 相关章节:第 12 章
- 相关术语:SourceProductionContext、GeneratorDriver、WithTrackingName(...)
Q16:如何测试源生成器?
- 症状:改了生成器,但不知道如何确认输出没有退化
- 可能原因:还没有把“生成器测试”理解成“输入源码 -> 运行生成器 -> 断言输出”
- 解决方案:优先阅读
ToStringGenerator.Tests,按“解析源码 -> 创建编译 -> 创建驱动 -> 运行驱动 -> 断言结果”这条链路理解 - 相关章节:第 12 章
- 相关术语:CSharpSyntaxTree.ParseText(...)、CSharpCompilation.Create(...)、RunGeneratorsAndUpdateCompilation(...)
Q18:Compilation 和 CSharpCompilation 到底是什么关系?
- 症状:测试里创建时用
CSharpCompilation.Create(...),但返回类型写成Compilation - 可能原因:把“抽象编译对象”和“C# 具体实现”混成一个概念了
- 解决方案:先记最短区别:
Compilation是通用抽象;CSharpCompilation是 C# 的具体实现。测试辅助方法返回前者,是因为后续主要用它的通用能力 - 相关章节:第 12 章
- 相关术语:Compilation、CSharpCompilation.Create(...)
Q19:怎么知道“到底生成了哪些文件”,以及“是谁生成的”?
- 症状:已经能从
outputCompilation.SyntaxTrees看到生成树,但还想知道每个生成器各自产出了什么 - 可能原因:只看了
Compilation,还没有看驱动运行结果 - 解决方案:运行后调用
driver.GetRunResult()。总结果看GeneratedTrees和Diagnostics,单个生成器看Results - 相关章节:第 12 章
- 相关术语:GeneratorDriver、GetRunResult()、GeneratorDriverRunResult、GeneratorRunResult
Q20:我已经加了 WithTrackingName(...),为什么还是看不到步骤跟踪结果?
- 症状:给 provider 起了跟踪名,但运行后还是看不到
TrackedSteps - 可能原因:只做了“步骤命名”,没有在驱动层打开步骤跟踪
- 解决方案:把两件事同时做:一是
WithTrackingName(...),二是通过GeneratorDriverOptions打开trackIncrementalGeneratorSteps - 相关章节:第 12 章
- 相关术语:WithTrackingName(...)、GeneratorDriverOptions、IncrementalGeneratorRunStep、IncrementalStepRunReason
下一步去哪里
- 如果你已经进入附加文件、配置、诊断:看 FAQ 分册 5:高级输入与扩展链路
- 返回 FAQ 首页:看 常见问题与排错