如何跨Workspace.TryApplyChanges()跟踪SyntaxNodes

时间:2016-01-18 12:18:07

标签: roslyn roslyn-code-analysis

我希望跟踪sudo apt-get install zlib1g zlib1g-dev libedit-dev llvm-3.6 llvm-3.6-dev llvm-3.6-runtime llvm-3.6-tools sudo pip install enum34 funcsigs sudo mv /usr/bin/llvm-config /usr/bin/llvm-config_bak sudo ln -s /usr/bin/llvm-config-3.6 /usr/bin/llvm-config sudo pip install llvmlite sudo pip install numba sudo mv /usr/bin/llvm-config_bak /usr/bin/llvm-config SyntaxNode SyntaxTrivia / Solution

的不同版本

我尝试用Workspace s注释一些节点。 只要我不更新工作区,这种方法就可以正常工作。

调用SyntaxAnnotation(已成功)似乎已删除 所有Workspace.TryApplyChanges s。

  • 这让我感到惊讶。为什么会这样?
  • 如何跨工作区更新跟踪SyntaxAnnotation

示例代码如下:

SyntaxNode

1 个答案:

答案 0 :(得分:4)

这是因为drop Trigger preventDrop 实际上没有按原样重复使用您的节点。相反,它会重播"与实际解决方案的文本更改相同的更改,然后让解析器重新解析。

这种情况有几个原因:

  1. 避免注释随着时间的推移在树中堆积并相互干扰(考虑类似于格式化或重命名在修复应用后仍存在的CodeFix中使用的注释)。
  2. 防止在Msg 3701, Level 11, State 5, Line 10 Cannot drop the trigger 'preventDrop', because it does not exist or you do not have permission. 出现不再往返的树木。可以构造解析器永远不会生成的树(例如,考虑更改运算符优先级)。
  3. 要确保实际应用更改,需要更改原始表示形式 - 磁盘上的文件或内存中的文本缓冲区,而不仅仅是使用工作区中的新树。
  4. 您可以考虑使用Roslyn源代码中的SyntaxPath类型来尝试查找等效节点。