运行 以编程方式进行 Roslyn 分析时启用 Roslyn 诊断

Enabling Roslyn diagnostics when running Roslyn analysis programmatically

我使用 VS 2015 模板创建了一个 Roslyn 分析器。鉴于默认情况下启用了诊断,我已经完成了所有工作,包括单元测试。

如果我将 DiagnosticDescriptor 上的 isEnabledByDefault 参数设置为 false,我可以通过使用 .ruleset 启用诊断来使 Visual Studio 中的一切正常工作文件。但是,一旦默认情况下禁用诊断,单元测试将不再报告其结果。

如何在单元测试期间启用这些默认禁用的诊断?我准备改变单元测试调用 Roslyn Compilation/Analyzer/Diagnostic/etc 的方式。结果,但由于缺乏我设法从各种来源抓取的文档,我还没有找到指定设置的方法。

您需要覆盖类似于规则文件的诊断严重性, CompilationOptions.SpecificDiagnosticOptions 允许这样做(编译有 Options 可以覆盖这样的东西)。

我已成功将我的分析器更改为禁用,并在我的宠物项目中覆盖 DiagnosticVerifier.Helper(在 Helpers 中)(请参阅提交 8dfc02c 了解我是如何做到的).基本上,它归结为:

private static Compilation OverrideDiagnosticSeverity(
    Compilation compilation,
    string diagnosticId,
    ReportDiagnostic reportDiagnostic)
{
    var compilationOptions = compilation.Options;
    var specificDiagnosticOptions = compilationOptions.SpecificDiagnosticOptions;

    specificDiagnosticOptions = specificDiagnosticOptions.Add(diagnosticId, reportDiagnostic);
    var options = compilationOptions.WithSpecificDiagnosticOptions(specificDiagnosticOptions);

    return compilation.WithOptions(options);
}

您可能希望向 VerifyCSharpDiagnostic 添加一个标志,以便根据单元测试的要求执行此操作。