欢迎光临散文网 会员登陆 & 注册

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

2022-04-03 16:34 作者:扑克子  | 我要投稿

据上篇专栏根据需要自动生成机械重复代码(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,可替代该冗长语句

其他两个参数同上篇专栏

函数体内容与上篇内容几乎一致,故不再赘述

引用图片

[わいっしゅ] ID = 96178543

参考资料

[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)

源生成器(二):高效轻量的增量生成器的评论 (共 条)

分享到微博请遵守国家法律