我有一个使用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/