Roslyn:应用代码修复后如何移动插入符

Roslyn: how to move caret after applying a code fix

我在自己的 IDE 中使用 Roslyn,它使用自定义项目系统(不是 VS 系统)。我目前正在使用 AdHocWorkspace 作为 Roslyn 工作区。

我通过 Roslyn 程序集中包含的 CodeFixProviders 支持我 IDE 中的代码修复。这些修复在我的工作区上应用操作很好,但我想知道在应用修复后是否有可能获得新的插入符号位置?

例如,如果用户在我的编辑器中键入 HttpClient,然后使用代码修复添加 System.Net.Http 命名空间,HttpClient 标记的位置会发生变化(因为文件开头的额外文本),但我想将插入符号保留在与该标记相关的位置。

对于这个特殊情况,我使用了一个 ProjectSymbolReferenceCodeAction 操作,而这个操作 GetOperationsAsync 中的唯一操作 return 是一个 ApplyChangesOperation 操作。我原以为它可能还会 return 另一个移动插入符的操作,但它没有。

我假设这可能与 AdHocWorkspace 并不意味着 IDE 因此不支持插入符号位置的概念有关,但我不知道是否就是这样,如果是这样,如何着手创建我自己的工作区来支持这一点。

TLDR:你能给我指明正确的方向,告诉我在应用代码修复后如何处理移动插入符吗?

至少在 Visual Studio 中,这是可行的,因为当我们最终将编辑应用回文本缓冲区时,我们正在计算与原始文件的文本差异。我们只应用那个差异,编辑器组件会自动跟踪光标位置在该编辑周围的位置。它会自动计算“哦,插入符号位于第 100 位,但你在开头添加了 20 个字符,所以现在你位于第 120 位。”我不确定您使用的是哪个编辑器组件或您如何将内容应用回去,但您会想看看它是否支持差异化,这样光标就不会跳来跳去,或者您会想要根据您应用的差异重新计算新位置。