我有一个使用quickfix和IDocument.InsertText()方法的自定义插件。它将在选中的荧光笔的代码行的末尾插入注释,但这会使其余荧光笔的位置混乱(从选定的一个光标到最后一个光标)。有什么方法可以刷新守护进程的Execute函数,该函数负责放置突出显示?
还有其他解决方法的想法吗?

谢谢,
尤瓦尔

修复之前:


修复后:

最佳答案

这是由于抽象语法树与文档文本不同步。通常,您可以通过操作语法树来修改源文件,语法树又会更新文档的文本。直接修改文本时,您需要确保将更改通知语法树,以便知道更新。

您可以通过将更新包装在事务中来完成此操作:

using(solution.CreateTransactionCookie(DefaultAction.Commit, "Update text"))
{
  document.InsertText(...);
}


您可以指定调用事务cookie的Dispose方法时将执行的默认操作-提交或回滚,也可以直接在事务cookie上调用方法。传递给cookie的文本是纯文本,仅用于诊断目的,因此您可以看到当前处于活动状态的事务。

更新:

查看代码后,这里的问题是,当PSI事务处于活动状态时,您无法修改文档的文本。 PSI事务表明您将要修改文档的抽象语法树,因此您也无法再修改文档的文本-您很容易陷入两种冲突的情况,无法调和他们。

在调用BulbActionBase方法之前,将由上下文操作的ExecutePsiTransaction基类创建PSI事务。您不能直接使用此方法修改文本。

您在这里有几个选择。您可以使用CSharpElementFactory.GetInstance(...).CreateComment(text)创建注释节点,然后使用ModificationUtil中的方法将其添加到PSI树中,或者可以将ExecutePsiTransaction保留为空方法(返回null)并实现ExecuteAfterPsiTransaction并调用Document.InsertText在那里(这是XAML InsertTextQuickFix类的作用)。因为在事务中调用此方法,但在PSI事务中不调用此方法,所以它应该更新文本,并使PSI同步返回。

顺便说一句,当PSI事务处于活动状态时,尝试修改文档时,ReSharper会引发异常,并带有一条适当的消息。如果使用命令行devenv.exe /ReSharper.Internal运行Visual Studio,则此异常应在状态栏中显示为工具提示,如窗口。更好的是,如果您要构建插件,则可以install a "checked" build,默认情况下它包含更多检查并报告异常。

关于c# - Resharper Quickfix荧光笔偏移量问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22545558/

10-10 10:46