我有一个用于包装服务 api 调用的自定义函数
我想在某些 api 调用忘记添加 safeApiCall 时添加一些警告{}
suspend fun <T:Any> safeApiCall(
apiCall: suspend () -> T
) {
//do something
}
interface Service {
@Get
suspend fun getUser() : User
@Put
suspend fun updateUser(name:String) : User
}
val service:Service
service.getUser() //warning "should use safeApiCall"
SafeApiCall { service.getUser() } //ok
这是我的尝试,但不起作用
interface $Interface$ {
suspend fun $Method$ ($Parameter$ : $ParameterType$): $ReturnType$
}
$Interface$.$MethodCall$
最佳答案
这很棘手,但就是这样:
您需要使用script constraints 。这个想法是过滤整个匹配的父级。有很多方法可以做到这一点,例如通过类型来区分它们。
这是我的搜索:
模板:
$Service$.$method$($args$)
$Service$
变量过滤器:
Type = you.package.Service
$args$
(可选,但):
Count = [0: +Inf]
最重要的部分,整个模板脚本过滤器:
__context__.parent.parent.class.name == "org.jetbrains.kotlin.psi.KtNamedFunction"
它很脏,我知道。由于某种原因,我无法使其与 instanceof
一起使用,但您可以调整它。
如果这样做,您可能会问:如何调试该脚本?
这是我的建议。打开 IDEA 的日志(帮助 -> 在资源管理器中显示日志)。然后在脚本中使用println()
,它会将其参数打印到STDOUT
:
你看,这里有两个匹配项,但第二个匹配项的父项(根据您的要求可以)是不同的类型。因此,这里的一个快速猜测和肮脏的解决方法是对它们进行比较。更狡猾的方法是获取包装构造的名称并检查它是否是 safeApiCall 。我将把它留给您作为练习。
祝你好运!
关于kotlin - 结构搜索接口(interface)挂起函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70767889/