Kotlin @Deprecated ReplaceWith将函数更改为变量赋值

时间:2018-10-27 18:06:36

标签: kotlin

我要使用以下功能扩展

fun <T : View> T.setVisible(visible: Boolean) {
    visibility = if (visible) View.VISIBLE else View.GONE
}

不推荐使用:

myTextView.setVisible(true)

新用法:

myTextView.isVisible = true

我正在尝试编写一个@Deprecated ReplaceWith表达式,该表达式将自动修复此弃用。我尝试了以下操作,但似乎不起作用:

@Deprecated("Use Android KTX isVisible", replaceWith = ReplaceWith("isVisible = visible", "androidx.core.view.isVisible"))
fun <T : View> T.setVisible(visible: Boolean) {
    visibility = if (visible) View.VISIBLE else View.GONE
}

当我在“ myTextView.setVisible(true)”上按Alt + ENTER并从弹出窗口中选择“用isVisible = visible替换”时,它只会删除我已弃用的​​代码

是否存在可用于自动修复代码(将函数调用更改为赋值)的ReplaceWith表达式?

1 个答案:

答案 0 :(得分:3)

与此同时,在解决相关错误之前,这里有一些解决方法,所有方法都有其特定的缺点:

  1. 用无用的强制替换:

    ReplaceWith("(this as T).isVisible = visible")
    

    这会将您的代码转换为:

    (myTextView as View).isVisible = true
    

    IDE可能会警告您不需要强制转换,您可以在第二步中进行修复

  2. 使用类似also

    ReplaceWith("also { it.isVisible = visible }")
    

    将您的代码转换为:

    myTextView.also { it.isVisible = true }
    

    此代码可能不会在您的IDE中引起任何警告,但是显然需要更长的时间

  3. 与以前相似,但使用apply

    ReplaceWith("apply { this@apply.isVisible = visible }")
    // leading to:
    myTextView.apply { isVisible = true }
    

仅当您没有其他方法可以轻松更改调用者代码并希望给您的调用者一些帮助来替换不推荐使用的代码而不能立即删除最重要的信息时,这些解决方法才真正有用;-)如果您可以访问调用者代码,那么最好〜手动替换它;-)