From d9bdf35e622d6ec74f378eac61fa26fef6f30d39 Mon Sep 17 00:00:00 2001 From: "Jindong.Tian" Date: Sun, 24 Dec 2023 17:22:05 +0800 Subject: [PATCH 1/4] =?UTF-8?q?1.3.2=E7=89=88=E6=9C=AC=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 优化Object Copy Method 功能,新增生成模式配置,以及在字段有差异时以注释的形式生成代码 2. 修复 Class To XML 功能在复杂类结构时生成XML不正确的问题 3. 修复 Class To Thrift-IDL 功能,在一些场景下的NPE问题 --- README.md | 24 +++-- build.gradle | 9 +- .../action/AbstractClassAnAction.java | 28 ++++++ .../action/ClassToJsonAction.java | 17 +--- .../action/ClassToThriftIDLAction.java | 16 +--- .../objecthelper/action/ClassToXMLAction.java | 28 ++---- .../action/ObjectCopyMethodAction.java | 20 ++-- .../objecthelper/common/enums/CommonEnum.java | 11 +++ .../common/enums/FieldGenerateModeEnum.java | 34 +++++++ .../common/enums/FunctionSwitchEnum.java | 32 +++++++ .../{JavaModify.java => JavaModifyEnum.java} | 8 +- .../common/enums/WhetherEnum.java | 32 +++++++ .../objecthelper/common/util/PsiUtils.java | 44 ++++++--- .../objecthelper/common/util/XMLUtils.java | 84 +++++++---------- .../config/ObjectHelperConfigurable.java | 10 +- .../config/PluginConfigModel.java | 71 ++++++++++---- .../generator/AbstractMethodGenerator.java | 5 + .../generator/idl/ThriftIDLGenerator.java | 3 + .../method/ObjectCopyMethodGenerator.java | 43 +++++++-- .../plugin/objecthelper/ui/ConfigPage.form | 92 +++++++++++++++++-- .../plugin/objecthelper/ui/ConfigPage.java | 55 +++++++---- src/main/resources/META-INF/plugin.xml | 6 +- 22 files changed, 486 insertions(+), 186 deletions(-) create mode 100644 src/main/java/cn/bigcoder/plugin/objecthelper/action/AbstractClassAnAction.java create mode 100644 src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/CommonEnum.java create mode 100644 src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/FieldGenerateModeEnum.java create mode 100644 src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/FunctionSwitchEnum.java rename src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/{JavaModify.java => JavaModifyEnum.java} (77%) create mode 100644 src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/WhetherEnum.java diff --git a/README.md b/README.md index 7e6b309..8d6430e 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@
- + - +
@@ -25,7 +25,7 @@ JetBrains Intellij IDEA ObjectHelper 插件旨在减少开发者重复低效的 - Java类转JSON - ![](https://image.bigcoder.cn/20210227223302.gif) + ![](https://image.bigcoder.cn/20231224171155.gif) - Java类转Thrift IDL @@ -33,22 +33,28 @@ JetBrains Intellij IDEA ObjectHelper 插件旨在减少开发者重复低效的 - Java类转XML - ![](https://image.bigcoder.cn/20220916170144.gif) + ![](https://image.bigcoder.cn/20231224171113.gif) - 插件配置 File->Settings->Tools->Object Helper 即可进入插件的配置页面 -![](https://image.bigcoder.cn/20220916173227.png) +![](https://image.bigcoder.cn/20231224170305.png) + +- `generate field mode = target` 代表以方法返回类型的字段为基础生成对象拷贝; +`generate field mode = source` 代表以方法入参类型的字段为基础生成对象拷贝。 + +- `non-existent field generate annotation = yes` 代表当目标字段,在源对象中不存在时,是否以注释的形式生成代码,如果为 `no`,则代表不生成这一个字段拷贝代码。 ## 未来功能支持计划 object-helper插件未来功能支持计划: -- [x] Class转IDL(Class To Thrift IDL) -- [x] Class转XML(Class To XML) +- [x] Class 转 IDL(Class To Thrift IDL) +- [x] Class 转 XML(Class To XML) - [x] 个性化配置 -- [ ] JSON转Class(JSON TO Class) -- [ ] Class转Protobuf IDL(JSON TO Class) +- [ ] Object Copy Method 功能支持 Lambda 表达式 +- [ ] JSON 转 Class(JSON TO Class) +- [ ] Class 转 Protobuf IDL(JSON TO Class) - [ ] All Setter - [ ] 菜单分组显示 diff --git a/build.gradle b/build.gradle index 55b4ad7..95e9899 100644 --- a/build.gradle +++ b/build.gradle @@ -5,16 +5,21 @@ plugins { } group 'cn.bigcoder.plugin' -version '1.3.1' +version '1.3.2' repositories { mavenCentral() } dependencies { + implementation 'org.apache.commons:commons-lang3:3.13.0' + / object 转 xml 依赖 开始/ + implementation 'com.fasterxml.jackson.core:jackson-core:2.13.3' + implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3' + implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.3' + / object 转 xml 依赖 结束/ testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' - implementation 'org.apache.commons:commons-lang3:3.13.0' } // See https://github.com/JetBrains/gradle-intellij-plugin/ diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/action/AbstractClassAnAction.java b/src/main/java/cn/bigcoder/plugin/objecthelper/action/AbstractClassAnAction.java new file mode 100644 index 0000000..365eeb0 --- /dev/null +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/action/AbstractClassAnAction.java @@ -0,0 +1,28 @@ +package cn.bigcoder.plugin.objecthelper.action; + +import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.setActionInvisible; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import org.jetbrains.annotations.NotNull; + +/** + * @author: Jindong.Tian + * @date: 2023-12-24 + **/ +public abstract class AbstractClassAnAction extends AnAction { + + /** + * 是否开启该功能 + * @return true代表开启该功能,false表示关闭该功能 + */ + public abstract boolean actionShow(AnActionEvent anActionEvent); + + @Override + public void update(@NotNull AnActionEvent anActionEvent) { + if (!actionShow(anActionEvent)) { + setActionInvisible(anActionEvent); + } + super.update(anActionEvent); + } +} diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/action/ClassToJsonAction.java b/src/main/java/cn/bigcoder/plugin/objecthelper/action/ClassToJsonAction.java index ed31287..8e96e8c 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/action/ClassToJsonAction.java +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/action/ClassToJsonAction.java @@ -1,23 +1,21 @@ package cn.bigcoder.plugin.objecthelper.action; +import cn.bigcoder.plugin.objecthelper.common.enums.FunctionSwitchEnum; import cn.bigcoder.plugin.objecthelper.common.util.NotificationUtils; import cn.bigcoder.plugin.objecthelper.config.PluginConfigState; import cn.bigcoder.plugin.objecthelper.generator.Generator; import cn.bigcoder.plugin.objecthelper.generator.json.ClassJsonGenerator; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.ide.CopyPasteManager; import com.intellij.psi.PsiClass; -import org.jetbrains.annotations.NotNull; import java.awt.datatransfer.StringSelection; import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.getOperatePsiClass; -import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.setActionInvisible; -public class ClassToJsonAction extends AnAction { +public class ClassToJsonAction extends AbstractClassAnAction { @Override public void actionPerformed(AnActionEvent anAction) { @@ -31,14 +29,9 @@ public void actionPerformed(AnActionEvent anAction) { } @Override - public void update(@NotNull AnActionEvent anActionEvent) { - if (!PluginConfigState.getInstance().isJsonSwitch()) { - setActionInvisible(anActionEvent); - } else if (getOperatePsiClass(anActionEvent) == null) { - // 如果当前光标不在类名上,则不显示ConvertToJson组件 - setActionInvisible(anActionEvent); - } - super.update(anActionEvent); + public boolean actionShow(AnActionEvent anActionEvent) { + return PluginConfigState.getInstance().getJsonSwitch() == FunctionSwitchEnum.OPEN + && getOperatePsiClass(anActionEvent) != null; } protected Generator getGenerator(PsiClass psiClass) { diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/action/ClassToThriftIDLAction.java b/src/main/java/cn/bigcoder/plugin/objecthelper/action/ClassToThriftIDLAction.java index 6af3f62..d25b2bd 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/action/ClassToThriftIDLAction.java +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/action/ClassToThriftIDLAction.java @@ -1,9 +1,9 @@ package cn.bigcoder.plugin.objecthelper.action; +import cn.bigcoder.plugin.objecthelper.common.enums.FunctionSwitchEnum; import cn.bigcoder.plugin.objecthelper.common.util.NotificationUtils; import cn.bigcoder.plugin.objecthelper.config.PluginConfigState; import cn.bigcoder.plugin.objecthelper.generator.idl.ThriftIDLGenerator; -import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.ide.CopyPasteManager; import com.intellij.psi.PsiClass; @@ -12,13 +12,12 @@ import java.awt.datatransfer.StringSelection; import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.getOperatePsiClass; -import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.setActionInvisible; /** * @author: Jindong.Tian * @date: 2021-08-21 **/ -public class ClassToThriftIDLAction extends AnAction { +public class ClassToThriftIDLAction extends AbstractClassAnAction { @Override public void actionPerformed(@NotNull AnActionEvent anActionEvent) { PsiClass psiClass = getOperatePsiClass(anActionEvent); @@ -31,13 +30,8 @@ public void actionPerformed(@NotNull AnActionEvent anActionEvent) { } @Override - public void update(@NotNull AnActionEvent anActionEvent) { - if (!PluginConfigState.getInstance().isThriftSwitch()) { - setActionInvisible(anActionEvent); - } else if (getOperatePsiClass(anActionEvent) == null) { - // 如果当前光标不在类名上,则不显示ConvertToJson组件 - setActionInvisible(anActionEvent); - } - super.update(anActionEvent); + public boolean actionShow(@NotNull AnActionEvent anActionEvent) { + return PluginConfigState.getInstance().getThriftSwitch() == FunctionSwitchEnum.OPEN + && getOperatePsiClass(anActionEvent) != null; } } \ No newline at end of file diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/action/ClassToXMLAction.java b/src/main/java/cn/bigcoder/plugin/objecthelper/action/ClassToXMLAction.java index 5a38a49..82cb64c 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/action/ClassToXMLAction.java +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/action/ClassToXMLAction.java @@ -1,24 +1,21 @@ package cn.bigcoder.plugin.objecthelper.action; +import cn.bigcoder.plugin.objecthelper.common.enums.FunctionSwitchEnum; import cn.bigcoder.plugin.objecthelper.common.util.NotificationUtils; import cn.bigcoder.plugin.objecthelper.config.PluginConfigState; import cn.bigcoder.plugin.objecthelper.generator.Generator; -import cn.bigcoder.plugin.objecthelper.generator.json.ClassJsonGenerator; import cn.bigcoder.plugin.objecthelper.generator.xml.ClassXMLGenerator; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.ide.CopyPasteManager; import com.intellij.psi.PsiClass; -import org.jetbrains.annotations.NotNull; +import groovy.json.StringEscapeUtils; import java.awt.datatransfer.StringSelection; +import org.jetbrains.annotations.NotNull; import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.getOperatePsiClass; -import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.setActionInvisible; -public class ClassToXMLAction extends AnAction { +public class ClassToXMLAction extends AbstractClassAnAction { @Override public void actionPerformed(AnActionEvent anAction) { @@ -26,20 +23,15 @@ public void actionPerformed(AnActionEvent anAction) { if (psiClass == null) { return; } - String json = getGenerator(psiClass).generate(); - CopyPasteManager.getInstance().setContents(new StringSelection(json)); - NotificationUtils.notifyInfo(anAction.getProject(), "XML字符串成功置入剪贴板:
" + json); + String xmlStr = getGenerator(psiClass).generate(); + CopyPasteManager.getInstance().setContents(new StringSelection(xmlStr)); + NotificationUtils.notifyInfo(anAction.getProject(), "XML字符串成功置入剪贴板"); } @Override - public void update(@NotNull AnActionEvent anActionEvent) { - if (!PluginConfigState.getInstance().isXmlSwitch()) { - setActionInvisible(anActionEvent); - } else if (getOperatePsiClass(anActionEvent) == null) { - // 如果当前光标不在类名上,则不显示ConvertToJson组件 - setActionInvisible(anActionEvent); - } - super.update(anActionEvent); + public boolean actionShow(@NotNull AnActionEvent anActionEvent) { + return PluginConfigState.getInstance().getXmlSwitch() == FunctionSwitchEnum.OPEN + && getOperatePsiClass(anActionEvent) != null; } protected Generator getGenerator(PsiClass psiClass) { diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/action/ObjectCopyMethodAction.java b/src/main/java/cn/bigcoder/plugin/objecthelper/action/ObjectCopyMethodAction.java index 9cc5808..8b8fe9e 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/action/ObjectCopyMethodAction.java +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/action/ObjectCopyMethodAction.java @@ -1,23 +1,20 @@ package cn.bigcoder.plugin.objecthelper.action; +import cn.bigcoder.plugin.objecthelper.common.enums.FunctionSwitchEnum; import cn.bigcoder.plugin.objecthelper.common.util.PsiUtils; import cn.bigcoder.plugin.objecthelper.common.util.StringUtils; import cn.bigcoder.plugin.objecthelper.config.PluginConfigState; import cn.bigcoder.plugin.objecthelper.generator.Generator; import cn.bigcoder.plugin.objecthelper.generator.method.ObjectCopyMethodGenerator; -import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiElementFactory; import com.intellij.psi.PsiMethod; -import org.jetbrains.annotations.NotNull; import static cn.bigcoder.plugin.objecthelper.common.constant.JavaKeyWord.VOID; -import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.getOperatePsiClass; -import static cn.bigcoder.plugin.objecthelper.common.util.PsiUtils.setActionInvisible; -public class ObjectCopyMethodAction extends AnAction { +public class ObjectCopyMethodAction extends AbstractClassAnAction { @Override public void actionPerformed(AnActionEvent anActionEvent) { @@ -27,14 +24,9 @@ public void actionPerformed(AnActionEvent anActionEvent) { } @Override - public void update(@NotNull AnActionEvent anActionEvent) { - if (!PluginConfigState.getInstance().isObjectCopySwitch()) { - PsiUtils.setActionDisabled(anActionEvent); - } else if (!check(PsiUtils.getCursorPsiMethod(anActionEvent))) { - // 如果当前光标不在方法中,则不显示Object Copy组件 - PsiUtils.setActionDisabled(anActionEvent); - } - super.update(anActionEvent); + public boolean actionShow(AnActionEvent anActionEvent) { + return PluginConfigState.getInstance().getObjectCopySwitch() == FunctionSwitchEnum.OPEN + && check(PsiUtils.getCursorPsiMethod(anActionEvent)); } private void generateO2O(PsiMethod psiMethod) { @@ -64,7 +56,7 @@ private void generateO2O(PsiMethod psiMethod) { */ private boolean check(PsiMethod psiMethod) { if (psiMethod == null - || PsiUtils.getPsiParameters(psiMethod).size() == 0 + || PsiUtils.getPsiParameters(psiMethod).isEmpty() || VOID.equals(PsiUtils.getMethodReturnClassName(psiMethod))) { return false; } diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/CommonEnum.java b/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/CommonEnum.java new file mode 100644 index 0000000..f470499 --- /dev/null +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/CommonEnum.java @@ -0,0 +1,11 @@ +package cn.bigcoder.plugin.objecthelper.common.enums; + +/** + * @author: Jindong.Tian + * @date: 2023-12-24 + * @description: + **/ +public interface CommonEnum { + + String getCode(); +} diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/FieldGenerateModeEnum.java b/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/FieldGenerateModeEnum.java new file mode 100644 index 0000000..4ff4899 --- /dev/null +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/FieldGenerateModeEnum.java @@ -0,0 +1,34 @@ +package cn.bigcoder.plugin.objecthelper.common.enums; + +/** + * @author: Jindong.Tian + * @date: 2023-12-24 + **/ +public enum FieldGenerateModeEnum implements CommonEnum { + SOURCE("source"), + TARGET("target"), + ; + private String code; + + FieldGenerateModeEnum(String code) { + this.code = code; + } + + + public static FieldGenerateModeEnum nameOf(String modify) { + if (modify == null) { + return null; + } + for (FieldGenerateModeEnum item : values()) { + if (modify.equals(item.getCode())) { + return item; + } + } + return null; + } + + @Override + public String getCode() { + return code; + } +} diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/FunctionSwitchEnum.java b/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/FunctionSwitchEnum.java new file mode 100644 index 0000000..866c40f --- /dev/null +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/FunctionSwitchEnum.java @@ -0,0 +1,32 @@ +package cn.bigcoder.plugin.objecthelper.common.enums; + +/** + * @author: Jindong.Tian + * @date: 2023-12-24 + **/ +public enum FunctionSwitchEnum implements CommonEnum { + OPEN("open"), + CLOSE("close"), + ; + private String code; + + FunctionSwitchEnum(String code) { + this.code = code; + } + + public String getCode() { + return code; + } + + public static FunctionSwitchEnum nameOf(String modify) { + if (modify == null) { + return null; + } + for (FunctionSwitchEnum item : values()) { + if (modify.equals(item.getCode())) { + return item; + } + } + return null; + } +} diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/JavaModify.java b/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/JavaModifyEnum.java similarity index 77% rename from src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/JavaModify.java rename to src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/JavaModifyEnum.java index f5d106a..c599104 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/JavaModify.java +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/JavaModifyEnum.java @@ -4,7 +4,7 @@ * @author: Jindong.Tian * @date: 2021-01-09 **/ -public enum JavaModify { +public enum JavaModifyEnum { PUBLIC("public", 1), PROTECTED("protected", 1), PRIVATE("private", 1), @@ -14,7 +14,7 @@ public enum JavaModify { private String name; private Integer priority; - JavaModify(String name, Integer priority) { + JavaModifyEnum(String name, Integer priority) { this.name = name; this.priority = priority; } @@ -23,11 +23,11 @@ public String getName() { return name; } - public JavaModify nameOf(String modify){ + public JavaModifyEnum nameOf(String modify){ if (modify == null){ return null; } - for (JavaModify item : values()) { + for (JavaModifyEnum item : values()) { if (modify.equals(item.getName())){ return item; } diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/WhetherEnum.java b/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/WhetherEnum.java new file mode 100644 index 0000000..918c484 --- /dev/null +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/common/enums/WhetherEnum.java @@ -0,0 +1,32 @@ +package cn.bigcoder.plugin.objecthelper.common.enums; + +/** + * @author: Jindong.Tian + * @date: 2023-12-24 + **/ +public enum WhetherEnum implements CommonEnum { + YES("yes"), + NO("no"), + ; + private String code; + + WhetherEnum(String code) { + this.code = code; + } + + public String getCode() { + return code; + } + + public static WhetherEnum nameOf(String modify) { + if (modify == null) { + return null; + } + for (WhetherEnum item : values()) { + if (modify.equals(item.getCode())) { + return item; + } + } + return null; + } +} diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/common/util/PsiUtils.java b/src/main/java/cn/bigcoder/plugin/objecthelper/common/util/PsiUtils.java index a727e5c..c243b0e 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/common/util/PsiUtils.java +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/common/util/PsiUtils.java @@ -1,7 +1,7 @@ package cn.bigcoder.plugin.objecthelper.common.util; import cn.bigcoder.plugin.objecthelper.common.constant.JavaKeyWord; -import cn.bigcoder.plugin.objecthelper.common.enums.JavaModify; +import cn.bigcoder.plugin.objecthelper.common.enums.JavaModifyEnum; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.actionSystem.PlatformDataKeys; @@ -13,6 +13,7 @@ import com.intellij.psi.PsiField; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiModifier; import com.intellij.psi.PsiModifierList; import com.intellij.psi.PsiParameter; import com.intellij.psi.PsiType; @@ -170,20 +171,20 @@ public static List getPsiParameters(PsiMethod psiMethod) { * @return */ @NotNull - public static List getMethodModifies(PsiModifierList modifierList) { - List result = new ArrayList<>(); - if (modifierList.hasModifierProperty(JavaModify.PUBLIC.getName())) { - result.add(JavaModify.PUBLIC); - } else if (modifierList.hasModifierProperty(JavaModify.PROTECTED.getName())) { - result.add(JavaModify.PROTECTED); - } else if (modifierList.hasModifierProperty(JavaModify.PRIVATE.getName())) { - result.add(JavaModify.PRIVATE); + public static List getMethodModifies(PsiModifierList modifierList) { + List result = new ArrayList<>(); + if (modifierList.hasModifierProperty(JavaModifyEnum.PUBLIC.getName())) { + result.add(JavaModifyEnum.PUBLIC); + } else if (modifierList.hasModifierProperty(JavaModifyEnum.PROTECTED.getName())) { + result.add(JavaModifyEnum.PROTECTED); + } else if (modifierList.hasModifierProperty(JavaModifyEnum.PRIVATE.getName())) { + result.add(JavaModifyEnum.PRIVATE); } - if (modifierList.hasModifierProperty(JavaModify.STATIC.getName())) { - result.add(JavaModify.STATIC); + if (modifierList.hasModifierProperty(JavaModifyEnum.STATIC.getName())) { + result.add(JavaModifyEnum.STATIC); } - if (modifierList.hasModifierProperty(JavaModify.FINAL.getName())) { - result.add(JavaModify.FINAL); + if (modifierList.hasModifierProperty(JavaModifyEnum.FINAL.getName())) { + result.add(JavaModifyEnum.FINAL); } return result; } @@ -201,6 +202,23 @@ public static List getAllPsiFields(PsiClass psiClass) { return result; } + /** + * 判断一个字段是否是类的成员属性 + * + * @param psiField + * @return + */ + public static boolean isMemberField(PsiField psiField) { + PsiModifierList modifierList = psiField.getModifierList(); + if (modifierList == null || + modifierList.hasModifierProperty(PsiModifier.STATIC) || + modifierList.hasModifierProperty(PsiModifier.FINAL) || + modifierList.hasModifierProperty(PsiModifier.SYNCHRONIZED)) { + return false; + } + return true; + } + /** * 递归获取类中所有字段 * diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/common/util/XMLUtils.java b/src/main/java/cn/bigcoder/plugin/objecthelper/common/util/XMLUtils.java index d1ec63f..d55f516 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/common/util/XMLUtils.java +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/common/util/XMLUtils.java @@ -1,16 +1,10 @@ package cn.bigcoder.plugin.objecthelper.common.util; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import java.io.IOException; -import java.io.StringWriter; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import java.util.Map; /** @@ -18,45 +12,33 @@ * @date: 2022-08-26 **/ public class XMLUtils { - /** - * 将Map转换为XML格式的字符串 - * - * @param data Map类型数据 - * @return XML格式的字符串 - * @throws Exception - */ - public static String mapToXml(Map data) { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - String output = null; //.replaceAll("\n|\r", ""); - try { - DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder(); - org.w3c.dom.Document document = documentBuilder.newDocument(); - org.w3c.dom.Element root = document.createElement("xml"); - document.appendChild(root); - for (String key: data.keySet()) { - String value = data.get(key).toString(); - value = value.trim(); - org.w3c.dom.Element filed = document.createElement(key); - filed.appendChild(document.createTextNode(value)); - root.appendChild(filed); - } - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer transformer = tf.newTransformer(); - DOMSource source = new DOMSource(document); - transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - StringWriter writer = new StringWriter(); - StreamResult result = new StreamResult(writer); - transformer.transform(source, result); - output = writer.getBuffer().toString(); - writer.close(); - } catch (ParserConfigurationException e) { - e.printStackTrace(); - } catch (TransformerException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); + + /** + * 将Map转换为XML格式的字符串 + * + * @param data Map类型数据 + * @return XML格式的字符串 + * @throws Exception + */ + public static String mapToXml(Map data) { + ObjectMapper objectMapper = new XmlMapper(); + // 修正根元素名称 + objectMapper.addMixIn(Map.class, MapMixin.class); + objectMapper.enable(SerializationFeature.INDENT_OUTPUT); + String xmlString = ""; + try { + xmlString = objectMapper.writeValueAsString(data); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + return xmlString; + } + + /** + * 用于修正根元素名称 + */ + @JacksonXmlRootElement(localName = "root") + public static abstract class MapMixin { + } - return output; - } } diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/config/ObjectHelperConfigurable.java b/src/main/java/cn/bigcoder/plugin/objecthelper/config/ObjectHelperConfigurable.java index 7d2b187..39e1853 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/config/ObjectHelperConfigurable.java +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/config/ObjectHelperConfigurable.java @@ -44,10 +44,12 @@ public boolean isModified() { public void apply() { PluginConfigModel instance = PluginConfigState.getInstance(); PluginConfigModel currentConfigModel = configPage.getCurrentConfigModel(); - instance.setJsonSwitch(currentConfigModel.isJsonSwitch()); - instance.setThriftSwitch(currentConfigModel.isThriftSwitch()); - instance.setXmlSwitch(currentConfigModel.isXmlSwitch()); - instance.setObjectCopySwitch(currentConfigModel.isObjectCopySwitch()); + instance.setJsonSwitch(currentConfigModel.getJsonSwitch()); + instance.setThriftSwitch(currentConfigModel.getThriftSwitch()); + instance.setXmlSwitch(currentConfigModel.getXmlSwitch()); + instance.setObjectCopySwitch(currentConfigModel.getObjectCopySwitch()); + instance.setObjectCopyMethodFieldGenerateAnnotation(currentConfigModel.getObjectCopyMethodFieldGenerateAnnotation()); + instance.setObjectCopyMethodFieldGenerateMode(currentConfigModel.getObjectCopyMethodFieldGenerateMode()); } } diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/config/PluginConfigModel.java b/src/main/java/cn/bigcoder/plugin/objecthelper/config/PluginConfigModel.java index ef25e8e..36d3b94 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/config/PluginConfigModel.java +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/config/PluginConfigModel.java @@ -1,5 +1,8 @@ package cn.bigcoder.plugin.objecthelper.config; +import cn.bigcoder.plugin.objecthelper.common.enums.FieldGenerateModeEnum; +import cn.bigcoder.plugin.objecthelper.common.enums.FunctionSwitchEnum; +import cn.bigcoder.plugin.objecthelper.common.enums.WhetherEnum; import java.util.Objects; /** @@ -7,65 +10,101 @@ * @date: 2022-08-31 **/ public class PluginConfigModel { + /** * 是否开启 Class To Json 功能,默认为开启状态 */ - private boolean jsonSwitch = true; + private FunctionSwitchEnum jsonSwitch = FunctionSwitchEnum.OPEN; /** * 是否开启 Class To Thrift IDL 功能,默认为开启状态 */ - private boolean thriftSwitch = true; + private FunctionSwitchEnum thriftSwitch = FunctionSwitchEnum.OPEN; /** * 是否开启 Class To XML 功能,默认为开启状态 */ - private boolean xmlSwitch = true; + private FunctionSwitchEnum xmlSwitch = FunctionSwitchEnum.OPEN; /** * 是否开启 Object Copy Method 功能,默认为开启状态 */ - private boolean objectCopySwitch = true; + private FunctionSwitchEnum objectCopySwitch = FunctionSwitchEnum.OPEN; + /** + * Object Copy Method 功能中,以Source/Target对象为基础生成字段拷贝 + */ + private FieldGenerateModeEnum objectCopyMethodFieldGenerateMode = FieldGenerateModeEnum.TARGET; - public boolean isJsonSwitch() { + /** + * Object Copy Method 功能中,Source 和 Target 对象之间差异的字段,是否以代码注释的形式生成代码 + */ + private WhetherEnum objectCopyMethodFieldGenerateAnnotation = WhetherEnum.YES; + + public FunctionSwitchEnum getJsonSwitch() { return jsonSwitch; } - public void setJsonSwitch(boolean jsonSwitch) { + public void setJsonSwitch(FunctionSwitchEnum jsonSwitch) { this.jsonSwitch = jsonSwitch; } - public boolean isThriftSwitch() { + public FunctionSwitchEnum getThriftSwitch() { return thriftSwitch; } - public void setThriftSwitch(boolean thriftSwitch) { + public void setThriftSwitch(FunctionSwitchEnum thriftSwitch) { this.thriftSwitch = thriftSwitch; } - public boolean isXmlSwitch() { + public FunctionSwitchEnum getXmlSwitch() { return xmlSwitch; } - public void setXmlSwitch(boolean xmlSwitch) { + public void setXmlSwitch(FunctionSwitchEnum xmlSwitch) { this.xmlSwitch = xmlSwitch; } - public boolean isObjectCopySwitch() { + public FunctionSwitchEnum getObjectCopySwitch() { return objectCopySwitch; } - public void setObjectCopySwitch(boolean objectCopySwitch) { + public void setObjectCopySwitch(FunctionSwitchEnum objectCopySwitch) { this.objectCopySwitch = objectCopySwitch; } + public FieldGenerateModeEnum getObjectCopyMethodFieldGenerateMode() { + return objectCopyMethodFieldGenerateMode; + } + + public void setObjectCopyMethodFieldGenerateMode( + FieldGenerateModeEnum objectCopyMethodFieldGenerateMode) { + this.objectCopyMethodFieldGenerateMode = objectCopyMethodFieldGenerateMode; + } + + public WhetherEnum getObjectCopyMethodFieldGenerateAnnotation() { + return objectCopyMethodFieldGenerateAnnotation; + } + + public void setObjectCopyMethodFieldGenerateAnnotation( + WhetherEnum objectCopyMethodFieldGenerateAnnotation) { + this.objectCopyMethodFieldGenerateAnnotation = objectCopyMethodFieldGenerateAnnotation; + } + @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } PluginConfigModel that = (PluginConfigModel) o; - return jsonSwitch == that.jsonSwitch && thriftSwitch == that.thriftSwitch && xmlSwitch == that.xmlSwitch && objectCopySwitch == that.objectCopySwitch; + return jsonSwitch == that.jsonSwitch && thriftSwitch == that.thriftSwitch && xmlSwitch == that.xmlSwitch + && objectCopySwitch == that.objectCopySwitch + && objectCopyMethodFieldGenerateMode == that.objectCopyMethodFieldGenerateMode + && objectCopyMethodFieldGenerateAnnotation == that.objectCopyMethodFieldGenerateAnnotation; } @Override public int hashCode() { - return Objects.hash(jsonSwitch, thriftSwitch, xmlSwitch, objectCopySwitch); + return Objects.hash(jsonSwitch, thriftSwitch, xmlSwitch, objectCopySwitch, objectCopyMethodFieldGenerateMode, + objectCopyMethodFieldGenerateAnnotation); } } diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/generator/AbstractMethodGenerator.java b/src/main/java/cn/bigcoder/plugin/objecthelper/generator/AbstractMethodGenerator.java index abb3ad1..c3912c2 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/generator/AbstractMethodGenerator.java +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/generator/AbstractMethodGenerator.java @@ -6,6 +6,7 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiParameter; +import com.intellij.psi.PsiType; import org.apache.commons.collections.CollectionUtils; import java.util.List; @@ -66,4 +67,8 @@ protected boolean check() { protected List getParameters() { return getPsiParameters(psiMethod); } + + protected PsiType getReturnType() { + return psiMethod.getReturnType(); + } } diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/generator/idl/ThriftIDLGenerator.java b/src/main/java/cn/bigcoder/plugin/objecthelper/generator/idl/ThriftIDLGenerator.java index 2ea54f1..0679bdd 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/generator/idl/ThriftIDLGenerator.java +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/generator/idl/ThriftIDLGenerator.java @@ -46,6 +46,9 @@ public String generate() { * @return */ private StringBuilder generateStructCode(PsiClass psiClass) { + if (psiClass == null) { + return new StringBuilder(); + } if (recursiveCache.contains(psiClass.getQualifiedName())) { return new StringBuilder(); } diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/generator/method/ObjectCopyMethodGenerator.java b/src/main/java/cn/bigcoder/plugin/objecthelper/generator/method/ObjectCopyMethodGenerator.java index 1203fd6..0799f9a 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/generator/method/ObjectCopyMethodGenerator.java +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/generator/method/ObjectCopyMethodGenerator.java @@ -1,7 +1,10 @@ package cn.bigcoder.plugin.objecthelper.generator.method; +import cn.bigcoder.plugin.objecthelper.common.enums.FieldGenerateModeEnum; +import cn.bigcoder.plugin.objecthelper.common.enums.WhetherEnum; import cn.bigcoder.plugin.objecthelper.common.util.PsiUtils; import cn.bigcoder.plugin.objecthelper.common.util.StringUtils; +import cn.bigcoder.plugin.objecthelper.config.PluginConfigState; import cn.bigcoder.plugin.objecthelper.generator.AbstractMethodGenerator; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiField; @@ -9,6 +12,10 @@ import com.intellij.psi.PsiModifier; import com.intellij.psi.PsiModifierList; import com.intellij.psi.PsiParameter; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import org.jetbrains.annotations.NotNull; import static cn.bigcoder.plugin.objecthelper.common.constant.JavaKeyWord.*; @@ -60,16 +67,33 @@ protected String generateMethodBody() { StringBuilder result = new StringBuilder(); result.append(generateNullCheck()); result.append(generateObjectCreateLine()); - for (PsiField field : PsiUtils.getAllPsiFields(getFirstParameterClass())) { - PsiModifierList modifierList = field.getModifierList(); - if (modifierList == null || - modifierList.hasModifierProperty(PsiModifier.STATIC) || - modifierList.hasModifierProperty(PsiModifier.FINAL) || - modifierList.hasModifierProperty(PsiModifier.SYNCHRONIZED)) { + FieldGenerateModeEnum generateModeEnum = PluginConfigState.getInstance() + .getObjectCopyMethodFieldGenerateMode(); + // mainClass 代表以哪个类字段为基础生成字段拷贝代码 + PsiClass mainClass = getReturnClass(); + PsiClass secondClass = getFirstParameterClass(); + if (generateModeEnum == FieldGenerateModeEnum.SOURCE) { + mainClass = getFirstParameterClass(); + secondClass = getReturnClass(); + } + + Set secondFieldNames = PsiUtils.getAllPsiFields(secondClass).stream().filter(e -> PsiUtils.isMemberField(e)) + .map(PsiField::getName).collect(Collectors.toSet()); + + List annotationLine = new LinkedList<>(); + for (PsiField field : PsiUtils.getAllPsiFields(mainClass)) { + if (!PsiUtils.isMemberField(field)) { continue; } - result.append(generateFieldCopyLine(field)); + if (secondFieldNames.contains(field.getName())) { + result.append(generateFieldCopyLine(field)); + } else if (PluginConfigState.getInstance().getObjectCopyMethodFieldGenerateAnnotation() + == WhetherEnum.YES) { + // 如果源对象没有该字段,且开启了以注释模式生成代码的开关,则生成注释 + annotationLine.add("// "+ generateFieldCopyLine(field)); + } } + annotationLine.forEach(result::append); result.append(generateReturnLine()); return result.toString(); } @@ -123,6 +147,7 @@ private PsiParameter getFirstParameter() { return getParameters().get(FIRST_INDEX); } + /** * 获取参数列表第一个参数的{@code PsiClass} * @@ -131,4 +156,8 @@ private PsiParameter getFirstParameter() { private PsiClass getFirstParameterClass() { return getPsiClass(getFirstParameter().getType(), project); } + + private PsiClass getReturnClass() { + return getPsiClass(getReturnType(), project); + } } \ No newline at end of file diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/ui/ConfigPage.form b/src/main/java/cn/bigcoder/plugin/objecthelper/ui/ConfigPage.form index f4c3584..7e08139 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/ui/ConfigPage.form +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/ui/ConfigPage.form @@ -8,15 +8,22 @@ - + + + + + + + + - + - + @@ -47,7 +54,7 @@ - + @@ -60,7 +67,7 @@ - + @@ -72,7 +79,7 @@ - + @@ -93,7 +100,7 @@ - + @@ -103,6 +110,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/ui/ConfigPage.java b/src/main/java/cn/bigcoder/plugin/objecthelper/ui/ConfigPage.java index 8ccee25..033ca7e 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/ui/ConfigPage.java +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/ui/ConfigPage.java @@ -1,8 +1,13 @@ package cn.bigcoder.plugin.objecthelper.ui; +import cn.bigcoder.plugin.objecthelper.common.enums.FieldGenerateModeEnum; +import cn.bigcoder.plugin.objecthelper.common.enums.FunctionSwitchEnum; +import cn.bigcoder.plugin.objecthelper.common.enums.WhetherEnum; import cn.bigcoder.plugin.objecthelper.config.PluginConfigState; import cn.bigcoder.plugin.objecthelper.config.PluginConfigModel; +import java.util.Optional; +import java.util.function.Function; import javax.swing.*; /** @@ -11,13 +16,14 @@ **/ public class ConfigPage { - private static final String OPEN_STATUS = "open"; - private JPanel mainPanel; private JComboBox classToJsonSwitch; private JComboBox classToThriftSwitch; private JComboBox classToXmlSwitch; private JComboBox objectCopyMethodSwitch; + private JButton tipsButton; + private JComboBox objectCopyMethodGenerateMode; + private JComboBox objectCopyMethodGenerateAnnotation; public JPanel getMainPanel() { initField(); @@ -29,10 +35,12 @@ public JPanel getMainPanel() { */ public void initField() { PluginConfigModel instance = PluginConfigState.getInstance(); - this.classToJsonSwitch.setSelectedItem(convertComboBoxItem(instance.isJsonSwitch())); - this.classToThriftSwitch.setSelectedItem(convertComboBoxItem(instance.isThriftSwitch())); - this.classToXmlSwitch.setSelectedItem(convertComboBoxItem(instance.isXmlSwitch())); - this.objectCopyMethodSwitch.setSelectedItem(convertComboBoxItem(instance.isObjectCopySwitch())); + this.classToJsonSwitch.setSelectedItem(instance.getJsonSwitch().getCode()); + this.classToThriftSwitch.setSelectedItem(instance.getThriftSwitch().getCode()); + this.classToXmlSwitch.setSelectedItem(instance.getXmlSwitch().getCode()); + this.objectCopyMethodSwitch.setSelectedItem(instance.getObjectCopySwitch().getCode()); + this.objectCopyMethodGenerateAnnotation.setSelectedItem(instance.getObjectCopyMethodFieldGenerateAnnotation().getCode()); + this.objectCopyMethodGenerateMode.setSelectedItem(instance.getObjectCopyMethodFieldGenerateMode().getCode()); } /** @@ -42,17 +50,32 @@ public void initField() { */ public PluginConfigModel getCurrentConfigModel() { PluginConfigModel pluginConfigModel = new PluginConfigModel(); - pluginConfigModel.setJsonSwitch(this.classToJsonSwitch.getSelectedItem().equals(OPEN_STATUS)); - pluginConfigModel.setThriftSwitch(this.classToThriftSwitch.getSelectedItem().equals(OPEN_STATUS)); - pluginConfigModel.setXmlSwitch(this.classToXmlSwitch.getSelectedItem().equals(OPEN_STATUS)); - pluginConfigModel.setObjectCopySwitch(this.objectCopyMethodSwitch.getSelectedItem().equals(OPEN_STATUS)); + + Optional.ofNullable(this.classToJsonSwitch.getSelectedItem()).ifPresent(e -> { + pluginConfigModel.setJsonSwitch(FunctionSwitchEnum.nameOf(e.toString())); + } + ); + Optional.ofNullable(this.classToThriftSwitch.getSelectedItem()).ifPresent(e -> { + pluginConfigModel.setThriftSwitch(FunctionSwitchEnum.nameOf(e.toString())); + } + ); + Optional.ofNullable(this.classToXmlSwitch.getSelectedItem()).ifPresent(e -> { + pluginConfigModel.setXmlSwitch(FunctionSwitchEnum.nameOf(e.toString())); + } + ); + Optional.ofNullable(this.objectCopyMethodSwitch.getSelectedItem()).ifPresent(e -> { + pluginConfigModel.setObjectCopySwitch(FunctionSwitchEnum.nameOf(e.toString())); + } + ); + Optional.ofNullable(this.objectCopyMethodGenerateMode.getSelectedItem()).ifPresent(e -> { + pluginConfigModel.setObjectCopyMethodFieldGenerateMode(FieldGenerateModeEnum.nameOf(e.toString())); + } + ); + Optional.ofNullable(this.objectCopyMethodGenerateAnnotation.getSelectedItem()).ifPresent(e -> { + pluginConfigModel.setObjectCopyMethodFieldGenerateAnnotation(WhetherEnum.nameOf(e.toString())); + } + ); return pluginConfigModel; } - private static String convertComboBoxItem(boolean switchTag) { - if (switchTag) { - return "open"; - } - return "close"; - } } diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 5c2e9be..1581439 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -1,7 +1,7 @@ cn.bigcoder.plugin.objecthelper ObjectHelper - 1.3.1 + 1.3.2 HearingSmile fix feature:Resolve version compatibility issues and adapt new versions of the IDE +
  • add feature:Optimize the class to xml generation results
  • +
  • fix feature:Optimize the class to xml generation results
  • +
  • fix bug:Fix class to Thrift-IDL function NPE problem
  • ]]>
    From 44f2a293b29067fd17ce53d51422803356cd7596 Mon Sep 17 00:00:00 2001 From: "Jindong.Tian" Date: Sun, 24 Dec 2023 17:32:13 +0800 Subject: [PATCH 2/4] update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d6430e..9eb5cb7 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ File->Settings->Tools->Object Helper 即可进入插件的配置页面 - `generate field mode = target` 代表以方法返回类型的字段为基础生成对象拷贝; `generate field mode = source` 代表以方法入参类型的字段为基础生成对象拷贝。 -- `non-existent field generate annotation = yes` 代表当目标字段,在源对象中不存在时,是否以注释的形式生成代码,如果为 `no`,则代表不生成这一个字段拷贝代码。 +- `non-existent field generate annotation = yes` 代表当目标字段在源对象中不存在时,是否以注释的形式生成代码,如果为 `no`,则代表不生成这一个字段拷贝代码。 ## 未来功能支持计划 From 1d484ac1b0e6d0781283c608b9a287982d92e7f2 Mon Sep 17 00:00:00 2001 From: "Jindong.Tian" Date: Sun, 7 Jan 2024 11:35:10 +0800 Subject: [PATCH 3/4] =?UTF-8?q?1.3.2=E7=89=88=E6=9C=AC=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 优化Object Copy Method 功能,新增生成模式配置,以及在字段有差异时以注释的形式生成代码 2. 修复 Class To XML 功能在复杂类结构时生成XML不正确的问题 3. 修复 Class To Thrift-IDL 功能,在一些场景下的NPE问题 4. 优化 Class To Json、Class To XML等功能对基本数据类型的支持 --- README.md | 2 +- .../common/constant/JavaClassName.java | 6 ++ .../common/util/PsiTypeUtils.java | 57 ++++++++++++------- 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 9eb5cb7..a3b37ae 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ - + JetBrains Intellij IDEA ObjectHelper 插件旨在减少开发者重复低效的劳动,使开发者能够更专注于业务逻辑的开发。 diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/common/constant/JavaClassName.java b/src/main/java/cn/bigcoder/plugin/objecthelper/common/constant/JavaClassName.java index 8360806..297cf03 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/common/constant/JavaClassName.java +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/common/constant/JavaClassName.java @@ -16,6 +16,12 @@ public class JavaClassName { public static final String LOCAL_DATE_TYPE = "java.time.LocalDate"; public static final String LOCAL_DATE_TIME_TYPE = "java.time.LocalDateTime"; public static final String BIG_DECIMAL = "java.math.BigDecimal"; + public static final String BASE_INT_TYPE = "int"; + public static final String BASE_LONG_TYPE = "long"; + public static final String BASE_SHORT_TYPE = "short"; + public static final String BASE_BYTE_TYPE = "byte"; + public static final String BASE_DOUBLE_TYPE = "double"; + public static final String BASE_FLOAT_TYPE = "float"; public static final String COLLECTION_TYPE = "java.util.Collection"; public static final String MAP_TYPE = "java.util.Map"; diff --git a/src/main/java/cn/bigcoder/plugin/objecthelper/common/util/PsiTypeUtils.java b/src/main/java/cn/bigcoder/plugin/objecthelper/common/util/PsiTypeUtils.java index c539a76..9dccef7 100644 --- a/src/main/java/cn/bigcoder/plugin/objecthelper/common/util/PsiTypeUtils.java +++ b/src/main/java/cn/bigcoder/plugin/objecthelper/common/util/PsiTypeUtils.java @@ -9,9 +9,12 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Date; +import java.util.HashSet; +import java.util.Set; import org.apache.commons.lang3.time.DateFormatUtils; import static cn.bigcoder.plugin.objecthelper.common.constant.JavaClassName.*; +import static cn.bigcoder.plugin.objecthelper.common.constant.JavaClassName.BASE_BYTE_TYPE; /** * @author: Jindong.Tian @@ -19,6 +22,29 @@ **/ public class PsiTypeUtils { + private static final Set DATA_TYPES; + + static { + DATA_TYPES = new HashSet<>(); + DATA_TYPES.add(STRING_TYPE); + DATA_TYPES.add(INTEGER_TYPE); + DATA_TYPES.add(BASE_INT_TYPE); + DATA_TYPES.add(LONG_TYPE); + DATA_TYPES.add(BASE_LONG_TYPE); + DATA_TYPES.add(SHORT_TYPE); + DATA_TYPES.add(BASE_SHORT_TYPE); + DATA_TYPES.add(BYTE_TYPE); + DATA_TYPES.add(BASE_BYTE_TYPE); + DATA_TYPES.add(DOUBLE_TYPE); + DATA_TYPES.add(BASE_DOUBLE_TYPE); + DATA_TYPES.add(FLOAT_TYPE); + DATA_TYPES.add(BASE_FLOAT_TYPE); + DATA_TYPES.add(DATE_TYPE); + DATA_TYPES.add(LOCAL_DATE_TYPE); + DATA_TYPES.add(LOCAL_DATE_TIME_TYPE); + DATA_TYPES.add(BIG_DECIMAL); + } + /** * 获取数据类型的默认值 * @@ -33,17 +59,23 @@ public static Object getDataTypeDefaultValue(String canonicalText) { case STRING_TYPE: return ""; case INTEGER_TYPE: + case BASE_INT_TYPE: return 1; case LONG_TYPE: + case BASE_LONG_TYPE: return 1L; case SHORT_TYPE: + case BASE_SHORT_TYPE: return (short) 1; case BYTE_TYPE: + case BASE_BYTE_TYPE: return (byte) 1; case DOUBLE_TYPE: - return 1.0; + case BASE_DOUBLE_TYPE: + return 1.1; case FLOAT_TYPE: - return 1.0f; + case BASE_FLOAT_TYPE: + return 1.1f; case DATE_TYPE: return DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); case LOCAL_DATE_TYPE: @@ -62,21 +94,7 @@ public static Object getDataTypeDefaultValue(String canonicalText) { * @return */ public static boolean isDataType(PsiType psiType) { - String canonicalName = psiType.getCanonicalText(); - if (STRING_TYPE.equals(canonicalName) - || INTEGER_TYPE.equals(canonicalName) - || LONG_TYPE.equals(canonicalName) - || SHORT_TYPE.equals(canonicalName) - || BYTE_TYPE.equals(canonicalName) - || DOUBLE_TYPE.equals(canonicalName) - || FLOAT_TYPE.equals(canonicalName) - || DATE_TYPE.equals(canonicalName) - || LOCAL_DATE_TYPE.equals(canonicalName) - || LOCAL_DATE_TIME_TYPE.equals(canonicalName) - || BIG_DECIMAL.equals(canonicalName)) { - return true; - } - return false; + return DATA_TYPES.contains(psiType.getCanonicalText()); } /** @@ -132,11 +150,12 @@ public static boolean isMapType(PsiType psiType) { /** * 判断一个类是否是指定类型子类 - * @param psiType psiType + * + * @param psiType psiType * @param qualifiedName 全限定名称 * @return */ - public static boolean isSpecifiedType(PsiType psiType, String qualifiedName){ + public static boolean isSpecifiedType(PsiType psiType, String qualifiedName) { if (!(psiType instanceof PsiClassType)) { return false; } From 88ef0177be678fbf3fd2751be5d673263a799f23 Mon Sep 17 00:00:00 2001 From: "Jindong.Tian" Date: Sun, 7 Jan 2024 13:45:44 +0800 Subject: [PATCH 4/4] update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a3b37ae..e80575f 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ object-helper插件未来功能支持计划: - [x] Class 转 XML(Class To XML) - [x] 个性化配置 - [ ] Object Copy Method 功能支持 Lambda 表达式 -- [ ] JSON 转 Class(JSON TO Class) -- [ ] Class 转 Protobuf IDL(JSON TO Class) +- [ ] JSON 转 Class(JSON To Class) +- [ ] Class 转 Protobuf IDL(JSON To Class) - [ ] All Setter - [ ] 菜单分组显示