瘟疫青年

代码生成插件说明

Word count: 1.2kReading time: 4 min
2019/01/08 Share

#Code Generator Plugin for IDEA

一、概述

这是一个基于Velocity(VM 模板)语法 和 Groovy 脚本语法,通过自定义脚本文件 和一个抽象的 contextClass概念 来完成模板代码自动生成的 IDEA/AndroidStudio 插件。

它通过内置的Converter, 将 VirtualFile (IDEA的api提供的对文件系统的抽象)或者是PsiClass(IDEA提供的对class对象的抽象)转化为统一的ClassStruct(一种对Java文件结构的抽象)对象, 这个VirtualFile对象可以是文本文件、excel表格、通过文件选择器选中的一个.java文件, PsiClass则为 鼠标右键选中的当前class对象。

插件内置了三个 Converter,分别是 Java2ClassConverter, Pb2ClassConverter, Excel2ClassConverter,他们各自通过一定的规则,对java对象,proto文件,excel文件进行了解析并转化为统一的ClassStruct实体。

解析后的ClassStruct实体包含了模板需要的全部信息。 此时 将该ClassStruct实体 和 模板文件 交给 CodeGenerator 去匹配解析,替换模板中的占位符,输出生成的目标代码。

CodeGenerator 支持解析 GroovyVelocity 两种格式文件,都是非常常见的常用模板语言。

二、特点:

插件的特点是高度的灵活化和丰富的拓展性:

1. 你可以在模板文件中通过contextClass来引用上下文对象的所有属性

包括

  • 类属性:
    类名、类类型、类修饰符、继承和实现类、导包列表、成员变量列表、方法列表
  • 成员变量属性:
    变量名、变量类型、变量修饰符
  • 方法属性:
    方法名、方法修饰符、方法入参、返回值
  • 参数属性:
    参数名、参数类型

以此定制自己的代码生成规则。

2. 通过自定义模板,可以生成Java、Kotlin、或者更多IDEA支持的语言

语言语法通过模板定义就好了 XD

2. 模板文件支持 Velocity 语法 和 Groovy 语法。

3. 可能会支持动态加载自定义转换器

这个当做一个feature去做,通过动态加载jar包应该是可以做到的,目前的设计还未支持。如果可以自定义转换器,插件的灵活性可以大大提升。

三、usage

1.模板配置

1.配置目标代码语言 Kotlin / Java

1
2
3
enum class CodeLanguage{
Java, Kotlin
}

2.模板作用类型

1
2
3
4
5
6
7
8
9
/**
* 模板生成类型 新建文件 还是 生成一个代码块
* File:根据className 生成一个新的.java文件
* CodeBlock: 代码块
* Clipboard: 将代码复制到剪切板
* */
enum class TemplateType {
File, CodeBlock, Clipboard
}

3.配置模板文件类型

1
2
3
4
5
6
/**
* 模板文件语法 vm 或 groovy
* */
enum class TemplateLanguage {
Vm, Groovy
}

2. 模板书写规则

contextClass通配符

用来生成模板类的父类,是一个ClassStruct实体

此处的父类不是java意义上的父类,可以把它理解为一个上下文对象,
这个父类 可以是从当前鼠标所在的类右键点击Generate菜单获取的,
也可以是通过导入特定格式文件解析出来的抽象,比如解析特定格式的excel文件,然后按照特定规则序列化获取到的抽象)

可以用该通配符来匹配目标类中的 类名、包名、继承、接口、成员变量、函数
用以生成模板类指定格式的代码。

具体说明如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

$contextClass.name - 类名
$contextClass.types - 类类型 // class interface enum
$contextClass.packageName - 包名
$contextClass.implements - 继承的接口列表
$contextClass.importList - 类导包列表
$contextClass.extends - 继承的父类
$contextClass.comments - 类说明
$contextClass.fields - 类成员变量 可使用 for field in fields 迭代
|_ $field.type: 变量类型
|_ $field.name: 变量名
|_ $field.modifier: 变量访问修饰符 public static
|_ $field.comment: 变量注释
$contextClass.methods - 类的方法 可使用 for methods in methods 迭代
|_ $methods.name: 方法名
|_ $methods.modifier: 方法访问修饰符
|_ $methods.returnType: 方法返回类型
|_ $methods.params: 方法入参
|_ $param.name: 方法参数名
|_ $param.type: 方法参数类型
|_ $param.comment: 方法参数注释
|_ $methods.paramsStr: 入参列表toString
|_ $methods.body: 方法体
|_ $methods.comments: 方法注释 List<String> 可以迭代

其他通用通配符

1
2
3
$TIME - 返回当前时间 格式为 yyyy-MM-dd
$USER - 返回当前登录用户名 user.name
$ClassName - 当前模板生成的目标java文件名

Demo Template File

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package $contextClass.packageName ;

import com.yymobile.common.core.AbstractBaseCore;
import com.yymobile.common.core.$contextClass.name;

/**
* @Date Created: $TIME
* @Author $USER
* @Description: $contextClass.comment
*/
public interface ${ClassName} extends AbstractBaseCore implements ${contextClass.name} {
#foreach($method in $contextClass.methods)
#if(!$null.isNull($method.comments) && $method.comments.size()>0)
/**
#foreach($comment in $method.comments)
* $comment
#end
*/
#end
public ${method.returnType} ${method.name}($method.paramsStr) {

}
#end
}
CATALOG
  1. 1. 一、概述
  2. 2. 二、特点:
    1. 2.0.1. 1. 你可以在模板文件中通过contextClass来引用上下文对象的所有属性
    2. 2.0.2. 2. 通过自定义模板,可以生成Java、Kotlin、或者更多IDEA支持的语言
    3. 2.0.3. 2. 模板文件支持 Velocity 语法 和 Groovy 语法。
    4. 2.0.4. 3. 可能会支持动态加载自定义转换器
  • 3. 三、usage
    1. 3.1. 1.模板配置
    2. 3.2. 2. 模板书写规则
      1. 3.2.1. contextClass通配符
    3. 3.3. 其他通用通配符
    4. 3.4. Demo Template File