我正在尝试编写一个 C# 源代码生成器,它在某些条件下使用GeneratorExecutionContext.ReportDiagnostic
. 在 Visual Studio 中构建示例项目后,我的源代码生成器能够成功运行并输出错误。但是,我的错误不会在 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 告诉我构建有错误,并在错误列表中正确报告自定义诊断。我可以点击自定义错误,我的光标移动到编辑器中的违规方法。但是,没有出现红色曲线。我知道我的源代码生成器正在由 Intellisense 运行,因为我能够看到test
我的生成器定义的自定义命名空间和类。
Visual Studio 是否支持 C# 源生成器报告的诊断代码下划线?如果是这样,上面的代码有什么问题?提前致谢。