From 7a69cb02d9988495c38cd0409381199810384341 Mon Sep 17 00:00:00 2001 From: lkqm Date: Sat, 3 Apr 2021 12:55:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E5=A4=9A=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E9=80=89=E6=8B=A9=E7=94=9F=E6=88=90.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/actions/EasyCodeEntityAction.java | 62 +++++++++++++------ .../service/impl/TableInfoServiceImpl.java | 17 +++-- .../plugin/tool/PsiClassGenerateUtils.java | 54 ++++++++++++++++ src/main/resources/META-INF/plugin.xml | 4 +- 4 files changed, 109 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/sjhy/plugin/tool/PsiClassGenerateUtils.java diff --git a/src/main/java/com/sjhy/plugin/actions/EasyCodeEntityAction.java b/src/main/java/com/sjhy/plugin/actions/EasyCodeEntityAction.java index 8577cd1..2295626 100644 --- a/src/main/java/com/sjhy/plugin/actions/EasyCodeEntityAction.java +++ b/src/main/java/com/sjhy/plugin/actions/EasyCodeEntityAction.java @@ -5,25 +5,27 @@ import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.project.Project; -import com.intellij.psi.*; -import com.intellij.psi.javadoc.PsiDocComment; -import com.intellij.psi.javadoc.PsiDocToken; -import com.sjhy.plugin.entity.ColumnInfo; -import com.sjhy.plugin.entity.TableInfo; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiJavaFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.PsiModifier; import com.sjhy.plugin.tool.CacheDataUtils; import com.sjhy.plugin.ui.SelectSavePath; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; /** * 从Java类生成代码菜单 + * + * @author Mario Luo */ public class EasyCodeEntityAction extends AnAction { - private CacheDataUtils cacheDataUtils = CacheDataUtils.getInstance(); + private final CacheDataUtils cacheDataUtils = CacheDataUtils.getInstance(); @Override public void actionPerformed(@NotNull AnActionEvent event) { @@ -31,23 +33,47 @@ public class EasyCodeEntityAction extends AnAction { if (project == null) { return; } - PsiFile psiFile = event.getData(CommonDataKeys.PSI_FILE); - if (!(psiFile instanceof PsiJavaFile)) { + + // 过滤选择Java文件 + VirtualFile[] psiFiles = event.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY); + PsiManager psiManager = PsiManager.getInstance(project); + List psiJavaFiles = Arrays.stream(psiFiles) + .map(psiManager::findFile) + .filter(f -> f instanceof PsiJavaFile) + .map(f -> (PsiJavaFile) f) + .collect(Collectors.toList()); + if (psiJavaFiles.size() == 0) { return; } - PsiJavaFile psiJavaFile = (PsiJavaFile) psiFile; - PsiClass psiClass = Arrays.stream(psiJavaFile.getClasses()) - .filter(o -> o.getModifierList() != null && o.getModifierList().hasModifierProperty("public")) - .findFirst() - .orElse(null); - if (psiClass == null) { + + // 获取选中的类 + List psiClassList = resolvePsiClassByFile(psiJavaFiles); + if (psiClassList.size() == 0) { return; } - cacheDataUtils.setSelectPsiClass(psiClass); - cacheDataUtils.setPsiClassList(Lists.newArrayList(psiClass)); + + // 缓存选中值 + cacheDataUtils.setSelectPsiClass(psiClassList.get(0)); + cacheDataUtils.setPsiClassList(psiClassList); new SelectSavePath(project, true).open(); } + /** + * 解析类 + */ + private List resolvePsiClassByFile(List psiJavaFiles) { + List psiClassList = Lists.newArrayListWithCapacity(psiJavaFiles.size()); + for (PsiJavaFile psiJavaFile : psiJavaFiles) { + PsiClass psiClass = Arrays.stream(psiJavaFile.getClasses()) + .filter(o -> o.getModifierList() != null && o.getModifierList().hasModifierProperty(PsiModifier.PUBLIC)) + .findFirst() + .orElse(null); + if (psiClass != null) { + psiClassList.add(psiClass); + } + } + return psiClassList; + } } diff --git a/src/main/java/com/sjhy/plugin/service/impl/TableInfoServiceImpl.java b/src/main/java/com/sjhy/plugin/service/impl/TableInfoServiceImpl.java index 75e58f3..4b5ca51 100644 --- a/src/main/java/com/sjhy/plugin/service/impl/TableInfoServiceImpl.java +++ b/src/main/java/com/sjhy/plugin/service/impl/TableInfoServiceImpl.java @@ -24,14 +24,8 @@ import com.sjhy.plugin.entity.SaveFile; import com.sjhy.plugin.entity.TableInfo; import com.sjhy.plugin.entity.TypeMapper; import com.sjhy.plugin.service.TableInfoService; -import com.sjhy.plugin.tool.CloneUtils; -import com.sjhy.plugin.tool.CollectionUtil; -import com.sjhy.plugin.tool.CurrGroupUtils; -import com.sjhy.plugin.tool.FileUtils; -import com.sjhy.plugin.tool.MessageDialogUtils; -import com.sjhy.plugin.tool.NameUtils; -import com.sjhy.plugin.tool.ProjectUtils; -import com.sjhy.plugin.tool.StringUtils; +import com.sjhy.plugin.tool.*; + import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -44,6 +38,7 @@ import java.util.Objects; import java.util.Set; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; + import org.jetbrains.annotations.Nullable; /** @@ -396,13 +391,16 @@ public class TableInfoServiceImpl implements TableInfoService { tableInfo.setPkColumn(new ArrayList<>()); tableInfo.setOtherColumn(new ArrayList<>()); for (PsiField field : psiClass.getAllFields()) { + if (PsiClassGenerateUtils.isSkipField(field)) { + continue; + } ColumnInfo columnInfo = new ColumnInfo(); columnInfo.setName(field.getName()); columnInfo.setShortType(field.getType().getPresentableText()); columnInfo.setType(field.getType().getCanonicalText()); columnInfo.setComment(parsePsiClassComment(field.getDocComment())); tableInfo.getFullColumn().add(columnInfo); - if ("id".equals(field.getName())) { + if (PsiClassGenerateUtils.isPkField(field)) { tableInfo.getPkColumn().add(columnInfo); } else { tableInfo.getOtherColumn().add(columnInfo); @@ -419,6 +417,7 @@ public class TableInfoServiceImpl implements TableInfoService { return fullName.substring(0, genericIdx); } + @Override public TableInfo getTableInfoAndConfigByPsiClass(PsiClass selectPsiClass) { TableInfo tableInfo = this.getTableInfoByPsiClass(selectPsiClass); diff --git a/src/main/java/com/sjhy/plugin/tool/PsiClassGenerateUtils.java b/src/main/java/com/sjhy/plugin/tool/PsiClassGenerateUtils.java new file mode 100644 index 0000000..ae2c0db --- /dev/null +++ b/src/main/java/com/sjhy/plugin/tool/PsiClassGenerateUtils.java @@ -0,0 +1,54 @@ +package com.sjhy.plugin.tool; + +import com.intellij.psi.PsiAnnotation; +import com.intellij.psi.PsiField; +import com.intellij.psi.PsiModifier; +import com.intellij.psi.PsiModifierList; + +/** + * 从实体类生成代码业务工具类 + * + * @author Mario Luo + */ +public final class PsiClassGenerateUtils { + + private PsiClassGenerateUtils() { + } + + /** + * 是否是主键字段 + */ + public static boolean isPkField(PsiField field) { + if("id".equals(field.getName())) { + return true; + } + PsiAnnotation idAnnotation = field.getAnnotation("org.springframework.data.annotation.Id"); + if (idAnnotation != null) { + return true; + } + idAnnotation = field.getAnnotation("javax.persistence.Id"); + if (idAnnotation != null) { + return true; + } + return false; + } + + /** + * 是否需要跳过该字段 + */ + public static boolean isSkipField(PsiField field) { + PsiModifierList modifierList = field.getModifierList(); + if(modifierList != null && modifierList.hasExplicitModifier(PsiModifier.STATIC)) { + return true; + } + PsiAnnotation annotation = field.getAnnotation("org.springframework.data.annotation.Transient"); + if (annotation != null) { + return true; + } + annotation = field.getAnnotation("javax.persistence.Transient"); + if (annotation != null) { + return true; + } + return false; + } +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 8473753..c0afba7 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -241,9 +241,11 @@ - + +