跳到主要内容

Groovy 本地扩展

提示

此方式维护困难, 请谨慎使用。

介绍

  • 针对极其特殊的情况, 无法使用简单配置实现需求时, 可以使用 groovy 扩展以获得极高的定制化功能。
  • 相对普通配置来说, 对于开发者有一定的技术要求,包括 groovy 以及当前插件的结构等都要有一定的了解。
  • wiki
  • offical
  • demo

使用步骤

  • 在项目目录下创建 /.easyapi/ext

  • 创建扩展文件 ${ActionName}Ext.groovy
    当前可支持的操作有:

    • ApiCallAction
    • ApiDashBoardAction
    • YApiDashBoardAction
    • FieldsToJsonAction
    • MarkdownExportAction
    • PostmanExportAction
    • YapiExportAction
  • 在扩展文件中声明扩展类:

class ActionNameExt implements ActionExt {

void init(ActionContext.ActionContextBuilder builder) {
//在这里通过`bind`注入定制化组件,实现需要的功能
builder.bind(Xxx.class, KtHelper.INSTANCE.ktFunction({
it.to(Yyy.class).in(com.google.inject.Singleton.class)
return null
}))
}
}

Demo

  • YapiExportActionExt.groovy
import com.intellij.psi.*
import com.itangcent.common.model.Request
import com.itangcent.idea.plugin.api.export.ClassExporter
import com.itangcent.idea.plugin.api.export.SpringRequestClassExporter
import com.itangcent.idea.plugin.api.export.yapi.YapiClassExportRuleKeys
import com.itangcent.idea.plugin.api.export.yapi.YapiRequestKitKt
import com.itangcent.idea.plugin.script.ActionExt
import com.itangcent.idea.plugin.utils.KtHelper
import com.itangcent.intellij.context.ActionContext

import java.util.stream.Collectors
import java.util.stream.Stream

class YapiExportActionExt implements ActionExt {

void init(ActionContext.ActionContextBuilder builder) {

builder.bind(ClassExporter.class, KtHelper.INSTANCE.ktFunction({
it.to(CustomClassExporter.class).in(com.google.inject.Singleton.class)
return null
}))

}

static class CustomClassExporter extends SpringRequestClassExporter {

void processCompleted(PsiMethod method, Request request) {
super.processCompleted(method, request)

String tags = ruleComputer.computer(YapiClassExportRuleKeys.TAG, method)
if (tags != null && !tags.isEmpty()) {
YapiRequestKitKt.setTags(request, Stream.of(tags.split("\n"))
.map { it.trim() }
.filter { !it.isEmpty() }
.collect(Collectors.toList())
)
}

String status = ruleComputer.computer(YapiClassExportRuleKeys.STATUS, method)
logger.info(YapiRequestKitKt.class.toString())
YapiRequestKitKt.setStatus(request, status)
}
}
}

特别注意

由于插件源码语言是 kotlin,在 groovy 中无法使用一些语法糖。

  • kotlin 中声明的扩展方法如
fun Doc.setTags(tags: List<String>?) {
...
}
  • 在 groovy 中使用如下:
YapiRequestKitKt.setTags(request,tags)