代码之家  ›  专栏  ›  技术社区  ›  ADev

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

  •  6
  • ADev  · 技术社区  · 6 年前

    我正在写一个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 回复  |  直到 6 年前
        1
  •  1
  •   Ricardo    6 年前

    您收到错误消息是因为您没有修改对旧方法的引用。Intellij仍然认为你的电话 myObj.name 正在尝试访问某个名为 name() 那已经不存在了。

    此外,搜索结果将指向 AST 用你的方法。在这种情况下 名称() 有父母 PSI 包含对 name 并且 () . 所以打电话来 element.nextSibling 给你 () 你可以打电话给 delete() 在。但这不会改变父母的参考。

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

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