您所看到的RS2000 有点不同。这是从诊断分析器报告的诊断规则。它使用相同的DiagnosticDescriptor 类,但它对源生成器的处理方式不同。例如,DiagnosticAnalyzer 期望派生类提供支持的诊断列表(通过SupportedDiagnostics)。
DiagnosticAnalyzer 中的诊断报告
这是一个诊断分析器的极简示例:
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class MyDiagnosticAnalyzer : DiagnosticAnalyzer
{
private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(
id: "MYCUSTOMID001",
title: "Unexpected Error",
messageFormat: "Error for object",
category: "Design",
defaultSeverity: DiagnosticSeverity.Warning,
isEnabledByDefault: true,
description: "MYCUSTOMID001 long description. This line will be shown in the error list panel");
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);
public override void Initialize(AnalysisContext context)
{
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
context.EnableConcurrentExecution();
context.RegisterSyntaxTreeAction(AnalyzeAction);
}
private static void AnalyzeAction(SyntaxTreeAnalysisContext context)
{
// ...
context.ReportDiagnostic(Diagnostic.Create(Rule, Location.None));
}
}
它报告一个警告,其中包含来自Description 实例的Description getter 的可扩展详细信息:
SourceGenerator 中的诊断报告
虽然它适用于诊断分析器,但它似乎不适用于源生成器。
[Generator]
public sealed class MySourceGenerator : ISourceGenerator
{
public void Initialize(GeneratorInitializationContext context)
{
}
public void Execute(GeneratorExecutionContext context)
{
// ...
var descriptor = new DiagnosticDescriptor(
id: "MYCUSTOMID002",
title: "Unexpected Error",
messageFormat: "Error for object",
category: "Design",
defaultSeverity: DiagnosticSeverity.Warning,
isEnabledByDefault: true,
description: "MYCUSTOMID002 long description. This line will be shown in the error list panel");
context.ReportDiagnostic(Diagnostic.Create(descriptor, Location.None));
}
}
如我们所见,消息中没有显示Description:
解决方法(嗯,不是真的)
您仍然可以使用MessageFormat 属性从源生成器提供有意义的诊断详细信息,并稍后将正确的格式参数传递给Diagnostic.Create。
这是一个例子:
public void Execute(GeneratorExecutionContext context)
{
// ...
var descriptor = new DiagnosticDescriptor(
id: "MYCUSTOMID002",
title: "Unexpected Error",
messageFormat: "Error for object: {0}",
category: "Design",
defaultSeverity: DiagnosticSeverity.Warning,
isEnabledByDefault: true);
context.ReportDiagnostic(Diagnostic.Create(descriptor, Location.None, "Exception long description, stack trace, etc."));
}
它会产生这个消息:
但我知道这不是您想要的。