Goland(Jetbrains Idea平台)插件开发小记

由于平时开发过程中有很多基础代码,比如数据库操作、接口创建等,大部分是重复并且可以整理为模板的。最早为项目做了一些命令行的生成工具,感觉自己做的也不是很友好吧,自己做了也忘了这回事,也没在组里推广开。前段时间,可谓痛定思痛,决定不再做这些ctrl cv的事情,研究了一波jetbrains的官方文档。

第一个想法就是,能在New菜单中加入快速创建项目建模块目录的功能。这个参照官方文档实现并没有啥难度,从点击菜单的AnActionEvent中可以获取到Project对象,也可以获得VirtualFile对象。对这里获得的Vf对象调用createChildDirectory,即可在当前目录下创建子目录了,不过值得注意的是写入操作文件需要使用WriteCommandAction。
第二个想法就是创建一些模板文件了。通过输入一些简单的信息,快速完成项目子模块的创建。之前做的命令行版需要手动输入author,还是有点不方便的,现在直接集成在IDE中,点哪在哪创建,还顺带把文件头写好了。
一般来说,使用jetbrains平台的人都会在File Header模板中配上内容。直接在goland的插件中,可以通过如下代码获取渲染后的File Header:

1
2
FileTemplate fileHeader = fileTemplateManager.getPattern("File Header");
fileHeader.getText();

然后可以通过如下代码创建临时模板并渲染,setText设置模板,getText传入一个key value的map:

1
2
3
FileTemplate fileTemplate = new CustomFileTemplate("Tmp", "后缀名");
fileTemplate.setText(templateText);
fileTemplate.getText(properties);

vf对象的createChildData即可创建文件,使用setBinaryContent并传入渲染好的bytes即可写入,使用如下代码还可以写入后打开文件:

1
new OpenFileDescriptor(project, newFile).navigate(true);

第三个想法就是通过右键操作bean文件生成repo层了,以上模板的生成即可完成基础的功能。但是为了完美需要解析类型&包路径。这时候就进入了一个坑,虽然jetbrains平台的PsiManager就可以进行语法的解析,但是参照文档弄了半天,却找不到Go文件的类。最后发现需要在plugin.xml中配置以下内容:

1
2
3
4
<depends>com.intellij.modules.go</depends>
<depends>com.intellij.modules.platform</depends>
<depends>com.intellij.modules.lang</depends>
<depends>org.jetbrains.plugins.go</depends>

第四个想法就是利用强大的livetemplate功能做一些快捷操作了,自己做了一些自定义的宏。比如在repo层中,写好函数的参数返回的model,在函数中敲入livetemplate的缩写就自动根据函数的定义生成操作数据库的代码。
自定义的宏需要继承MarcoBase,构造函数传入name discription,Override其中的calculateResult方法。感觉常用的是TextResult和ListResult,具体的一些操作可以参照官方文档,然后在plugin.xml配置好就行了。
这里提供一个书写livetemplate的小技巧,那就是在ide中编辑然后Export Settings导出,然后再导入到插件项目中,并实现自己的LiveTemplateProvider。
希望自己的分享能够帮助到有同样想法的人。
现在打算写一套系列教程:
https://www.huihongcloud.com/2021/08/15/goland/Goland插件开发之使用Psi/
https://www.huihongcloud.com/2021/08/29/goland/Goland(Jetbrains%20Idea平台)插件开发教程(一)/
https://www.huihongcloud.com/2021/08/31/goland/Goland(Jetbrains%20Idea平台)插件开发教程(二)/
https://www.huihongcloud.com/2021/09/12/goland/Goland(Jetbrains%20Idea平台)插件开发教程(三)/

作者

ZhongHuihong

发布于

2021-07-30

更新于

2021-10-02

许可协议