kotlin - 结构搜索接口(interface)挂起函数调用

标签 kotlin intellij-idea structural-search

我有一个用于包装服务 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$
        

最佳答案

这很棘手,但就是这样:

enter image description here

您需要使用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:

enter image description here

你看,这里有两个匹配项,但第二个匹配项的父项(根据您的要求可以)是不同的类型。因此,这里的一个快速猜测和肮脏的解决方法是对它们进行比较。更狡猾的方法是获取包装构造的名称并检查它是否是 safeApiCall 。我将把它留给您作为练习。

祝你好运!

关于kotlin - 结构搜索接口(interface)挂起函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70767889/

相关文章:

kotlin - 如何使用位在 Kotlin 中存储配置?

kotlin - 如何在 kotlin 中使密封类通用?

intellij-idea - Intellij Idea resharper 键盘映射

java - 有没有办法在类中通过 getter 方法找到 setter 方法,反之亦然?

java - 查找所有未用 'public void' 注释的 '@Test' 方法

android - PowerMockito spy : Calling real method results with CannotStubVoidMethodWithReturnValue

java - JUnit 和类加载器的问题

java - 在 IntelliJ 中查找整个项目中的所有匿名类

java - 我如何在 Intellij 中搜索和替换结构

android - Kotlin Flow "First Offline"方法