如何将Kotlin代码引用从函数更改为intellij插件中的字段?

ADe*_*Dev 6 intellij-plugin kotlin

我正在编写一个intellij插件,我正在重构一个类,将其getters(例如fun name(): String)更改为字段(例如val name: String).

但是,我不知道如何最好地更新相应的PsiReference实例.Kotlin调用者需要更改myObj.name()myObj.name不带括号.

目前,我正在做以下事情:

ReferencesSearch.search(function).findAll().forEach {
    val nextSibling = it.element.nextSibling
    if ((nextSibling as? KtValueArgumentList)?.arguments?.isEmpty() == true) {
        nextSibling.delete()
    }
}
Run Code Online (Sandbox Code Playgroud)

以上工作有点.也就是说,转换正确发生.但是,IDE仍然认为它正在调用一个函数.它myObj.name使用以下消息强调转换中的错误:

类型的表达式"名称" String不能作为函数调用.找不到函数'invoke()'

name在编辑器中手动重写强制intellij刷新引用并且错误消失.

我应该怎么做以防止这种情况发生?

Ric*_*rdo 2

您收到该错误消息是因为您没有修改对旧方法的引用。Intellij 仍然认为您的调用myObj.name正在尝试访问某个name()不再存在的调用方法。

此外,搜索结果将指向使用您的方法的AST中的叶节点。在本例中,name()有一个父PSI对象保存对name和 的引用()。这就是为什么拨打电话element.nextSibling会给您提供()随后可以拨打delete()的电话。但这不会改变父母的参考。

我不确定做你想做的事情的最佳方法是什么,但你可以尝试直接替换父母的参考。尝试:

element.parent.replace(<reference to your the data class field>)
Run Code Online (Sandbox Code Playgroud)