源生成器(二):高效轻量的增量生成器

序
据上篇专栏根据需要自动生成机械重复代码(C#、Attribute、源生成器),可以生成简单的源生成器,但每次代码一处更改时都会扫描整个语法树,开销很大,新的增量生成器[1](Incremental Generator)通过管道[2]等方式遴选需要扫描的代码,大大减少生成开销
注:增量生成器是Roslyn 4.x的新功能,对应VS17.x(即Visual Studio 2022),也就是说只有VS2022及以上的版本才可以使用
创建及使用Attribute
同上篇
创建TypeWithAttributeGenerator
同上篇的源生成器,但继承于IIncrementalGenerator
而且这次为了提高效率、方便扩展,让所有attribute共用一个生成器,添加新的attribute时只需在Attributes上加一条键值对即可
初始化
初始化增量生成器,并指定筛选的两层,最后注册以供运行
两次快速筛选
第一次筛选留下带有attribute的class和record类型,十分高效
第二次再选择attribute包含于Attributes里的类型
运行增量生成器
对每个type的每种attribute进行处理,调用Attributes的值(处理函数)
处理函数
对比上篇的处理函数,函数声明稍有变化,但完全等同:
原参数GeneratorExecutionContext context被取消,AddSource操作改为用string返回,并在Execute函数中实现
原参数INamedTypeSymbol attributeType是用来判断是否是指定的attribute,通过以下代码实现:
现在传入数组List<AttributeData> attributeList,直接传入所有的指定类型的Attribute,可替代该冗长语句
其他两个参数同上篇专栏
函数体内容与上篇内容几乎一致,故不再赘述

引用图片

参考资料
[1] GitHub-IncrementalGenerators(https://github.com/dotnet/roslyn/blob/main/docs/features/incremental-generators.md)
[2] Creating a source generator(https://andrewlock.net/series/creating-a-source-generator)