我正在使用Roslyn(在VS2015 Preview中)构建一组代码诊断.理想情况下,我希望他们产生的任何错误都可以作为持久性错误,就像我违反了正常的语言规则一样.
有很多选择,但我很难让他们中的任何一个一致地工作.我已经设法实现了一个基本的语法节点动作,即注册的一个
context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.InvocationExpression);
Run Code Online (Sandbox Code Playgroud)
在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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道正在创建诊断 - ReportDiagnostic线路上的断点被多次击中 - 但我没有在错误列表中看到任何内容.(尽管类似ReportDiagnostic的方法,或用每文件路径语法树一开始通话,并得到显示.)
我在这做错了什么?如果可行的话,第一种方法(语法节点动作)将是理想的 - 它完全给出了我需要的上下文.项目属性中是否有一些设置需要使编译器使用"完整项目"编译以及"在IDE中处理"交互?这可能只是Roslyn集成的一点还没有完成吗?
(如果它有用的话,我可以包括该类的完整代码 - 在这种情况下,我怀疑它会比信号更多噪音.)