syntax - Roslyn 语法树差异

标签 syntax diff abstract-syntax-tree roslyn roslyn-code-analysis

假设我有两个 SyntaxTree s 一个 ,
哪里已通过对 应用更改而生成一个 .

我想获得以下信息:

  • 已从 中删除的语法节点和 token 一个 生产
  • 已添加到 的语法节点和 token 一个 生产

  • 有没有这方面的 API?
    如果没有,如何有效地计算?

    此信息必须提供给 Roslyn,
    自不变 GreenNode s 在树之间共享。

    我能想到的一种解决方案是使用 SyntaxTree.GetChangedSpans()然后查找相交的标记。
    然而,这感觉就像一个黑客,我不确定它是否总是准确的。
    小的文本更改可能会对 SyntaxTree 产生很大影响:
    (例如,在表达式中用 * 替换 + 可能会改变其顺序/优先级)

    最佳答案

    我们internally have a differ它位于编译器层并因此使用绿色节点,我们只是没有将其作为 API 公开。实际上,这就是我们用来驱动 GetChangedSpans 的内容。我们故意不直接暴露绿色节点,因为这是一个实现细节。

    API 不能公开没有具体原因。我认为当这个问题出现时,我们担心人们如何实际规范行为是什么,或者您可以从差异中期望的最小“优点”是什么。那,我们没有一个激励方案来实际确保我们的工作有用。

    关于syntax - Roslyn 语法树差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34945023/

    相关文章:

    php - 这包括路径语法的含义

    java - 在比较之前可以自动格式化源代码的差异工具?

    diff - 如何告诉 WinMerge 忽略文件夹比较中的二进制文件?

    c++ - 递归下降解析和语法树

    function - 获取函数的 AST

    java - 获取JSON字符串的抽象语法树

    c++ - "struct type variablename"作为声明有效吗?

    c++ - c++ 中的 friend 是相互的吗?

    syntax - 在 Crystal Reports 中嵌套 if else

    vim - 在 Vim 中比较两个垂直打开的窗口