Goland(Jetbrains Idea平台)插件开发教程(三)
前言
在上一篇教程中,简单介绍了如何编写intellij平台的live template并集成到插件中。这次介绍一下如何编写live template的macro与注册,以及从上下文中取到PsiElement,与marco接受参数。
查看自带的marco与源码
首先看一下Goland自带的macro,这几个go开头的就是Goland特有的了。%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B(%E4%B8%89)/e5489f4b-288e-4729-ad97-a0ca955dcecf.png)
marco是继承于com.intellij.codeInsight.template.macro.MacroBase,我们根据这个继承关系就可以找到这几个marco的对应实现。
%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B(%E4%B8%89)/1138265.png)
%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B(%E4%B8%89)/b87e72c0-7914-4115-9444-07b681545cb7.png)
那我们就从GoFunctionParametersMacro看起吧
%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B(%E4%B8%89)/7431953.png)
构造函数声明了marco的name与description,这并没有啥特别的。主要的是calculateResult这个abstract method的实现。
可以看到从context中获取到了PsiElement,objectUtils.doIfNotNull只是封装的判空,如果参数1为null就不执行函数。可以看到从GoSignature对象中获取到的GoParameters就是我们要的参数内容了,getResult只是将参数转为了List。
自行编写
小试牛刀
可以先写个template将参数和范围值作为variable输出看看。%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B(%E4%B8%89)/f3d6f71e-8306-4aa8-8f8c-a69da2df1715.png)
可以看到ListResult输出的效果如下%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B(%E4%B8%89)/1104000.png)
生成sql where条件
由于平时的业务操作数据库对象基本上是主键查询,所有业务逻辑都在代码里,所以我在组内做了套根据函数参数与返回类型生成find get操作的live template。不过这玩意因业务、框架而异了。go没有像mybatis、jpa这样的框架,即使用了xorm gorm也要取到对应的对象去操作数据库,对于不同项目来说肯定不同,所以也很难出现像mybatis有专门的idea插件。我的情况也比较特殊,大多数都是主键查询,没有连表,所以才想了这样的操作。或许大家还可以发掘其他的用途吧,下面举个例子。
自定义的Macro继承MacroBase,前半部分是复制GoFunctionParametersMacro的实现,后面实现了自己对where语句的拼接。
1 | public class GoSqlWhereMacro extends MacroBase { |
注册自定义的Macro
在plugin.xml
1 | <extensions defaultExtensionNs="com.intellij"> |
在设置中配置%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B(%E4%B8%89)/5962578.png)
%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B(%E4%B8%89)/098ad36b-f85b-46f3-b451-da73fbee77b6.png)
效果%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B(%E4%B8%89)/669b7253-0109-4564-aa96-886752547743.png)
%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B(%E4%B8%89)/2446a09b-72a7-47cb-8558-a81151281774.png)
接受参数
还记得自带的函数参数获取输出的是带中括号的参数list,现在我们写个macro去掉中括号。还记得calculateResult的第一个参数是个数组吧,这就是嵌套的表达式。
下面的就是去掉中括号的实现。这只是介绍一下如何将一个Macro作为另一个Macro的参数。
1 |
|
省略掉在plugin.xml中注册的操作
下面是针对变量的配置,goFunctionParameters作为deBrace的参数%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B(%E4%B8%89)/7046781.png)
看看效果%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B(%E4%B8%89)/7155375.png)
%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B(%E4%B8%89)/7177734.png)
小结
这篇文章介绍了live template的marco是如何编写与注册的,以及一些基础的用法。希望大家可以脑洞大开,做出一些提升开发效率的模板吧。
不过这个也因项目而异了,并不是所有项目都适合我说的这些东西施展拳脚,这里的两个例子是非常简化的版本,把可以一次性完成的东西拆成了两个模板,可能也很难看出有啥便利之处。在实际应用中,可以在同个模板中使用多个macro,我自己的情况则是利用live template把数据库get find操作各做了套模板,一次性直接生成查询与返回结果的代码,个人使用起来还是挺舒服的。
Goland(Jetbrains Idea平台)插件开发教程(三)
https://www.huihongcloud.com/2021/09/12/goland/Goland(Jetbrains Idea平台)插件开发教程(三)/