首页 > 其他分享 >Source Generator-添加诊断(五)

Source Generator-添加诊断(五)

时间:2023-03-20 17:56:30浏览次数:29  
标签:xml 文件 Generator 代码 Source 编译器 添加 context using

诊断的含义

通过自己的逻辑代码判断动态编译的代码是否有问题,有问题时需要告诉编译器有警告或者错误,让编译器返回来向我们展示我们期望的诊断信息。
因为动态编译时编译器无法得知我们写入是否有问题,从而产生很多奇奇怪怪的错误提示。

使用场景

当代码写好了,准备编译生成时,我们无法判断动态生成的代码是否存在问题(非少了分号那种),例如xml中不包含标签,但代码中是通过获得标签来获得的代码;又例如我们以为动态文件是一个cs类。如何在编译时就能让编译器知道我们可能弄错了文件的内容或者格式,此时context.ReportDiagnostic()方法可以帮助我们。

代码实现

  1. 创建一个类库(DiagnosticsGeneratorMethod)

  2. 添加Microsoft.CodeAnalysis.CSharp和Microsoft.CodeAnalysis.Analyzers引用

      <ItemGroup>
        <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.4.0" PrivateAssets="all" />
        <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.3">
          <PrivateAssets>all</PrivateAssets>
          <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
      </ItemGroup>
    
  3. 在项目(DiagnosticsGeneratorMethod)中新建一个类(DiagnosticsGenerator.cs),添加如下代码

    using Microsoft.CodeAnalysis;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Xml;
    
    namespace DiagnosticsGeneratorMethod
    {
        [Generator]
        public class DiagnosticsGenerator: ISourceGenerator
        {
            //声明的诊断,例如编译器错误或警告
            // 该实例中声明的是警告
            private static readonly DiagnosticDescriptor InvalidXmlWarning = new DiagnosticDescriptor(id: "XMLGEN001",
                                            title: "Couldn't parse XML file",
                                            messageFormat: "无法解析xml文件 '{0}'.",
                                            category: "DiagnosticsGenerator",
                                            DiagnosticSeverity.Warning,
                                            isEnabledByDefault: true);
    
            public void Execute(GeneratorExecutionContext context)
            {
                // 获得所有的xml文件(也可以是其他文件,都是要动态生成的并且有且只有一种标准)
                IEnumerable<AdditionalText> xmlFiles = context.AdditionalFiles.Where(at => at.Path.EndsWith(".xml", StringComparison.OrdinalIgnoreCase));
                foreach (AdditionalText xmlFile in xmlFiles)
                {
                    XmlDocument xmlDoc = new XmlDocument();
                    string text = xmlFile.GetText(context.CancellationToken).ToString();
                    try
                    {
                        // 该诊断的标准是所有xml文件都能转换为xml格式的文件
                        xmlDoc.LoadXml(text);
                    }
                    catch (XmlException)
                    {
                        // 发现错误,并将诊断添加到编译器中
                        context.ReportDiagnostic(Diagnostic.Create(InvalidXmlWarning, Location.None, xmlFile.Path));
                        continue;
                    }
    
                }
            }
    
            public void Initialize(GeneratorInitializationContext context)
            {
            }
        }
    }
    
    
  4. SourceGeneratorConsole项目中引用DiagnosticsGeneratorMethod项目,并添加两个属性

    <ItemGroup>
    	<ProjectReference Include="..\DiagnosticsGenerator\DiagnosticsGeneratorMethod.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
    </ItemGroup>
    
  5. SourceGeneratorConsole项目中已添加了file.xml,可使用该文件

  6. 测试结果

    • 当file.xml文件存在root根标签时,不会报错可正常编译

    • 当file.xml文件只有cs代码时,主项目会提示警告

标签:xml,文件,Generator,代码,Source,编译器,添加,context,using
From: https://www.cnblogs.com/wanghun315/p/17237175.html

相关文章

  • Revit二次开发-在Revit选项卡面板添加扩展Tab
    最近在查Revitapi手册的时候,偶然发现了一个好玩的接口。这个接口用来扩展Revit选项卡的Tab,于是我就自定义了一个拓展的tab。 拓展类如下:TabbedDialogExtension这个类......
  • Source Generator-扩充原有代码
    我们经常会遇到,原有代码中新增方法,扩展我们自己写的代码。这个使用SourceGenerator也可以实现在上一章的接触上新增类库(AugmentingGeneratorMethod)添加Microsoft.Co......
  • Source Generator-编译本地文件的中的代码
    上一篇讲解了如何直接调用静态方法,而有时候我们会生成cs文件或其他格式的文件,进而使用SourceGenerator编译。本例中就对资源文件进行编译进行举例说明。在SourceGener......
  • resources目录下的mapper写sql语句没有提示
    resources目录下的mapper写sql语句没有提示首先了解一下mybatix-config.xml连接mapper文件的三种方式:<!--第一种--><mapperresource="com/bbl/dao/UserMa......
  • Solon2 自定义 slf4j 日志添加器(比如存到数据库)
    本案需要引入已适配的slf4j日志框架(solon.logging.simple或logback-solon-plugin或log4j-solon-plugin)。1、自定义添加器入门实现自定义添加器实现一个简单的日......
  • Source Insight 4.0使用介绍
    简介SourceInsight是一个功能非常强大的,面向项目的程序编辑器,具有针对C/C++,C#,Java,Objective-C等的内置动态分析。SourceInsight可实现多文件代码中变量和函数的快......
  • Vue插件:Vue-resource github搜索示例
     1:安装插件  vue-resourcevue的插件库,在vue1.0年代使用几率很高......
  • 如何在右键菜单栏添加cmd
    如何在右键菜单栏添加cmd要在右键菜单栏添加cmd,可以按照以下步骤操作:打开注册表编辑器。按下Windows键和R键,在运行框中输入"regedit"并按下回车键。导航到......
  • 右键菜单添加exe快捷方式
    1.问题描述想要在右键菜单中添加快捷功能,如图中的GitBushHere,可以直接通过左键在当前路径(右键点击的位置)打开这个程序。2.添加过程2.1打开注册表编辑器通过Win......
  • 【framework】View添加过程
    1前言WMS启动流程中介绍了WindowManagerService的启动流程,本文将介绍View的添加流程,按照进程分为以下2步:应用进程:介绍从WindowManagerImpl(addView方法)到Se......