Appearance
术语分册 5:编译与测试
这一册负责解释测试工程里最常见的对象,以及“字符串源码 -> 编译对象 -> 驱动运行 -> 断言结果”这条链路。
CSharpSyntaxTree.ParseText(...)
- 一句话说明:把字符串源码解析成 C# 语法树
- 什么时候会用到:你在测试里手工构造输入源码时
- 对应教程:第 12 章
CSharpCompilation.Create(...)
- 一句话说明:手动创建一个 C# 编译对象
- 什么时候会用到:你要在测试里让生成器真正跑起来时
- 对应教程:第 12 章
关键输入:
| 输入 | 作用 |
|---|---|
| 语法树集合 | 测试源码输入 |
| 元数据引用集合 | 补齐外部程序集 |
CSharpCompilationOptions | 配置输出类型等 |
CSharpCompilationOptions
- 一句话说明:控制测试编译行为的选项对象
- 什么时候会用到:你要指定输出类型、编译行为时
OutputKind
- 一句话说明:指定编译结果是类库还是应用程序
- 什么时候会用到:创建
CSharpCompilationOptions时
常见值:
| 成员 | 说明 |
|---|---|
DynamicallyLinkedLibrary | 类库 |
ConsoleApplication | 控制台程序 |
ParseOptions
- 一句话说明:源码解析选项的抽象层
- 什么时候会用到:你要控制源码如何被解析
CSharpParseOptions
- 一句话说明:C# 的具体解析选项
- 什么时候会用到:你要控制语言版本、预处理符号
关键成员:
| 成员 | 能拿到什么 |
|---|---|
LanguageVersion | 当前语言版本 |
PreprocessorSymbolNames | 当前预处理符号 |
MetadataReference
- 一句话说明:编译依赖的外部程序集引用
- 什么时候会用到:测试编译里要补齐
object、Enumerable等类型时 - 对应教程:第 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);下一步去哪里
- 想看运行结果对象和跟踪对象:看 术语分册 6:驱动与跟踪
- 想看诊断、附加文件、文本对象:看 术语分册 7:附加文件、配置、诊断与文本
- 返回索引:看 术语与 API 手册