[JAVA] Ich hatte Probleme bei der Arbeit und habe ein IntelliJ-Plug-In erstellt

Einführung

Wenn ich Java schrieb, schrieb ich manchmal einen Test, der zum Erstellen einer Instanz einer solchen Klasse erforderlich war.


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

Es gibt auch einige Objekte, die in der SomeClass verschachtelt sind, und das Erstellen einer Instanz dieser Klasse ist ziemlich anstrengend. Außerdem muss jedem Feld ein Anfangswert zugewiesen werden, und ich habe über einen unbedeutenden Anfangswert für jeden Typ nachgedacht, der nicht mit dem Test zusammenhängt (er kann getestet werden, wenn ein Objekt vorhanden ist). Da die gleichen Probleme von den Teammitgliedern angesprochen wurden, habe ich mich entschlossen, dieses Mal etwas mit dem IntelliJ-Plug-In unter Verwendung von "Intention Action" zu tun. Um ehrlich zu sein, finden Sie alle Details in der offiziellen Referenz. Ich denke, Sie sollten sie lesen. Dies ist nur ein Artikel, den ich ausprobiert habe.

Was sind Absichtsaktionen?

Eine praktische Aktion, die im IntelliJ-Editor aufgerufen werden kann. Die Mac-Verknüpfung lautet Option (⌥) + Eingabetaste. Ich denke, es ist Alt + Enter unter Windows. Weitere Informationen finden Sie unter Offizielle Hilfe.

Plugin-Erstellung

Was ich angestrebt habe

Ein Plug-In, das die Beschreibung der Instanziierung kopiert, mit der der Anfangswert für jeden Typ im Klassenfeld in die Zwischenablage verschoben wird. Zum Beispiel


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

Wenn Sie es in der Klasse von ausführen

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

Kopieren Sie die Textinitialisierungsinstanz in die Zwischenablage.

Was ich gemacht habe

Ich habe es auf [GitHub] hochgeladen (https://github.com/Ikeponias/intellij-plugin). Es gibt verschiedene Korrekturen.

Aktion

Erstellen Sie Aktion, die Sie ausführen möchten in Java mit dem Namen "~ Aktion".


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 Da die Aktion, die Sie dieses Mal ausführen möchten, "Intention Action" ist, beschreiben Sie die Ausführungsklasse in "plugin.xml", indem Sie sie in das "IntentionAction" -Tag einfügen.

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

Suchen Sie nach Erweiterungspunkten unter Plugin-Erweiterungspunkte (IntentionActions ist [LangExtentionPoints.xml](https: // upsource) .jetbrains.com / idea-ce / file / idea-ce-4f9b5f89b2a19ce700b1373a465c16b28ed8ad52 / platform / platform-resources / src / META-INF / LangExtensionPoints.xml) um Zeile 43).

Was ich gemacht habe

Vorerst habe ich ein Plug-In erstellt, das die Beschreibung zum Erstellen einer Instanz in die Zwischenablage kopiert, während der Anfangswert eingegeben wird. sample.gif

Recommended Posts

Ich hatte Probleme bei der Arbeit und habe ein IntelliJ-Plug-In erstellt
Ich habe ein Plug-In für IntelliJ IDEA erstellt
Ich habe ein Diff-Tool für Java-Dateien erstellt
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
Ich habe einen THETA API-Client erstellt, der für die Plug-Entwicklung verwendet werden kann
Ich habe ein Janken-Spiel in Java (CLI) gemacht.
Ich habe eine Ruby-Erweiterungsbibliothek in C erstellt
Ich war ein wenig süchtig nach dem S3-Prüfsummenvergleich, machen Sie sich also eine Notiz.
Ich habe ein Docker-Image für die japanische Version von SDAPS erstellt
Ich habe ein einfaches Berechnungsproblemspiel in Java gemacht
Ich habe ein Check-Tool für das Release-Modul erstellt
Ich habe eine Methode entwickelt, um nach Premium Friday zu fragen
Ich habe versucht, das Docker Integration-Plug-In in IntelliJ zu installieren
Ich habe im Frühjahr einen Restful-Server und -Client erstellt.
Ich habe eine Bibliothek zum Anzeigen von Tutorials auf Android erstellt.
Parkett-Tools gibt java.lang.ExceptionInInitializerError, also habe ich es mit java8 funktionieren lassen
Ich habe ein Plug-In erstellt, das Jextract mit Gradle-Aufgaben ausführt
[Anfänger] Ich habe ein Programm zum Verkauf von Kuchen in Java erstellt
Ich habe mit Gem in Ruby nach einem Webframework gesucht
Ich war verwirrt, weil es eine Aufteilung im Array gab
Als ich mit MPAndroidChart ein Balkendiagramm erstellt habe, war die Beschriftung der x-Achse aus irgendeinem Grund falsch ausgerichtet
Ein halbes Jahr Selbststudium unerfahren gemacht SPA mit Rails + Nuxt.js, also schauen Sie bitte
Ich habe ein Roulette in Java gemacht.
Ich habe eine Chat-App erstellt.
[Circle CI] Eine Geschichte, der ich bei Start Building verfallen war
Ich habe mit JD-Core eine Befehlszeilenschnittstelle mit dem WinMerge Plugin erstellt
Ich kann in IntelliJ keine Java-Klasse mit einem bestimmten Namen erstellen
Ich habe eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 1) erstellt.
Ich habe kürzlich eine JS-App in der gemunkelten Dart-Sprache erstellt
Erstellt eine Methode zum Anfordern von Premium Friday (Java 8-Version)
Ich habe eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 5) erstellt:
"RSpec funktioniert nicht!" Die Ursache war Frühling, also habe ich es untersucht.