Compare commits

..

6 Commits

Author SHA1 Message Date
liuzhihang
d0dd90adb4 支持 2018.3 版本
修改部分字段丢失的问题
2020-07-29 20:35:23 +08:00
liuzhihang
00076c7266 升级版本 2020-07-28 23:45:09 +08:00
liuzhihang
2708122e0a 修改代码 进行优化 2020-07-28 23:43:13 +08:00
liuzhihang
910c4a9175 更新版本 2020-07-28 15:01:08 +08:00
liuzhihang
5ebc83b408 增加英文 2020-07-28 14:57:54 +08:00
liuzhihang
c600c65431 增加英文 2020-07-28 14:52:39 +08:00
6 changed files with 61 additions and 17 deletions

View File

@ -31,4 +31,9 @@ Toolkit
更新 更新
---- ----
欢迎关注公众号liuzhihangs
<img src="https://liuzhihang.com/oss/pic/wechat.jpg" width="20%" height="20%" />

View File

@ -1,10 +1,10 @@
plugins { plugins {
id 'java' id 'java'
id 'org.jetbrains.intellij' version '0.4.15' id 'org.jetbrains.intellij' version '0.4.21'
} }
group 'com.liuzhihang.toolkit' group 'com.liuzhihang.toolkit'
version '1.0.0' version '1.0.4'
sourceCompatibility = 1.8 sourceCompatibility = 1.8

View File

@ -1,8 +1,13 @@
<meta http-equiv="Content-Type" content="text/html; charset=utf8"> <meta http-equiv="Content-Type" content="text/html; charset=utf8">
<ul> <ul>
<li>1.0.0 <li>1.0.4
<ol> <ol>
<li>在Java Entity 中右键复制为Json</li> <li>修复部分字段丢失的bug</li>
<li>修改支持 2018.3 及以上版本</li>
</ol>
<ol>
<li>Fix the bug that some fields are missing</li>
<li>Modified support 2018.3 and above</li>
</ol> </ol>
</li> </li>

View File

@ -17,5 +17,14 @@
<ul> <ul>
<li>将JavaBean复制为Json字符串</li> <li>将JavaBean复制为Json字符串</li>
</ul> </ul>
<ul>
<li>Copy JavaBean as Json string</li>
</ul>
</li>
<li>公众号
<ul>
<li>liuzhihangs</li>
</ul>
<img src="https://liuzhihang.com/oss/pic/wechat.jpg" width="20%" height="20%" />
</li> </li>
</ul> </ul>

View File

@ -11,16 +11,19 @@ import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.psi.*; import com.intellij.psi.*;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiTypesUtil; import com.intellij.psi.util.PsiTypesUtil;
import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.PsiUtil;
import com.liuzhihang.toolkit.utils.GsonFormatUtil; import com.liuzhihang.toolkit.utils.GsonFormatUtil;
import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.*; import java.awt.*;
import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.StringSelection;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.*; import java.util.*;
@ -50,7 +53,7 @@ public class CopyAsJsonAction extends AnAction {
PROPERTIES_TYPES.put("Boolean", false); PROPERTIES_TYPES.put("Boolean", false);
// 其他 // 其他
PROPERTIES_TYPES.put("String", ""); PROPERTIES_TYPES.put("String", "");
PROPERTIES_TYPES.put("BigDecimal", null); PROPERTIES_TYPES.put("BigDecimal", BigDecimal.ZERO);
PROPERTIES_TYPES.put("Date", null); PROPERTIES_TYPES.put("Date", null);
PROPERTIES_TYPES.put("LocalDate", null); PROPERTIES_TYPES.put("LocalDate", null);
PROPERTIES_TYPES.put("LocalTime", null); PROPERTIES_TYPES.put("LocalTime", null);
@ -68,12 +71,22 @@ public class CopyAsJsonAction extends AnAction {
PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE); PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);
Editor editor = e.getData(CommonDataKeys.EDITOR); Editor editor = e.getData(CommonDataKeys.EDITOR);
PsiElement referenceAt = psiFile.findElementAt(editor.getCaretModel().getOffset()); if (editor == null || project == null || psiFile == null) {
PsiClass selectedClass = (PsiClass) PsiTreeUtil.getContextOfType(referenceAt, new Class[]{PsiClass.class}); return;
try { }
Map fieldsMap = getFields(selectedClass);
Gson gson = new GsonBuilder().create(); PsiClass selectedClass = getTargetClass(editor, psiFile);
if (selectedClass == null) {
Notification error = NOTIFICATION_GROUP.createNotification("Please use in java class file", NotificationType.ERROR);
Notifications.Bus.notify(error, project);
return;
}
try {
Map<String, Object> fieldsMap = getFields(selectedClass);
Gson gson = new GsonBuilder().serializeNulls().create();
String json = GsonFormatUtil.gsonFormat(gson, fieldsMap); String json = GsonFormatUtil.gsonFormat(gson, fieldsMap);
// 使用自定义缩进格式 String json = new GsonBuilder().setPrettyPrinting().create().toJson(fieldsMap); // 使用自定义缩进格式 String json = new GsonBuilder().setPrettyPrinting().create().toJson(fieldsMap);
@ -90,13 +103,25 @@ public class CopyAsJsonAction extends AnAction {
} }
@Nullable
public static PsiClass getTargetClass(@NotNull Editor editor, @NotNull PsiFile file) {
int offset = editor.getCaretModel().getOffset();
PsiElement element = file.findElementAt(offset);
if (element != null) {
// 当前类
PsiClass target = PsiTreeUtil.getParentOfType(element, PsiClass.class);
public static Map getFields(PsiClass psiClass) { return target instanceof SyntheticElement ? null : target;
}
return null;
}
public static Map<String, Object> getFields(PsiClass psiClass) {
Map<String, Object> fieldMap = new LinkedHashMap<>(); Map<String, Object> fieldMap = new LinkedHashMap<>();
// Map<String, Object> commentFieldMap = new LinkedHashMap<>(); // Map<String, Object> commentFieldMap = new LinkedHashMap<>();
if (psiClass != null && psiClass.getClassKind() == JvmClassKind.CLASS) { if (psiClass != null && !psiClass.isEnum() && !psiClass.isInterface() && !psiClass.isAnnotationType()) {
for (PsiField field : psiClass.getAllFields()) { for (PsiField field : psiClass.getAllFields()) {
PsiType type = field.getType(); PsiType type = field.getType();
String name = field.getName(); String name = field.getName();
@ -130,7 +155,7 @@ public class CopyAsJsonAction extends AnAction {
list.add(getFields(PsiUtil.resolveClassInType(deepType))); list.add(getFields(PsiUtil.resolveClassInType(deepType)));
} }
fieldMap.put(name, list); fieldMap.put(name, list);
} else if (fieldTypeName.startsWith("List") || fieldTypeName.startsWith("ArrayList") || fieldTypeName.startsWith("Set") || fieldTypeName.startsWith("HashSet")) { } else if (InheritanceUtil.isInheritor(type, CommonClassNames.JAVA_UTIL_COLLECTION)) {
// List Set or HashSet // List Set or HashSet
List<Object> list = new ArrayList<>(); List<Object> list = new ArrayList<>();
PsiType iterableType = PsiUtil.extractIterableTypeParameter(type, false); PsiType iterableType = PsiUtil.extractIterableTypeParameter(type, false);
@ -144,10 +169,10 @@ public class CopyAsJsonAction extends AnAction {
} }
} }
fieldMap.put(name, list); fieldMap.put(name, list);
} else if (fieldTypeName.startsWith("HashMap") || fieldTypeName.startsWith("Map")) { } else if (InheritanceUtil.isInheritor(type, CommonClassNames.JAVA_UTIL_MAP)) {
// HashMap or Map // HashMap or Map
fieldMap.put(name, new HashMap<>(4)); fieldMap.put(name, new HashMap<>(4));
} else if (PsiUtil.resolveClassInType(type).getClassKind() != JvmClassKind.CLASS) { } else if (psiClass.isEnum() || psiClass.isInterface() || psiClass.isAnnotationType()) {
// enum or interface // enum or interface
fieldMap.put(name, ""); fieldMap.put(name, "");
} else { } else {

View File

@ -18,9 +18,9 @@
<actions> <actions>
<action id="Toolkit.Json.CopyAsJsonAction" class="com.liuzhihang.toolkit.action.CopyAsJsonAction" <action id="Toolkit.Json.CopyAsJsonAction" class="com.liuzhihang.toolkit.action.CopyAsJsonAction"
text="Copy As Json" description="Copy As Json"> text="Copy As Json" description="Copy Java Bean as json string">
<add-to-group group-id="EditorPopupMenu" anchor="first"/> <add-to-group group-id="EditorPopupMenu" anchor="first"/>
<keyboard-shortcut keymap="$default" first-keystroke="ctrl shift J"/> <keyboard-shortcut keymap="$default" first-keystroke="shift meta J"/>
</action> </action>
</actions> </actions>
</idea-plugin> </idea-plugin>