gpt4 book ai didi

c# - 如何使我的代码诊断语法节点操作对已关闭的文件起作用?

转载 作者:IT王子 更新时间:2023-10-29 03:41:56 25 4
gpt4 key购买 nike

我正在使用 Roslyn(在 VS2015 预览版中)构建一组代码诊断。理想情况下,我希望它们产生的任何错误都作为持久性错误,就像我违反了正常的语言规则一样。

有很多选项,但我很难让它们中的任何一个始终如一地工作。我已经设法实现了一个基本的语法节点操作,即一个注册了

context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.InvocationExpression);

在我的诊断类的 Initialize 方法中。你瞧,当我打开一个违反此诊断的文件时(在运行 VSIX 项目时),VS2015 显示错误:

  • 右侧代码下方的红色波浪线
  • 空白处的红色 block
  • 错误列表中的错误

但是,当我关闭文件时错误消失了。

我也尝试过使用 context.RegisterCompilationEndAction,但这有两个问题:

  • 它的发射似乎不一致。 通常 当我打开解决方案时它会触发,但并非总是如此。它不会在清理/重建时触发,这看起来很奇怪。
  • 尽管在分析方法 fire 中直接创建了诊断,但为了实现诊断,我正在使用一个访问者,就像这样——这可能是无能的:

    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 中”处理?这可能只是尚未完全完成的 Roslyn 集成的一部分吗?

(如果有用的话,我可以包含该类的完整代码 - 在这种情况下,我怀疑它的噪声多于信号。)

最佳答案

对于已关闭的文件问题,我们的意图是报告所有来自打开或已关闭文件的诊断。在 Tools\Options\Text Editor\C#\Advanced 的预览中有一个用户选项,您可以切换以在关闭的文件中包含诊断。我们希望在 VS 2015 发布之前将其设为默认值。但是,请注意该选项仅适用于 VS 内的分析。如果您的分析器被传递给编译器(通过在解决方案资源管理器中添加分析器,或将 NuGet 包引用添加到带有分析器的包,而不是将 VSIX 安装到 Visual Studio 中),则编译器将报告 所有 在用户构建时进行诊断,无论文件是否打开。

对于 RegisterCompilationEndedAnalyzer 的第二个问题,它在 VS 2015 预览版的 Visual Studio 中不能可靠地调用。这是因为我们进行了一些优化,以避免重新分析方法体内“本地”更改的所有内容。出于类似的原因,我们目前不报告方法主体位置报告的错误。我们最近刚刚更改了这一点,以便 VS 将在较长的延迟后开始全面的重新分析,因此 RegisterCompilationEndedAnalyzer 应该在未来的构建中可靠地调用,我们将报告错误而不考虑位置。

但是,对于您的情况,正确的做法是继续使用 SyntaxNodeAnalyzer,切换 VS 选项以在关闭的文件中启用诊断,并将您的诊断附加到项目编译选项。

希望这对您有所帮助!

关于c# - 如何使我的代码诊断语法节点操作对已关闭的文件起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27365841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com