Skip to content

Commit

Permalink
feat(generate): Generate Convert 添加仅通过 dst 生成的方式, src 由用户手动输入一次即可
Browse files Browse the repository at this point in the history
  • Loading branch information
gudqs7 committed Aug 3, 2022
1 parent 3aa973a commit 7faa8f5
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 2 deletions.
32 changes: 32 additions & 0 deletions src/main/java/cn/gudqs7/plugins/generate/base/GenerateBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@
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;
import com.intellij.psi.*;
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;
Expand Down Expand Up @@ -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<String> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ protected List<PsiMethod> getGenerateMethodListByClass(PsiClass psiClass) {
@Override
@NotNull
public String generateCodeByMethod(Set<String> newImportList, PsiMethod method) {
if (baseVar == null || varForGet == null) {
if (baseVar == null) {
return "";
}
String generateName = baseVar.getVarName();
Expand All @@ -57,7 +57,7 @@ public String generateCodeByMethod(Set<String> newImportList, PsiMethod method)
}

@NotNull
private String getSetVal(String getMethodName) {
protected String getSetVal(String getMethodName) {
PsiClass psiClassForGet = PsiTypesUtil.getPsiClass(varForGet.getVarType());
List<PsiMethod> methodList = PsiMethodUtil.getGetterMethod(psiClassForGet, false);
Map<String, PsiMethod> methodMap = PsiMethodUtil.convertMethodListToMap(methodList);
Expand Down
Original file line number Diff line number Diff line change
@@ -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 + "()";
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 7faa8f5

Please sign in to comment.