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.
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.
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.
Ich habe es auf [GitHub] hochgeladen (https://github.com/Ikeponias/intellij-plugin). Es gibt verschiedene Korrekturen.
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).
Vorerst habe ich ein Plug-In erstellt, das die Beschreibung zum Erstellen einer Instanz in die Zwischenablage kopiert, während der Anfangswert eingegeben wird.
Recommended Posts