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é.
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.
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.
Je l'ai téléchargé sur GitHub. Il y a diverses corrections.
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).
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.
Recommended Posts