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

问题描述

我正在尝试编写一个 C# 源代码生成器,该生成器在某些条件下使用 GeneratorExecutionContext.ReportDiagnostic 抛出警告/错误。在 Visual Studio 中构建示例项目后,我的源代码生成器能够成功运行并输出错误。但是,我的错误不会在 Visual Studio 编辑器中显示为绿色/红色波浪线。根据 Microsoft's documentation 的说法,这应该可以通过 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 告诉我构建有错误,并在错误列表中正确报告自定义诊断。我可以单击自定义错误,然后我的光标移动到编辑器中的违规方法。但是,没有出现红色波浪线。我知道我的源代码生成由 Intellisense 运行,因为我能够看到我的生成器定义的自定义 test 命名空间和类。

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)