From 7faa8f51c25e7c21ab4df3a039eebac6fef806d3 Mon Sep 17 00:00:00 2001 From: gudqs7 Date: Wed, 3 Aug 2022 11:25:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(generate):=20Generate=20Convert=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BB=85=E9=80=9A=E8=BF=87=20dst=20=E7=94=9F?= =?UTF-8?q?=E6=88=90=E7=9A=84=E6=96=B9=E5=BC=8F,=20src=20=E7=94=B1?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=89=8B=E5=8A=A8=E8=BE=93=E5=85=A5=E4=B8=80?= =?UTF-8?q?=E6=AC=A1=E5=8D=B3=E5=8F=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/generate/base/GenerateBase.java | 32 +++++++++++++++++++ .../generate/convert/GenerateConvert.java | 4 +-- .../convert/GenerateConvertForDst.java | 31 ++++++++++++++++++ .../template/GenerateConvertTemplate.java | 26 +++++++++++++++ 4 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 src/main/java/cn/gudqs7/plugins/generate/convert/GenerateConvertForDst.java diff --git a/src/main/java/cn/gudqs7/plugins/generate/base/GenerateBase.java b/src/main/java/cn/gudqs7/plugins/generate/base/GenerateBase.java index 0c954a6..a6d02a8 100644 --- a/src/main/java/cn/gudqs7/plugins/generate/base/GenerateBase.java +++ b/src/main/java/cn/gudqs7/plugins/generate/base/GenerateBase.java @@ -6,6 +6,7 @@ import cn.gudqs7.plugins.common.util.structure.PsiTypeUtil; import com.intellij.codeInsight.template.Template; import com.intellij.codeInsight.template.TemplateManager; +import com.intellij.codeInsight.template.impl.Variable; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; @@ -13,6 +14,7 @@ import com.intellij.psi.impl.source.PsiClassReferenceType; import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.HashSet; import java.util.Set; @@ -200,11 +202,41 @@ default void insertCodeByPsiType(Document document, PsiDocumentManager psiDocume * @param editor editor */ default void insertCodeByPsiTypeWithTemplate(Document document, PsiDocumentManager psiDocumentManager, PsiFile containingFile, Editor editor) { + insertCodeByPsiTypeWithTemplate(document, psiDocumentManager, containingFile, editor, getTemplateVariables()); + } + + /** + * 得到模板变量 + * 子类可重写以传递模版变量 + * + * @return {@link Variable[]} + */ + @Nullable + default Variable[] getTemplateVariables() { + return null; + } + + /** + * 插入code通过ψ类型与模板 + * 根据 psiType 生成 code 并通过 Template 插入 + * + * @param document 文档 + * @param psiDocumentManager 文档管理器 + * @param containingFile 当前文件 + * @param editor editor + * @param variableArray 模版变量数组 + */ + default void insertCodeByPsiTypeWithTemplate(Document document, PsiDocumentManager psiDocumentManager, PsiFile containingFile, Editor editor, Variable... variableArray) { HashSet newImportList = new HashSet<>(); String insertCode = generateCode("", newImportList); System.out.println("insertCodeByPsiTypeWithTemplate :: " + insertCode); TemplateManager manager = TemplateManager.getInstance(containingFile.getProject()); Template template = manager.createTemplate("", "", insertCode + "$END$"); + if (variableArray != null && variableArray.length > 0) { + for (Variable variable : variableArray) { + template.addVariable(variable); + } + } template.setToReformat(true); manager.startTemplate(editor, template); PsiDocumentUtil.addImportToFile(psiDocumentManager, (PsiJavaFile) containingFile, document, newImportList); diff --git a/src/main/java/cn/gudqs7/plugins/generate/convert/GenerateConvert.java b/src/main/java/cn/gudqs7/plugins/generate/convert/GenerateConvert.java index 578f4cf..8764097 100644 --- a/src/main/java/cn/gudqs7/plugins/generate/convert/GenerateConvert.java +++ b/src/main/java/cn/gudqs7/plugins/generate/convert/GenerateConvert.java @@ -35,7 +35,7 @@ protected List getGenerateMethodListByClass(PsiClass psiClass) { @Override @NotNull public String generateCodeByMethod(Set newImportList, PsiMethod method) { - if (baseVar == null || varForGet == null) { + if (baseVar == null) { return ""; } String generateName = baseVar.getVarName(); @@ -57,7 +57,7 @@ public String generateCodeByMethod(Set newImportList, PsiMethod method) } @NotNull - private String getSetVal(String getMethodName) { + protected String getSetVal(String getMethodName) { PsiClass psiClassForGet = PsiTypesUtil.getPsiClass(varForGet.getVarType()); List methodList = PsiMethodUtil.getGetterMethod(psiClassForGet, false); Map methodMap = PsiMethodUtil.convertMethodListToMap(methodList); diff --git a/src/main/java/cn/gudqs7/plugins/generate/convert/GenerateConvertForDst.java b/src/main/java/cn/gudqs7/plugins/generate/convert/GenerateConvertForDst.java new file mode 100644 index 0000000..ed18c7c --- /dev/null +++ b/src/main/java/cn/gudqs7/plugins/generate/convert/GenerateConvertForDst.java @@ -0,0 +1,31 @@ +package cn.gudqs7.plugins.generate.convert; + +import cn.gudqs7.plugins.generate.base.BaseVar; +import com.intellij.codeInsight.template.impl.Variable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author wenquan + * @date 2022/8/3 + */ +public class GenerateConvertForDst extends GenerateConvert { + + public GenerateConvertForDst(BaseVar varForSet, BaseVar varForGet) { + super(varForSet, varForGet); + } + + @Nullable + @Override + public Variable[] getTemplateVariables() { + Variable variable = new Variable("SOURCE", "camelCase(\"sourceObj\")", "sourceObj", true); + return new Variable[]{variable}; + } + + @NotNull + @Override + protected String getSetVal(String getMethodName) { + return "$SOURCE$." + getMethodName + "()"; + } + +} diff --git a/src/main/java/cn/gudqs7/plugins/generate/convert/template/GenerateConvertTemplate.java b/src/main/java/cn/gudqs7/plugins/generate/convert/template/GenerateConvertTemplate.java index e6bd92b..af8f55f 100644 --- a/src/main/java/cn/gudqs7/plugins/generate/convert/template/GenerateConvertTemplate.java +++ b/src/main/java/cn/gudqs7/plugins/generate/convert/template/GenerateConvertTemplate.java @@ -5,6 +5,7 @@ import cn.gudqs7.plugins.generate.base.GenerateBase; import cn.gudqs7.plugins.generate.base.GenerateBaseTemplate; import cn.gudqs7.plugins.generate.convert.GenerateConvert; +import cn.gudqs7.plugins.generate.convert.GenerateConvertForDst; import com.intellij.openapi.editor.Document; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; @@ -22,6 +23,20 @@ private static boolean isApplicable0(PsiElement psiElement) { if (psiElement == null) { return false; } + if (psiElement instanceof PsiIdentifier) { + PsiElement parent = psiElement.getParent(); + if (parent instanceof PsiReferenceExpression) { + PsiReferenceExpression expression = (PsiReferenceExpression) parent; + if (expression.getType() != null) { + return true; + } + } + } + if (psiElement instanceof PsiExpression) { + PsiExpression psiExpression = (PsiExpression) psiElement; + PsiType psiType = psiExpression.getType(); + return psiType != null; + } if (psiElement instanceof PsiJavaToken) { PsiJavaToken psiJavaToken = (PsiJavaToken) psiElement; IElementType tokenType = psiJavaToken.getTokenType(); @@ -53,6 +68,17 @@ private static boolean isApplicable0(PsiElement psiElement) { @Override protected GenerateBase buildGenerate(PsiElement psiElement, PsiFile containingFile, PsiDocumentManager psiDocumentManager, Document document) { + if (psiElement instanceof PsiExpression) { + PsiExpression psiExpression = (PsiExpression) psiElement; + PsiType psiType = psiExpression.getType(); + String varName = psiExpression.getText(); + if (psiType != null) { + BaseVar baseVar = new BaseVar(); + baseVar.setVarName(varName); + baseVar.setVarType(psiType); + return new GenerateConvertForDst(baseVar, null); + } + } if (psiElement instanceof PsiMethodCallExpression) { PsiMethodCallExpression callExpression = (PsiMethodCallExpression) psiElement; PsiType psiTypeForSet = PsiExpressionUtil.getPsiTypeByMethodCallExpression(callExpression);