[JAVA] J'avais des problèmes au travail, j'ai donc créé un plug-in IntelliJ

introduction

Quand j'écrivais Java, j'écrivais parfois un test qui nécessitait de créer une instance d'une telle classe.


@Value
public class Sample {
    private final Integer a;
    private final String b;
    private final SomeClass c;
}

Il y a aussi des objets imbriqués dans la SomeClass, et créer une instance de cette classe est assez épuisant. De plus, il faut attribuer une valeur initiale à chaque champ, et je pensais à une valeur initiale qui n'est pas liée au test (elle peut être testée s'il y a un objet) pour chaque type. Puisque les mêmes problèmes ont été soulevés par les membres de l'équipe, j'ai décidé de faire quelque chose avec le plug-in IntelliJ en utilisant cette fois ʻIntention Action`. Pour être honnête, tous les détails sont dans la Référence officielle, donc je pense que vous devriez le lire. Ceci est juste un article que j'ai essayé.

Qu'est-ce que les actions intentionnelles?

Une action pratique qui peut être appelée sur l'éditeur IntelliJ. Le raccourci Mac est Option (⌥) + Entrée. Je pense que c'est Alt + Entrée sous Windows. Plus d'informations peuvent être trouvées sur Aide officielle.

Création de plugins

Ce que je visais

Un plug-in qui copie la description de l'instanciation qui place la valeur initiale de chaque type dans le champ de classe dans le presse-papiers. Par exemple


@Value
public class Sample {
    private final Integer a;
    private final String b;
    private final SomeClass c;
}

Si vous l'exécutez dans la classe de

new Sample(0, "", new SomeClass())

Et copiez l'occurrence d'initialisation texto dans le presse-papiers.

Ce que j'ai fait

Je l'ai téléchargé sur GitHub. Il y a diverses corrections.

action

Créez Action que vous voulez exécuter en Java avec le nom "~ Action".


public class CopyAction extends PsiElementBaseIntentionAction {

    private static final String NEW_LINE;
    private static final Map<String, String> initialValueLUT = new HashMap<>();

    static {
        initialValueLUT.put("boolean", "false");
        initialValueLUT.put("Boolean", "false");
        initialValueLUT.put("int", "0");
        initialValueLUT.put("byte", "(byte)0");
        initialValueLUT.put("Byte", "(byte)0");
        initialValueLUT.put("Integer", "0");
        initialValueLUT.put("String", "\"\"");
        initialValueLUT.put("BigDecimal", "new BigDecimal(\"0\")");
        initialValueLUT.put("Long", "0L");
        initialValueLUT.put("long", "0L");
        initialValueLUT.put("short", "(short)0");
        initialValueLUT.put("Short", "(short)0");
        initialValueLUT.put("Date", "new Date()");
        initialValueLUT.put("float", "0.0F");
        initialValueLUT.put("Float", "0.0F");
        initialValueLUT.put("double", "0.0D");
        initialValueLUT.put("Double", "0.0D");
        initialValueLUT.put("Character", "\'\'");
        initialValueLUT.put("char", "\'\'");
        initialValueLUT.put("LocalDateTime", "LocalDateTime.now()");
        initialValueLUT.put("LocalDate", "LocalDate.now()");
        initialValueLUT.put("List", "[]");

        NEW_LINE = System.getProperty("line.separator");
    }

    @Override
    public void invoke(@NotNull Project project, Editor editor,
                       @NotNull PsiElement element) throws IncorrectOperationException {
        if (element.getParent() instanceof PsiClass) {
            final PsiClass psiClass = ((PsiClass) element.getParent());
            final Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
            final String clipBoardText = makeText(psiClass.getName(), psiClass.getAllFields());
            final StringSelection selection = new StringSelection(clipBoardText);
            clipboard.setContents(selection, selection);
        }
    }

    @Override
    public boolean isAvailable(@NotNull Project project, Editor editor,
                               @NotNull PsiElement element) {
        return true;
    }

    @Nls
    @NotNull
    @Override
    public String getFamilyName() {
        return "";
    }

    @NotNull
    @Override
    public String getText() { return "Add Field to ClipBoard";}

    private String makeText(final String className, final PsiField[] psiFields) {
        String clipBoardText = "new " + className + "(" + NEW_LINE;
        clipBoardText += Arrays.stream(psiFields)
                                 .map(p -> "/* " + p.getName() + " */ " + Optional.ofNullable(initialValueLUT
                                                                       .get(p.getTypeElement().getFirstChild().getFirstChild().getText()))
                                                   .orElse("new " + p.getType()
                                                                            .toString()
                                                                            .split(":")[1] + "()"))
                                 .collect(
                                         Collectors.joining("," + NEW_LINE));
        clipBoardText += ")";

        return clipBoardText;
    }
}

plugin.xml Puisque l'action que vous voulez effectuer cette fois est ʻIntention Action, décrivez la classe d'exécution dans plugin.xml en la mettant dans la balise ʻIntention Action.

  <extensions defaultExtensionNs="com.intellij">
    <intentionAction>
      <className>CopyAction</className>
    </intentionAction>
  </extensions>

Recherchez des points d'extension dans Plugin Extension Points (IntentionActions est [LangExtentionPoints.xml](https: // upsource) Autour de la ligne 43 de .jetbrains.com / idea-ce / file / idea-ce-4f9b5f89b2a19ce700b1373a465c16b28ed8ad52 / platform / platform-resources / src / META-INF / LangExtensionPoints.xml).

Ce que j'ai fait

Pour le moment, j'ai créé un plug-in qui copie la description de la création d'une instance dans le presse-papiers en saisissant la valeur initiale. sample.gif

Recommended Posts

J'avais des problèmes au travail, j'ai donc créé un plug-in IntelliJ
J'ai créé un plug-in pour IntelliJ IDEA
J'ai créé un outil Diff pour les fichiers Java
J'ai créé un programme de jugement des nombres premiers en Java
J'ai créé un client API THETA qui peut être utilisé pour le développement de plugins
J'ai créé un jeu Janken en Java (CLI)
J'ai créé une bibliothèque d'extension Ruby en C
J'étais un peu accro à la comparaison S3 Checksum, alors prenez note.
J'ai créé une image Docker pour la version japonaise de SDAPS
J'ai fait un jeu de problèmes de calcul simple en Java
J'ai créé un outil de vérification pour le module de version
J'ai fait une méthode pour demander la prime vendredi
J'ai essayé d'installer le plug-in d'intégration Docker dans IntelliJ
J'ai créé un serveur et un client Restful au printemps.
J'ai créé une bibliothèque pour afficher des tutoriels sur Android.
Parquet-tools donne java.lang.ExceptionInInitializerError, donc je l'ai fait fonctionner avec java8
J'ai créé un plug-in qui exécute jextract avec des tâches Gradle
[Débutant] J'ai créé un programme pour vendre des gâteaux en Java
J'ai recherché un framework web avec Gem en Ruby
J'étais confus parce qu'il y avait une scission dans le tableau
Lorsque j'ai créé un graphique à barres avec MPAndroidChart, l'étiquette de l'axe des x était mal alignée pour une raison quelconque
Une demi-année d'auto-apprentissage fait du SPA avec Rails + Nuxt.js, alors jetez un œil
J'ai fait une roulette à Java.
J'ai créé une application de chat.
[Circle CI] Une histoire à laquelle j'étais accro chez Start Building
J'ai créé une interface de ligne de commande avec WinMerge Plugin en utilisant JD-Core
Je ne peux pas créer une classe Java avec un nom spécifique dans IntelliJ
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 1)
J'ai récemment créé une application js dans le langage courant de Dart
J'ai posé une question qui peut être utilisée pour des entretiens techniques
Création d'une méthode pour demander Premium Friday (version Java 8)
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 5):
"RSpec ne fonctionne pas!" La cause était le printemps, alors je l'ai étudiée.