65.9K
CodeProject 正在变化。 阅读更多。
Home

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

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2024年1月18日

MIT

3分钟阅读

viewsIcon

2976

提供创建源码生成器的样板指南的 6 篇文章系列

引言

想要创建源码生成器但不知道从哪里开始?这篇 6 部分的文章将为您提供一个样板指南,指导您完成整个过程。

目录

创建源码生成器的基本基础设施

创建源码生成器库

创建一个新的 .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
  • RandomTestDataGenerator

这些对象是我尝试开始规范化基本基础设施的创建,以便可以将其重新用于多个项目。虽然名称并不重要,但总体结构和内容将很重要。

模型和比较器对于防止生成器不必要的抖动是必要的,所以不要跳过使用它们。

  • 模型 - 保存您的生成器正常工作所需的信息
  • 比较器 - 比较您的模型以确定是否发生了有意义的更改。通过将其与
    .WithComparer(_comparer);
    结合使用,在被调查的项目中添加注释不会导致生成器运行。
  • BaseGenerator - 包含生成器的基本流程。 此文件的大部分可以保持不变。

进行修改

BaseGenerator - 这部分基本上可以保持不变。 如果您不打算使用 GeneratorInformation 类,那么您需要在 GeneratorInformation 上进行搜索,并将其替换为您计划使用的类名。

您可能需要更改的部分

  • GetSemanticTarget - 根据您的生成器需要查看的内容,您可能需要来自附加属性的类的信息,或者有关接口本身中定义的另一个类的信息。 对于我们将要构建的生成器,两者都是必要的。
  • GetClassInformation - 这只是一个帮助方法,用于从 Microsoft 语义模型中提取有关类的信息。

    此方法将使您很好地了解如何获取所需的数据。

如果您不打算使用我的 BaseGenerator 类,您将需要从 IIncrementalGenerator 派生。 此时,我强烈建议完全保留 InitializeIsSyntaxTarget。 这是您绝对需要的样板内容。

RandomTestDataGenerator - 更改以下内容

  • 将类的名称更改为您的生成器名称
  • 类命名空间
  • 常量值

属性 [Generator] 非常需要,因此请将其保留。

历史

  • 2024年1月18日:初始版本
© . All rights reserved.