1.create rename: RefactoringFactory.createRename()
2.重新build virtualFile对应的PsiFile : FileContentUtil.reparseFiles()
3.为某个方法,增加文本;比如:public void onClick(View v){},插件生成了个方法叫doClick(View v)(参考AccountSDKUtil)。生成后在onClick中添加这个方法的调用
fun addStatementElementToMethodIfNotExist(text:String,method:PsiMethod,factory:PsiElementFactory){
var add = factory.createStatementFromText(text,null)
var has = method.body?.children?.filter {
it.text == add.text
}?:return
if(has.size == 0){
method.body!!.add(add)
}
}
var onClick = mClassOpt!!.findMethodsByName("onClick",true)
if(onClick.size>0){
var clickMethod = onClick[0] //粗糙的按这个类中只有一个onClick方法来算
var param = clickMethod.parameters[0].name
PsiElementUtil.addStatementElementToMethodIfNotExist("doClick($param);",clickMethod,factory)
}
4.psiClass add method: mClassOpt!!.add(factory.createMethodFromText("method text"))
5.psiClass add field : mClassOpt!!.add(factory.createFieldFromText("private $type $fieldName;", null))
6.psiClass add improt:
val importList = (mClassOpt!!.containingFile as PsiJavaFile).importList
if(importList!!.findSingleClassImportStatement(clazz.qualifiedName) == null){
importList?.add(factory.createImportStatement(clazz))
}
ps:有些情况下的增加import可以使用另一个逻辑完成,就是当添加代码的时候,直接使用类型的全路径修饰,比如Button btn -> android.weight.Button。如此本身就不用增加import
然后使用JavaCodeStyleManager shortenClassReferences 来自动将其改变
7.某个目录下创建一个文件: virtualFile.createChildData 打开文件:OpenFileDescriptor(action.project!!, mFile!!).navigate(true)
8.某个方法增加注释:
val document = factory.createDocCommentFromText("/**\n*/")
document.add(factory.createDocTagFromText("@Description" + " " + model.name + "-" + event.doc))
document.add(factory.createParamTag(it, "String"))
psiMethod.addBefore(document, psiMethod.firstChild);
9 方法增加参数: psiMethod.parameterList.add(factory.createParameterFromText("$parameterType $it", psiMethod))
10 方法重写body:或创建方法后动态构建body:
1)还是直接createMethod的时候,直接用文本创建这个method,这样的话,不管修饰符 返回值 参数还是body,都可以写好再创建,但有时条件很多,导致最后生成的method的body等都会根据条件不同而不同,所以这个方式虽然依然可以,但是构建会麻烦,且代码很丑。如果方法构成较单一,这个方式就不丑了。
2)var psiMethod = factory.createMethod(event.id!!.toMethod(), PsiType.VOID)
psiMethod.modifierList.setModifierProperty("public", true)
psiMethod.modifierList.setModifierProperty("static", true)
psiMethod.body?.delete() //method原有的body直接删除
psiMethod.add(factory.createCodeBlockFromText(body.toString(), psiMethod))//将新的block再设置给method。