我正在使用 Roslyn(在 VS2015 预览版中)构建一组代码诊断。理想情况下,我希望它们产生的任何错误都充当持久错误,就像我违反了正常的语言规则一样。
有很多选择,但我很难让其中任何一个都能持续工作。我已经成功实现了一个基本的语法节点操作,即注册了
context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.InvocationExpression);
in the Initialize
我的诊断课的方法。你瞧,当我打开一个违反此诊断的文件时(运行 VSIX 项目时),VS2015 显示错误:
- 代码右侧下方有红色波浪线
- 边距中的红色块
- 错误列表中有错误
但是,当我关闭文件时,错误就会消失。
我尝试过使用context.RegisterCompilationEndAction
也是如此,但这有两个问题:
- 似乎火力不一致。Usually当我打开解决方案时它会触发,但并非总是如此。它不会在清理/重建时触发,这看起来很奇怪。
-
尽管创建了诊断directly在分析方法火灾中,为了实现诊断,我正在使用访问者,如下所示 - 这可能是无能的:
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
在方法开始处调用,或者每个语法树调用一个文件路径,does得到展示。)
我在这里做错了什么?如果可行的话,第一种方法(语法节点操作)将是理想的 - 它准确地为我提供了我需要的上下文。项目属性中是否有一些设置需要让编译器将其用于“完整项目”编译以及“IDE 中”的交互式处理?这可能只是 Roslyn 集成的一部分,尚未完全完成?
(如果有用的话,我可以包含该类的完整代码 - 在这种情况下,我怀疑它会比信号更多的噪音。)
对于关闭的文件问题,我们的目的是报告来自打开或关闭文件的所有诊断信息。在 Tools\Options\Text Editor\C#\Advanced 的预览中有一个用户选项,您可以切换以在关闭的文件中包含诊断信息。我们希望在 VS 2015 发布之前将其设为默认值。但请注意,该选项仅适用于 VS 内的分析。如果您的分析器传递给编译器(通过在解决方案资源管理器中添加分析器,或使用分析器添加对包的 NuGet 包引用,而不是将 VSIX 安装到 Visual Studio 中),则编译器将报告all用户构建时进行诊断,无论文件是否打开。
对于第二个问题RegisterCompilationEndedAnalyzer
,它在 VS 2015 预览版的 Visual Studio 内部无法可靠地调用。这是因为我们做了一些优化,以避免重新分析方法体内“本地”更改的所有内容。出于类似的原因,我们目前不报告位置报告的错误in方法体。我们最近刚刚对此进行了更改,以便 VS 将在较长的延迟后启动完整的重新分析,所以RegisterCompilationEndedAnalyzer
应该在未来的构建中可靠地调用,并且无论位置如何,我们都会报告错误。
但是,对于您的情况,正确的做法是保留 SyntaxNodeAnalyzer,切换 VS 选项以在关闭的文件中启用诊断,并将诊断附加到项目编译选项。
希望这可以帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)