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

序
據(jù)上篇專欄根據(jù)需要自動生成機(jī)械重復(fù)代碼(C#、Attribute、源生成器),可以生成簡單的源生成器,但每次代碼一處更改時都會掃描整個語法樹,開銷很大,新的增量生成器[1](Incremental Generator)通過管道[2]等方式遴選需要掃描的代碼,大大減少生成開銷
注:增量生成器是Roslyn 4.x的新功能,對應(yīng)VS17.x(即Visual Studio?2022),也就是說只有VS2022及以上的版本才可以使用
創(chuàng)建及使用Attribute
同上篇
創(chuàng)建TypeWithAttributeGenerator
同上篇的源生成器,但繼承于IIncrementalGenerator
而且這次為了提高效率、方便擴(kuò)展,讓所有attribute共用一個生成器,添加新的attribute時只需在Attributes上加一條鍵值對即可
初始化
初始化增量生成器,并指定篩選的兩層,最后注冊以供運(yùn)行
兩次快速篩選
第一次篩選留下帶有attribute的class和record類型,十分高效
第二次再選擇attribute包含于Attributes里的類型
運(yùn)行增量生成器
對每個type的每種attribute進(jìn)行處理,調(diào)用Attributes的值(處理函數(shù))
處理函數(shù)
對比上篇的處理函數(shù),函數(shù)聲明稍有變化,但完全等同:
原參數(shù)GeneratorExecutionContext context被取消,AddSource操作改為用string返回,并在Execute函數(shù)中實(shí)現(xiàn)
原參數(shù)INamedTypeSymbol attributeType是用來判斷是否是指定的attribute,通過以下代碼實(shí)現(xiàn):
現(xiàn)在傳入數(shù)組List<AttributeData> attributeList,直接傳入所有的指定類型的Attribute,可替代該冗長語句
其他兩個參數(shù)同上篇專欄
函數(shù)體內(nèi)容與上篇內(nèi)容幾乎一致,故不再贅述

引用圖片

參考資料
[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)