Appearance
扩展专题 1:驱动运行结果
这个专题只回答一个问题:如果你已经能从 outputCompilation.SyntaxTrees 看到生成树,但还想知道“每个生成器各自产出了什么”,应该看哪里。
什么时候需要看这个专题
当你遇到下面这些问题时,就该看 GeneratorDriver 的运行结果:
- 哪棵生成树是哪个生成器生成的
- 某个生成器自己报了哪些诊断
- 某个生成器有没有抛异常
- 为什么
SyntaxTrees能看到树,但我还是不知道结果归因
最短理解链路
text
GeneratorDriver
-> GetRunResult()
-> GeneratorDriverRunResult
-> GeneratorRunResult
-> GeneratedSourceResult1. 为什么只看 Compilation.SyntaxTrees 不够
Compilation.SyntaxTrees 只能回答:
- 这次编译里现在有哪些树
它回答不了:
- 哪棵树是哪个生成器生成的
- 这个生成器自己有没有报诊断
- 这个生成器有没有抛异常
这些都属于“驱动运行结果”层面的信息。
2. 最常见的读取方式
csharp
var runResult = driver.GetRunResult();
var allTrees = runResult.GeneratedTrees;
var allDiagnostics = runResult.Diagnostics;
var generatorResult = runResult.Results[0];
var generatedSources = generatorResult.GeneratedSources;3. 三层结果对象怎么分工
| 对象 | 作用 |
|---|---|
GeneratorDriver | 运行生成器并提供读取结果的入口 |
GeneratorDriverRunResult | 一次驱动运行的总结果 |
GeneratorRunResult | 单个生成器自己的结果 |
GeneratedSourceResult | 单条生成源码的结果 |
4. 你最常看的成员
GeneratorDriverRunResult
| 成员 | 你通常怎么用 |
|---|---|
GeneratedTrees | 看总共生成了哪些语法树 |
Diagnostics | 看这次运行的总诊断 |
Results | 继续拆到每个生成器自己的结果 |
GeneratorRunResult
| 成员 | 你通常怎么用 |
|---|---|
GeneratedSources | 看这个生成器到底生成了哪些源码 |
Diagnostics | 看这个生成器自己的诊断 |
Exception | 看它有没有抛异常 |
GeneratedSourceResult
| 成员 | 你通常怎么用 |
|---|---|
HintName | 确认生成文件提示名 |
SourceText | 查看源码文本 |
SyntaxTree | 进一步和编译树对应起来 |
5. 什么时候应该从这里排查
优先使用这个专题的场景:
- 你已经确认生成器会运行
- 你想做更细粒度的测试
- 你要区分多个生成器或多个输出
如果你只是想确认“有没有生成文件”,先看:
obj/.../generatedoutputCompilation.SyntaxTrees
6. 最推荐的配套文档
- 术语解释:看 术语分册 6:驱动与跟踪
- 测试基础链路:看 术语分册 5:编译与测试
- 返回主教程收口:看 第 12 章