繁体   English   中英

使 C# 源生成器报告的诊断错误出现在 Visual Studio 编辑器中

[英]Make diagnostic errors reported by a C# source generator appear in the Visual Studio editor

我正在尝试编写一个 C# 源生成器,它在某些条件下使用GeneratorExecutionContext.ReportDiagnostic引发警告/错误。 在 Visual Studio 中构建示例项目后,我的源生成器能够成功运行并且 output 错误成功。 但是,我的错误不会在 Visual Studio 编辑器中显示为绿色/红色曲线。 根据Microsoft 的文档,这应该可以通过 Roslyn 分析器实现,但没有具体说明源生成器。 但是,由于源生成器被视为 Roslyn 分析器,我想这应该是可能的。 我已经设法通过一个小示例复制了我的问题,该示例由一个源生成器项目和一个运行生成器的测试项目组成。 作为测试,生成器在看到不返回void的方法时会报告诊断错误。 我打算在有问题的方法名称下出现红色曲线:

源生成器:

[Generator]
public class SampleGenerator : ISourceGenerator
{
    public void Execute(GeneratorExecutionContext context)
    {
        DataReceiver r = (DataReceiver)context.SyntaxReceiver;
        foreach(MethodDeclarationSyntax method in r.Methods)
        {
            IMethodSymbol symbol = (IMethodSymbol)context.Compilation.GetSemanticModel(method.SyntaxTree).GetDeclaredSymbol(method);
            if(symbol.ReturnType.SpecialType != SpecialType.System_Void)
            {
                context.ReportDiagnostic(Diagnostic.Create(
                new DiagnosticDescriptor(
                    "SG0001",
                    "Non-void method return type",
                    "Method {0} returns {1}. All methods must return void.",
                    "yeet",
                    DiagnosticSeverity.Error,
                    true), symbol.Locations.FirstOrDefault(), symbol.Name, symbol.ReturnType.Name));
            }
        }
        context.AddSource("yert", "namespace test { public class testclass { } }");
    }

    public void Initialize(GeneratorInitializationContext context)
    {
        context.RegisterForSyntaxNotifications(() => new DataReceiver());
    }
}

public class DataReceiver : ISyntaxReceiver
{
    public List<MethodDeclarationSyntax> Methods { get; } = new List<MethodDeclarationSyntax>();

    public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
    {
        if(syntaxNode is MethodDeclarationSyntax synt)
        {
            Methods.Add(synt);
        }
    }
}

示例代码:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
    }

    static string ok() => "hello";
}

当我使用生成器编译示例代码时,Visual Studio 告诉我构建有错误,并在错误列表中正确报告自定义诊断。 我可以点击自定义错误,我的 cursor 移动到编辑器中的违规方法。 但是,没有出现红色曲线。 我知道我的源代码生成正在由 Intellisense 运行,因为我能够看到我的生成器定义的自定义test命名空间和 class。

Visual Studio 是否支持 C# 源生成器报告的诊断代码下划线? 如果是这样,上面的代码有什么问题? 提前致谢。

我通过将代码分析逻辑分离到它自己的 class 并将分析器和源生成器添加到同一个程序集中来解决这个问题,分析逻辑只在源生成器中执行代码发射。 分析逻辑在不同的上下文中运行,每个上下文都有不同的 reportdiagnostic,因此它接受了一个 Action 来报告诊断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM