文档的代码修复不同于行的代码修复
Code fix for document different from code fix for line
我写了一个 Roslyn 代码分析器和相关的 CodeFixProvider,它可以工作。当我将它用于单个灯泡时,它工作得很好,当我选择处理整个文档时,它似乎得到了损坏的结果,就好像几个修复被合并在一起一样。
我正在使用 WellKnownFixAllProviders 来提供解决问题的基础设施。调试代码和发生的事情,一切看起来都很好,但预览(和接受)的文档似乎有一些重复或损坏的结果。
WellKnownFixAllProvider 的工作原理是并行批处理所有修复,传递相同的、不可变的文档。每个修复 returns 对原始文档进行一次更改的结果,并将这些更改的文档合并在一起以产生最终结果。这意味着如果修复重叠,则合并可以产生如果文档按顺序发生变化就不会发生的结果。
解决这个问题的唯一真正方法是要么没有重叠修复,要么编写自己的按顺序而不是并行运行的 fixallprovider。
如果 CodeFixProvider 被用于对您的代码库进行一次性更改,则可能会破解一个解决方法,您的修复提供程序会跟踪它的更改并且不会产生冲突的更改。但这本质上是脆弱的,而不是你想要为一般 public.
使用的修复程序做的事情
我写了一个 Roslyn 代码分析器和相关的 CodeFixProvider,它可以工作。当我将它用于单个灯泡时,它工作得很好,当我选择处理整个文档时,它似乎得到了损坏的结果,就好像几个修复被合并在一起一样。
我正在使用 WellKnownFixAllProviders 来提供解决问题的基础设施。调试代码和发生的事情,一切看起来都很好,但预览(和接受)的文档似乎有一些重复或损坏的结果。
WellKnownFixAllProvider 的工作原理是并行批处理所有修复,传递相同的、不可变的文档。每个修复 returns 对原始文档进行一次更改的结果,并将这些更改的文档合并在一起以产生最终结果。这意味着如果修复重叠,则合并可以产生如果文档按顺序发生变化就不会发生的结果。
解决这个问题的唯一真正方法是要么没有重叠修复,要么编写自己的按顺序而不是并行运行的 fixallprovider。
如果 CodeFixProvider 被用于对您的代码库进行一次性更改,则可能会破解一个解决方法,您的修复提供程序会跟踪它的更改并且不会产生冲突的更改。但这本质上是脆弱的,而不是你想要为一般 public.
使用的修复程序做的事情