首页 > 其他分享 >学习Source Generators之IncrementalValueProvider

学习Source Generators之IncrementalValueProvider

时间:2024-04-01 11:33:21浏览次数:30  
标签:文件 Debugger IncrementalValueProvider 可以 AdditionalTextsProvider Source 添加 Genera

前面我们使用了IIncrementalGenerator来生成代码,接下来我们来详细了解下IIncrementalGenerator的核心部分IncrementalValueProvider。

介绍

IncrementalValueProvider是基于管道的模式,将我们需要的数据进行处理转换后传递给SourceOutput。
目前官方提供可用的Providers有如下几种:

  • CompilationProvider
  • AdditionalTextsProvider
  • AnalyzerConfigOptionsProvider
  • MetadataReferencesProvider
  • ParseOptionsProvider

实操

接下来我们来使用AdditionalTextsProvider来学习IncrementalValueProvider的运行方式。

创建项目

首先创建LearnIncrementalValueProvider的控制台程序和LearnIncrementalValueProvider.Analysis的netstandard2.0类库两个项目。
image.png
按照前面HelloWorld项目的项目配置进行配置和引用。

添加LearnIncrementalValueProviderGenerator

在LearnIncrementalValueProvider.Analysis中添加LearnIncrementalValueProviderGenerator继承并实现IIncrementalGenerator接口。

using Microsoft.CodeAnalysis;
using System;
using System.Diagnostics;

namespace LearnIncrementalValueProvider.Analysis
{
    [Generator]
    public class LearnIncrementalValueProviderGenerator : IIncrementalGenerator
    {
        public void Initialize(IncrementalGeneratorInitializationContext context)
        {
            Debugger.Launch();
            var additionalTextsProvider = context.AdditionalTextsProvider;

            context.RegisterSourceOutput(additionalTextsProvider, (ctx, additionalTexts) =>
                                         {
                                             var path = additionalTexts.Path;
                                             var text = additionalTexts.GetText(ctx.CancellationToken);
                                         });
        }
    }
}

在实现的代码中,获取到AdditionalTextsProvider,并直接传递给RegisterSourceOutput,并在委托方法中直接获取AdditionalTextsProvider的文件路径以及文本内容。
在方法中加入Debugger.Launch();方便调试。

添加文件和调试

在控制台程序中,添加一个Files目录。往里面塞入一个swagger.json文件。
此时直接调试会发现,断点并不会进入到RegisterSourceOutput的委托中。
image.png
这是因为AdditionalTextsProvider并没有找到任何需要加载的文件。
我们需要在控制台程序的项目文件中添加AdditionalFiles,指定需要监听的文件。

<ItemGroup>
  <AdditionalFiles Include="Files/*" />
</ItemGroup>

添加AdditionalFiles后,在调试一次。
image.png
可以看到断点成功进来了。并且可以看到获取的文件路径以及文件的文本内容。
image.png

多个文件

在Files目录中添加一个txt文件。并写入文本HelloWorld
image.png
然后再调试一次。可以发现,每一个文件都会单独执行一次委托的方法。
image.png

过滤文件

当我们只需要其中一种类型的文件的时候,我们可以通过Where来进行过滤筛选。
image.png
通过Debugger.Log可以发现,只输出了json的文件路径。
image.png

处理数据

可以使用Select来处理我们的数据,比如这里我只获取文件名称。通过Debugger.Log可以看到输出了两个文件名称。
image.png

集合

如果不想多次处理文件的话,可以使用Collect方法,直接把多个文件合并在一起。
image.png
这里可以看到,使用Collect,2个文件可以同时处理。

组合多个IncrementalValueProvider

除了对单个IncrementalValueProvider进行处理外,我们还可以组合不同的IncrementalValueProvider。
比如将CompilationProvider和AdditionalTextsProvider组合起来。
使用Combine方法。
image.png
可以看到 paris的Right和Left分别是CompilationProvider和AdditionalTextsProvider两种类型。

结语

以上就是IncrementalValueProvider比较常用的方式。通过这些操作可以灵活的实现我们的代码生成逻辑。
当然还有其他的IncrementalValueProvider,这里就不都写出来了。其他的可以自己实操玩起来~
本文代码仓库地址https://github.com/fanslead/Learn-SourceGenerator

标签:文件,Debugger,IncrementalValueProvider,可以,AdditionalTextsProvider,Source,添加,Genera
From: https://www.cnblogs.com/fanshaoO/p/18108051

相关文章

  • sourceinsight工具
    1、调出ProjectWindow框这个框默认没有,从View-Panels-ProjectWindow2、选中高亮Options->FileTypeOptions(Alt+Y)->Hightlightreferencestoselectedsymbcol......
  • Ask HN: Recommended resources to learn the Linux kernel and OS theory?
     https://news.ycombinator.com/item?id=20809666 SorecentlyIdidacoupleofminorpatchesontheFreeBSDandNetBSDkernelsandplayedwithsomelinuxkernel.Itwasthefirsttimeinaafewyears,I'vebeenexcitedaboutprogramming.Unfortunat......
  • flutter加载网络图片错误EXCEPTION CAUGHT BY IMAGE RESOURCE SERVICE The following
    在flutter里使用image.network加载网络图片遇到错误══╡EXCEPTIONCAUGHTBYIMAGERESOURCESERVICE╞════════════════════════════════════════════════════ThefollowingSocketExceptionwasthrownresolvingani......
  • 学习Source Generators之IIncrementalGenerator
    前面我们用ISourceGenerator来实现代码生成。但是在官方的介绍中有这么一个警告:Warning:SourcegeneratorsimplementingISourceGeneratorhavebeendeprecatedinfavorofincrementalgenerators.意思是实现ISourceGenerator的源生成器已被弃用,取而代之的是增量生成器。......
  • 学习Source Generators之HelloWorld
    介绍源生成器是C#开发人员可以编写的一种新组件,允许执行两个主要操作:检索表示正在编译的所有用户代码的编译对象。可以检查此对象,并且可以编写适用于正在编译的代码的语法和语义模型的代码,就像现在使用分析器一样。生成可在编译过程中添加到编译对象的C#源文件。也就是......
  • Scala第十二章节(Source读取数据的功能、写入数据的功能以及学员成绩表案例)
    章节目标掌握Source读取数据的功能掌握写入数据的功能掌握学员成绩表案例1.读取数据在Scala语言的Source单例对象中中,提供了一些非常便捷的方法,从而使开发者可以快速的从指定数据源(文本文件,URL地址等)中获取数据,在使用Source单例对象之前,需要先导包,即......
  • 2024-03-26 16:26:50.745 [main] INFO c.a.d.s.b.a.DruidDataSourceAutoConfigure -
    2024-03-2616:42:38.759[main]INFOc.a.d.s.b.a.DruidDataSourceAutoConfigure-InitDruidDataSource2024-03-2616:42:43.114[main]INFOcom.alibaba.druid.pool.DruidDataSource-{dataSource-1}inited2024-03-2616:42:47.348[main]INFOcom.alibaba.druid.po......
  • SpringBoot3项目使用Knife4j时访问doc.html出现Knife4j文档请求异常且开发者工具网络
    1.在各个pom.xml中替换Knife4j的依赖版本,升级为4.0以上,如果找不到依赖可以在Maven配置中多添加几个镜像,或者使用汉化插件重启IDEA;<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId......
  • drf : source,定制序列化字段以及反序列化新增。局部钩子(validate_字段名),全局钩子(va
    source,SerializerMethodField,局部钩子,全局钩子serialzer.py:source用处对应字段:起别名,用处2对应方法:在表模型中定义一个方法,source可以与其关联用处3对应方法:可以当做字段第三种方法的扩展用法:使用程度高。model.pyfromdjango.dbimportmodels#Createyourmo......
  • dotNet符号文件(pdb),符号包(snupkg)和SourceLink
    前言本文的主题是VisualStudio调试NuGet包,以及符号包的概念,如何去发布一个NuGet包,让我们的NuGet包支持SouceLink,这些都是我们开发中比较容易忽视的内容,但是熟悉了以后可以让我们在调试中得心应手,也是开源项目开发的基础篇。demo源代码在文末pdb符号文件程序数......