Skip to content

术语分册 5:编译与测试

这一册负责解释测试工程里最常见的对象,以及“字符串源码 -> 编译对象 -> 驱动运行 -> 断言结果”这条链路。

CSharpSyntaxTree.ParseText(...)

  • 一句话说明:把字符串源码解析成 C# 语法树
  • 什么时候会用到:你在测试里手工构造输入源码时
  • 对应教程:第 12 章

CSharpCompilation.Create(...)

  • 一句话说明:手动创建一个 C# 编译对象
  • 什么时候会用到:你要在测试里让生成器真正跑起来时
  • 对应教程:第 12 章

关键输入:

输入作用
语法树集合测试源码输入
元数据引用集合补齐外部程序集
CSharpCompilationOptions配置输出类型等

CSharpCompilationOptions

  • 一句话说明:控制测试编译行为的选项对象
  • 什么时候会用到:你要指定输出类型、编译行为时

OutputKind

  • 一句话说明:指定编译结果是类库还是应用程序
  • 什么时候会用到:创建 CSharpCompilationOptions

常见值:

成员说明
DynamicallyLinkedLibrary类库
ConsoleApplication控制台程序

ParseOptions

  • 一句话说明:源码解析选项的抽象层
  • 什么时候会用到:你要控制源码如何被解析

CSharpParseOptions

  • 一句话说明:C# 的具体解析选项
  • 什么时候会用到:你要控制语言版本、预处理符号

关键成员:

成员能拿到什么
LanguageVersion当前语言版本
PreprocessorSymbolNames当前预处理符号

MetadataReference

  • 一句话说明:编译依赖的外部程序集引用
  • 什么时候会用到:测试编译里要补齐 objectEnumerable 等类型时
  • 对应教程:第 12 章

关键成员:

成员能拿到什么
Display引用显示名
Properties引用属性
CreateFromFile(...)从 DLL 路径创建引用

MetadataReference.CreateFromFile(...)

  • 一句话说明:从程序集文件创建元数据引用
  • 什么时候会用到:你手上有某个程序集的 Assembly.Location

CSharpGeneratorDriver.Create(...)

  • 一句话说明:创建 C# 生成器驱动
  • 什么时候会用到:你要在测试里手工运行生成器
  • 对应教程:第 12 章

RunGeneratorsAndUpdateCompilation(...)

  • 一句话说明:运行生成器并返回加入生成结果后的新编译
  • 什么时候会用到:测试里最关键的一步

关键输出:

输出能拿到什么
outputCompilation含生成树的新编译
diagnostics生成器运行时产生的诊断

DiagnosticSeverity

  • 一句话说明:诊断严重级别枚举
  • 什么时候会用到:测试里筛出真正导致失败的错误诊断

常见值:

成员说明
Error错误
Warning警告
Info信息

SyntaxTree.FilePath

  • 一句话说明:语法树对应的文件路径或生成文件名
  • 什么时候会用到:你要区分哪棵树是 GenerateToStringAttribute.g.cs、哪棵树是目标 .g.cs

NormalizeWhitespace()

  • 一句话说明:把语法树格式化成稳定的空白风格
  • 什么时候会用到:测试里比较代码时避免被缩进和换行干扰

最常见的测试链路

csharp
var syntaxTree = CSharpSyntaxTree.ParseText(source);
var compilation = CSharpCompilation.Create(...);
var driver = CSharpGeneratorDriver.Create(generator);
driver = (CSharpGeneratorDriver)driver.RunGeneratorsAndUpdateCompilation(
    compilation,
    out var outputCompilation,
    out var diagnostics);

下一步去哪里

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