【问题标题】:Roslyn: how to move caret after applying a code fixRoslyn:应用代码修复后如何移动插入符号
【发布时间】:2021-05-03 06:34:02
【问题描述】:

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

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

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

对于这种特殊情况,我使用ProjectSymbolReferenceCodeAction 操作,并且此操作从GetOperationsAsync 返回的唯一操作是ApplyChangesOperation 操作。我期待它可能还会返回另一个移动插入符号的操作,但它没有。

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

TLDR:您能否指出我在应用代码修复后如何处理移动插入符号的正确方向?

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

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

    【讨论】:

    • 啊,原来如此。我在想,因为代码代码操作是指定更改的东西,它还应该建议新的插入符号位置。不过,使用基于 diff 的单一机制可以免除代码操作的这种负担,因此这是有道理的。我使用 AvalonEdit 作为编辑器。我还会在每次更改时替换整个文档(OT:这会减慢速度吗,我应该使用不同的方法吗?)。
    • 我无法使用 AvalonEdit 的 API,但我无法想象如果您需要处理非常大的文件场景,替换整个文档会很棒。我们经常看到几兆字节的文件。但如果不了解您的用户,这很难说。
    • 当我重构一些其他代码时,我碰巧遇到了github.com/dotnet/roslyn/blob/…,我们在标准编辑器行为之上有一些微妙的技巧。但一般的教训是,这是在核心代码操作层完成的,它使用编辑器的差异行为来帮助我们。
    • 知道了,所以计算差异是关键,无论是更新文档(使用 SourceText.WithChanges)还是移动插入符号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多