首页 文章

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

提问于
浏览
6

我重构一个类,将其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类型的表达式'name'不能作为函数调用 . 找不到函数'invoke()'

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

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

1 回答

  • 1

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

    此外,搜索结果将指向AST中使用您的方法的叶节点 . 在这种情况下, name() 有一个父PSI对象,该对象包含对 name() 的引用 . 这就是为什么调用 element.nextSibling 给你 () 然后你可以调用 delete() . 但这并没有引用 .

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

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

相关问题