From 2708122e0a90ea7d97687001110ce793dafb8900 Mon Sep 17 00:00:00 2001 From: liuzhihang Date: Tue, 28 Jul 2020 23:43:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81=20?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- .../toolkit/action/CopyAsJsonAction.java | 40 +++++++++++++++---- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 4a6965e..785aa65 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'org.jetbrains.intellij' version '0.4.15' + id 'org.jetbrains.intellij' version '0.4.21' } group 'com.liuzhihang.toolkit' diff --git a/src/main/java/com/liuzhihang/toolkit/action/CopyAsJsonAction.java b/src/main/java/com/liuzhihang/toolkit/action/CopyAsJsonAction.java index 65f1a8a..ca16088 100644 --- a/src/main/java/com/liuzhihang/toolkit/action/CopyAsJsonAction.java +++ b/src/main/java/com/liuzhihang/toolkit/action/CopyAsJsonAction.java @@ -11,12 +11,14 @@ import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTypesUtil; import com.intellij.psi.util.PsiUtil; import com.liuzhihang.toolkit.utils.GsonFormatUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.awt.*; import java.awt.datatransfer.Clipboard; @@ -68,10 +70,20 @@ public class CopyAsJsonAction extends AnAction { PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE); Editor editor = e.getData(CommonDataKeys.EDITOR); - PsiElement referenceAt = psiFile.findElementAt(editor.getCaretModel().getOffset()); - PsiClass selectedClass = (PsiClass) PsiTreeUtil.getContextOfType(referenceAt, new Class[]{PsiClass.class}); + if (editor == null || project == null || psiFile == null) { + return; + } + + 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 fieldsMap = getFields(selectedClass); + Map fieldsMap = getFields(selectedClass); Gson gson = new GsonBuilder().create(); String json = GsonFormatUtil.gsonFormat(gson, fieldsMap); @@ -90,13 +102,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 getFields(PsiClass psiClass) { Map fieldMap = new LinkedHashMap<>(); // Map commentFieldMap = new LinkedHashMap<>(); - if (psiClass != null && psiClass.getClassKind() == JvmClassKind.CLASS) { + if (psiClass != null && !psiClass.isEnum() && !psiClass.isInterface() && !psiClass.isAnnotationType()) { for (PsiField field : psiClass.getAllFields()) { PsiType type = field.getType(); String name = field.getName(); @@ -130,7 +154,7 @@ public class CopyAsJsonAction extends AnAction { list.add(getFields(PsiUtil.resolveClassInType(deepType))); } 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 list = new ArrayList<>(); PsiType iterableType = PsiUtil.extractIterableTypeParameter(type, false); @@ -144,10 +168,10 @@ public class CopyAsJsonAction extends AnAction { } } fieldMap.put(name, list); - } else if (fieldTypeName.startsWith("HashMap") || fieldTypeName.startsWith("Map")) { + } else if (InheritanceUtil.isInheritor(type, CommonClassNames.JAVA_UTIL_MAP)) { // HashMap or Map 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 fieldMap.put(name, ""); } else {