开发工具:IntelliJ IDEA
开发语言:Kotlin
当前代码的用场就是制作类似于gsonformat的工具 可以根据json生成对应的实体类
或者是根据数据库映射成对应的实体类对象
lateinit var factory: PsiElementFactory//element工厂 包括生成控制 类,方法,变量
lateinit var project: Project
override fun actionPerformed(event: AnActionEvent?) {
project = event!!.project!!
factory = JavaPsiFacade.getInstance(project).elementFactory
var editor = event.getData(DataKeys.EDITOR)!!
var psiFile = PsiUtilBase.getPsiFileInEditor(editor, project)!!
var psiClass = (psiFile as PsiJavaFile).classes[0]
write(psiClass);
}
actionPerformed 是事件触发的时候调用的方法
event: AnActionEvent? 这个变量可以获取 idea工具当前触发的 窗口,文件,类,路径等
下面就是创建子类并且继承父类的核心代码
/**
* 创建子类
* className:子类的名称
* parent:父类
*/
fun createChildClass(className:String,parent: PsiClass): PsiClass {
var childClazz=factory.createClass(className)
//查询父类的范围
var scope= GlobalSearchScope.fileScope(parent.containingFile)
//父类的类型
var parentType= PsiClassType.getTypeByName(parent.name,project,scope)
//继承父类的类型
childClazz.getExtendsList()!!.add(factory.createReferenceElementByType(parentType));
return childClazz
}
/**
* 创建一个父类
*/
fun createParentClass(className:String):PsiClass{
var parentClass=factory.createClass(className)
return parentClass
}
上面两个是创建父类跟子类的方法
/**
* 写入到编辑器里面
*
*/
fun write(psiClass: PsiClass) {
//必须在当前的action里面写入添加事件才能写入到idea中 否则会报错
WriteCommandAction.runWriteCommandAction(project, object:Runnable {
override fun run() {
var parentClass=createParentClass("Animal")
var childClass=createChildClass("Dog",parentClass)
psiClass.add(parentClass)
psiClass.add(childClass)
}
});
}
全部代码:
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.DataKeys
import com.intellij.openapi.command.WriteCommandAction
import com.intellij.openapi.project.Project
import com.intellij.psi.*
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.PsiUtilBase
class Test():AnAction() {
lateinit var factory: PsiElementFactory
lateinit var project: Project
override fun actionPerformed(event: AnActionEvent?) {
project = event!!.project!!
factory = JavaPsiFacade.getInstance(project).elementFactory
var editor = event.getData(DataKeys.EDITOR)!!
var psiFile = PsiUtilBase.getPsiFileInEditor(editor, project)!!
var psiClass = (psiFile as PsiJavaFile).classes[0]
write(psiClass);
}
/**
* 创建子类
*/
fun createChildClass(className:String,parent: PsiClass): PsiClass {
var childClazz=factory.createClass(className)
//查询父类的范围
var scope= GlobalSearchScope.fileScope(parent.containingFile)
//父类的类型
var parentType= PsiClassType.getTypeByName(parent.name,project,scope)
//继承父类的类型
childClazz.getExtendsList()!!.add(factory.createReferenceElementByType(parentType));
return childClazz
}
/**
* 写入
*
*/
fun write(psiClass: PsiClass) {
WriteCommandAction.runWriteCommandAction(project, object:Runnable {
override fun run() {
var parentClass=createParentClass("Animal")
var childClass=createChildClass("Dog",parentClass)
psiClass.add(parentClass)
psiClass.add(childClass)
}
});
}
/**
* 创建一个父类
*/
fun createParentClass(className:String):PsiClass{
var parentClass=factory.createClass(className)
return parentClass
}
}
最终运行结果: