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

Jef*_*ell 11 kotlin

我具有以下我不希望使用的功能扩展

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

不推荐使用:

myTextView.setVisible(true)
Run Code Online (Sandbox Code Playgroud)

新用法:

myTextView.isVisible = true
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个@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
}
Run Code Online (Sandbox Code Playgroud)

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

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

Rol*_*and 6

同时,在修复相关错误之前,这里有一些解决方法,所有这些都有自己的特定缺点:

  1. 替换为无用的演员表:

    ReplaceWith("(this as T).isVisible = visible")
    
    Run Code Online (Sandbox Code Playgroud)

    这会将您的代码转换为:

    (myTextView as View).isVisible = true
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 使用类似的东西 also

    ReplaceWith("also { it.isVisible = visible }")
    
    Run Code Online (Sandbox Code Playgroud)

    它将您的代码转换为:

    myTextView.also { it.isVisible = true }
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. 与之前类似,但使用apply

    ReplaceWith("apply { this@apply.isVisible = visible }")
    // leading to:
    myTextView.apply { isVisible = true }
    
    Run Code Online (Sandbox Code Playgroud)

如果您没有其他方法可以轻松更改调用者代码并希望为您的调用者提供一些帮助来替换那些不会立即删除最重要信息的已弃用代码;-) 如果您有权访问调用者代码,那么您最好手动替换它;-)