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

时间:2018-06-08 08:47:55

标签: kotlin intellij-plugin

我正在编写一个intellij插件,我正在重构一个类,将其getter(例如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()
    }
}

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

  

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

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

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

1 个答案:

答案 0 :(得分:1)

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

此外,搜索结果将指向使用您的方法的AST中的叶节点。在这种情况下,name()有一个父PSI个对象,其中包含对name()的引用。这就是为什么调用element.nextSibling会为您提供(),然后您可以调用delete()。但这不会改变父母的参考。

我不确定什么是做你想做的最好的方法,但你可以尝试直接替换父的引用。尝试:

element.parent.replace(<reference to your the data class field>)