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刷新引用并且错误消失.
我应该怎么做以防止这种情况发生?
您收到该错误消息是因为您没有修改对旧方法的引用。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)
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |