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

2023-12-31

我正在使用 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(使用前将#替换为@)

如何使我的代码诊断语法节点操作对关闭的文件起作用? 的相关文章

随机推荐

  • 查找 LineString 与 turfjs 中的多边形边框相交的坐标

    Turfjs 有没有办法确定 LineString 与多边形边界相交的坐标 有多种方法可以确定一个点是否在多边形内 也有多种方法可以确定一个点是否在一条直线上等等 但我似乎无法找到一种方法来询问 这条线在什么点与这个多边形的边界相交 我可以
  • 如何访问字典中的第一个和最后一个元素?

    在发帖之前 我已经经历过在Python中访问字典中的任意元素 https stackoverflow com questions 3097866 python access to first element in dictionary 但我
  • 为什么我不能使用 Set:union() 而不是 Set.union?

    我正在学习 Lua 我宁愿使用冒号 的方法 不幸的是 它并不是在所有地方都有效 看我的代码 Set local mt function Set new m local set setmetatable set mt for a b in p
  • 如何使用 RabbitMQ-JMS 恢复消费者,或指定自定义异常处理程序?

    我正在尝试使用 RabbitMQ JMS 客户端 并有意创建了一个长 onMessage 侦听器来查看客户端将如何恢复 Context context new InitialContext rabbitMQ RMQConnectionFac
  • 如果构造函数中引发异常会发生什么[重复]

    这个问题在这里已经有答案了 可能的重复 如果派生类析构函数抛出异常 基类析构函数会发生什么情况 https stackoverflow com questions 4508533 what happens to base class des
  • 创建注册表项(和子项)?

    我正在尝试创建一个注册表项和子项 以便为计算机上的所有用户启用 IE 11 企业模式 这就是我当前用于 VBScript 的内容 但它失败得很厉害 不添加密钥 我需要一些帮助来纠正这个问题 Const HKEY LOCAL MACHINE
  • 如何删除 Eclipse 项目相关文件而不从 Eclipse 中删除源

    每当我们想要使用现有源位置创建 Eclipse 项目时 我们都会选择现有源位置 根 作为项目位置 Eclipse 将在该源的根目录中创建所有项目特定文件 现在 由于某种原因 如果我们想使用不同的设置重新创建项目 我们应该如何告诉 Eclip
  • 启用 Lambda@Edge 后调试 CloudFront 的问题

    下列的本文 https aws amazon com blogs apn using amazon cloudfront with multi region amazon s3 origins 我正在尝试从 AWS 内的多个区域 同一域下
  • JAVA 面向方面编程 - 运行时方面编织和类加载时方面编织

    我看到一篇关于 AOP 的文章 其中提到切面编织可以在编译时 类加载时和运行时发生 在java中 我可以想象 甚至可以理解 方面编织在编译时实际上是如何发生的 代理类是在类编译期间生成的 在项目上启用了方面 生成的字节码将具有代理代码 但我
  • .Net Twitter OAuth 如何执行成功的 GET 请求

    按照本教程 我能够成功向 Twitter API 发布帖子并更新我的状态 但是我在处理成功的 GET 请求时遇到问题 我正在尝试修改 Post 请求来完成此操作 但在我的网络异常上不断收到 无效协议 错误 以下是将发布状态更新的工作代码 h
  • 原则 2. orm:schema-tool:update 。设置开始ID

    当我使用 bin doctrine orm fixtures load使用示例数据填充表首先迁移设置自动增量表 ID 如 1 2 3 4 5 等 第二次之后orm fixtures load迁移命令它会清除所有数据并设置 id 如 5 6
  • 如何在 Vim 中设置工作/当前目录?

    因此 当我想使用 e 命令创建新文件时 我不想指定整个路径 而只想指定新文件名 能做到吗 正如已经建议的 您可以使用 autochdir 它将更改为您打开的文件的目录 另一个选项是 cd mydirectory 这将更改目录 这可以是绝对路
  • ruby - 覆盖方法然后恢复

    我正在尝试找到一种方法 可以覆盖方法 执行某些操作 然后在不留下任何工件的情况下进行恢复 我已经使用 mocha 实现了这个 但显然这不会在生产应用程序中运行 请注意 新方法有参数 而旧方法没有 示例如下 require rubygems
  • CSS 宽度和高度属性的最大像素值是多少?

    最大有效值是多少pxCSS 的值width and height属性接受吗 我目前正在构建一个网络应用程序 它创建一个非常大的可缩放容器元素 我想知道实际的限制是什么 在元素上使用某些浏览器附带的 CSS 检查器10000000000px
  • 从 javascript 运行 bat 文件

    我正在尝试使用 javascript 运行 bat 文件 我尝试过使用 powershell 但它似乎无法正常工作 这是我尝试过的代码 var oShell WScript CreateObject WScript Shell oShell
  • 将浮动栏添加到滚动视图,就像 Facebook iOS 应用程序的时间线中一样

    我一直在尝试向我的测试项目添加不同的交互 但在添加 Facebook 的帖子状态栏之类的东西时遇到了麻烦 该状态栏位于时间线滚动视图上 并在向下滚动时随滚动视图一起滚动视图 但当您向上滚动时仍停留在导航栏下方 我一直在创建一个单独的 UIV
  • 如何在 docker 上运行电子应用程序

    我创建了一个托管电子应用程序的存储库的分支 该应用程序是一个聊天客户端 https github com Serkan devel BetterDiscordApp docker https github com Serkan devel
  • 是否可以克隆 ValueType?

    当已知对象是装箱 ValueType 时 是否可以克隆对象 而无需编写特定于类型的克隆代码 一些代码供参考 List
  • 如何从 statsmodels 中检索模型估计值?

    从这样的数据集 import pandas as pd import numpy as np import statsmodels api as sm A dataframe with two variables np random see
  • 如何使我的代码诊断语法节点操作对关闭的文件起作用?

    我正在使用 Roslyn 在 VS2015 预览版中 构建一组代码诊断 理想情况下 我希望它们产生的任何错误都充当持久错误 就像我违反了正常的语言规则一样 有很多选择 但我很难让其中任何一个都能持续工作 我已经成功实现了一个基本的语法节点操