创建源码生成器的样板指南 - 第 2 部分





0/5 (0投票)
提供创建源码生成器的样板指南的 6 篇文章系列
引言
想要创建源码生成器但不知道从哪里开始?这篇 6 部分的文章将为您提供一个样板指南,指导您完成整个过程。
目录
- 第 1 部分 - 介绍 / 准备创建源代码生成器
- 第 2 部分 - 创建源代码生成器的基本基础设施
- 第 3 部分 - 实现源代码生成器
- 第 4 部分 - 调试源代码生成器
- 第 5 部分 - 将源代码生成器打包成 NuGet 包
- 第 6 部分 - 如何使用 NuGet 源代码生成器
创建源码生成器的基本基础设施
创建源码生成器库
创建一个新的 .NET Standard 2.0 类库 并将其添加到您现有的解决方案中。
警告:非常重要的是,您需要将其创建为 .NET Standard 2.0 类库。 如果不这样做,生成器将无法运行。
警告:创建后更改库类型会导致奇怪的结果。最好删除项目并重新开始,以免走得太远。
警告:创建后更改库类型会导致奇怪的结果。最好删除项目并重新开始,以免走得太远。
项目修改
- 添加 NuGet 包 -
Microsoft.CodeAnalysis.CSharp
- 将以下内容添加到项目文件中的
PropertyGroup
中<LangVersion>Latest</LangVersion> <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules> <Nullable>enable</Nullable>
最后一个是可选的,您可以指定至少 10.0 的实际版本。
添加基本基础设施
查看提供的源代码。
这些对象为任何源码生成器布局了基本结构。
您将看到以下结构
BaseClass
- Comparers
ClassInformationComparer
GeneratorInformationComparer
- 模型
ClassInformation
GeneratorInformation
PropertyInformation
- BaseGenerator
- Comparers
RandomTestDataGenerator
这些对象是我尝试开始规范化基本基础设施的创建,以便可以将其重新用于多个项目。虽然名称并不重要,但总体结构和内容将很重要。
模型和比较器对于防止生成器不必要的抖动是必要的,所以不要跳过使用它们。
- 模型 - 保存您的生成器正常工作所需的信息
- 比较器 - 比较您的模型以确定是否发生了有意义的更改。通过将其与
.WithComparer(_comparer);
结合使用,在被调查的项目中添加注释不会导致生成器运行。 BaseGenerator
- 包含生成器的基本流程。 此文件的大部分可以保持不变。
进行修改
BaseGenerator
- 这部分基本上可以保持不变。 如果您不打算使用 GeneratorInformation
类,那么您需要在 GeneratorInformation
上进行搜索,并将其替换为您计划使用的类名。
您可能需要更改的部分
GetSemanticTarget
- 根据您的生成器需要查看的内容,您可能需要来自附加属性的类的信息,或者有关接口本身中定义的另一个类的信息。 对于我们将要构建的生成器,两者都是必要的。GetClassInformation
- 这只是一个帮助方法,用于从 Microsoft 语义模型中提取有关类的信息。此方法将使您很好地了解如何获取所需的数据。
如果您不打算使用我的 BaseGenerator
类,您将需要从 IIncrementalGenerator
派生。 此时,我强烈建议完全保留 Initialize
和 IsSyntaxTarget
。 这是您绝对需要的样板内容。
RandomTestDataGenerator - 更改以下内容
- 将类的名称更改为您的生成器名称
- 类命名空间
- 常量值
属性 [Generator]
非常需要,因此请将其保留。
历史
- 2024年1月18日:初始版本