gpt4 book ai didi

c# - Resharper quickfix 荧光笔偏移问题

转载 作者:太空宇宙 更新时间:2023-11-03 13:25:36 25 4
gpt4 key购买 nike

我有一个使用 quickfix 和 IDocument.InsertText() 方法的自定义插件。它在代码行的末尾插入一条注释,其中包含所选的荧光笔,但这会弄乱其余荧光笔从所选荧光笔到最后的位置。有什么方法可以刷新负责放置亮点的守护进程执行函数吗?
关于解决此问题的任何其他想法?

谢谢,尤瓦尔

修复前: Before

修复后: After

最佳答案

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

您可以通过将更新包装在事务中来做到这一点:

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

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

更新:

查看代码后,这里的问题是当 PSI 事务处于事件状态时您无法修改文档的文本。 PSI 事务表明您要修改文档的抽象语法树,因此您不能再修改文档的文本 - 您很容易陷入两个相互冲突的更改且无法协调的情况他们。

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

您在这里有几个选择。您可以使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com