Skip to content

扩展专题 1:驱动运行结果

这个专题只回答一个问题:如果你已经能从 outputCompilation.SyntaxTrees 看到生成树,但还想知道“每个生成器各自产出了什么”,应该看哪里。

什么时候需要看这个专题

当你遇到下面这些问题时,就该看 GeneratorDriver 的运行结果:

  • 哪棵生成树是哪个生成器生成的
  • 某个生成器自己报了哪些诊断
  • 某个生成器有没有抛异常
  • 为什么 SyntaxTrees 能看到树,但我还是不知道结果归因

最短理解链路

text
GeneratorDriver
  -> GetRunResult()
  -> GeneratorDriverRunResult
  -> GeneratorRunResult
  -> GeneratedSourceResult

1. 为什么只看 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/.../generated
  • outputCompilation.SyntaxTrees

6. 最推荐的配套文档

基于当前仓库文档副本构建的 VitePress 站点