我正在编写一个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刷新引用并且错误消失。
我应该怎么做以防止这种情况发生?
答案 0 :(得分:1)
您收到该错误消息,因为您没有修改对旧方法的引用。 Intellij仍然认为您的通话myObj.name
正在尝试访问一些名为name()
的方法,该方法不再存在。
此外,搜索结果将指向使用您的方法的AST中的叶节点。在这种情况下,name()
有一个父PSI个对象,其中包含对name
和()
的引用。这就是为什么调用element.nextSibling
会为您提供()
,然后您可以调用delete()
。但这不会改变父母的参考。
我不确定什么是做你想做的最好的方法,但你可以尝试直接替换父的引用。尝试:
element.parent.replace(<reference to your the data class field>)