我正在编写一个方法,可以获取Diagnostic
的{{1}}的所有Project
s:
DiagnosticAnalyzer
如果private static async Task<ImmutableArray<Diagnostic>> GetDiagnosticsAsync(
Project project,
ImmutableArray<DiagnosticAnalyzer> analyzers)
{
var compilation = await project.GetCompilationAsync();
var withAnalyzers = compilation.WithAnalyzers(analyzers);
var diagnostics = await withAnalyzers.GetAnalyzerDiagnosticsAsync();
return diagnostics;
}
中的所有DiagnosticAnalyzer
的{{1}}方法都包含一些注册调用,则此方法可以正常工作:
analyzers
但是,如果其中任何一个具有空实现
Initialize(AnalysisContext)
然后public override void Initialize(AnalysisContext context)
{
context.Register...(...);
}
。
我是否误解了public override void Initialize(AnalysisContext context)
{
// nothing here
}
和diagnostics.Count() == 0
的行为,因此这是正确的做法?或者这是罗斯林的错误?或者我应该使用另一种方法吗?或其他什么?
我很想在Roslyn中认为这是一个错误(因此我有opened an issue)。深入研究源代码和调试结果GetAnalyzerDiagnosticsAsync()
中发生差异 - 当它工作时,它会产生所需的DiagnosticAnalyzers
但问题发生时为CompilationWithAnalyzers._driver.DiagnosticQueue
。
情节变浓......