最佳答案
我正在使用 Roslyn (在 VS2015预览版中)构建一组代码诊断。理想情况下,我希望它们产生的任何错误都能作为持久性错误,就像我违反了正常的语言规则一样。
有很多选择,但我很难让它们中的任何一个始终如一地发挥作用。我已经设法实现了一个基本的语法节点操作,即一个注册了
context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.InvocationExpression);
在我的诊断类的 Initialize
方法中。你瞧,当我打开一个违反此诊断的文件(在运行 VSIX 项目时)时,VS2015显示了一个错误:
但是,当我关闭文件时,错误消失了。
我也试过使用 context.RegisterCompilationEndAction
,但有两个问题:
虽然诊断程序在分析方法中创建了 直接,但是为了实现诊断程序,我使用了一个访问程序,就像下面这样——这可能是不合适的:
private static void AnalyzeEndCompilation(CompilationEndAnalysisContext context)
{
foreach (var tree in context.Compilation.SyntaxTrees)
{
var visitor = new ReportingVisitor(context.Compilation.GetSemanticModel(tree));
visitor.Visit(tree.GetRoot());
foreach (var diagnostic in visitor.Diagnostics)
{
context.ReportDiagnostic(diagnostic);
}
}
}
我知道正在创建诊断程序-ReportDiagnostic
行上的断点被多次命中-但是我在错误列表中没有看到任何东西。(在方法的开始部分有一个类似的 ReportDiagnostic
调用,或者每个语法树有一个文件路径,这时会显示 是的。)
我做错了什么?如果可行的话,第一种方法(一个语法节点操作)将是理想的——它给我提供了我所需要的上下文。在项目属性中是否有一些设置,我需要让编译器使用它来进行“完整的项目”编译,以及交互式的“在 IDE 中”处理?这或许只是罗斯林一体化的一小部分,而且还没有完全结束?
(如果这个类有用的话,我可以包含它的完整代码——在这种情况下,我怀疑它的噪音比信号更大。)