Cómo llamar programáticamente al formato de Eclipse en un archivo Java específico dentro de un controlador de complemento?
Estoy escribiendo un complemento de Eclipse que reescribe archivos de Java (posiblemente varios archivos) en función del contenido de un archivo de Java seleccionado (hacer clic derecho -> elemento de menú personalizado).
Todo funciona como se pretende, pero la reescritura de los archivos no gestiona el formato del contenido, por lo que después de usar el complemento tengo que formatear manualmente cada archivo de Java afectado con la acción de formato de Eclipse.
Soy capaz de llamar programáticamente a la acción de formato de Eclipse en el archivo de Java seleccionado, pero también me gustaría formatear todos los demás archivos.
Esto es lo que tengo hasta ahora (la parte que debería cambiar está dentro del bucle for):
“`
@Override
public Object execute(ExecutionEvent event) throws ExecutionException
{
var workbench = PlatformUI.getWorkbench();
var activeWorkbenchWindow = workbench.getActiveWorkbenchWindow();
var selection = activeWorkbenchWindow.getActivePage().getSelection();
<pre><code>List<string> generatedClasses = null;
if ((selection instanceof IStructuredSelection structuredSelection)
&& (structuredSelection.getFirstElement() instanceof ICompilationUnit compilationUnit))
{
try
{
var projectClassLoader = getProjectClassLoader(compilationUnit.getJavaProject());
generatedClasses = bindingGenerator.generateBindings(compilationUnit, projectClassLoader);
}
catch (ClassNotFoundException | NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException | IOException
| IllegalClassFormatException | JavaModelException e)
{
// TODO mostrar un cuadro de diálogo de mensaje de error?
return null;
}
for (String generatedClass : generatedClasses)
try
{
// Puedo encontrar el IType de cada archivo Java afectado aquí si eso ayuda?
var type = compilationUnit.getJavaProject().findType(generatedClass);
// Aquí es donde se debe realizar el formateo. El código a continuación actualmente formatea solo el archivo seleccionado.
var commandId = IJavaEditorActionDefinitionIds.FORMAT;
var handlerService = workbench.getService(IHandlerService.class);
try
{
handlerService.executeCommand(commandId, null);
}
catch (Exception e1)
{
e1.printStackTrace();
}
}
catch (JavaModelException e)
{
e.printStackTrace();
}
}
MessageDialog.openInformation(activeWorkbenchWindow.getShell(), "Enlaces generados en archivos:", String.join(", ", generatedClasses));
return null;
</code></pre>
}
“`
davy.ai
Para formatear todos los demás archivos además del archivo Java seleccionado, puedes modificar el bucle
for
de la siguiente manera:Explicación:
params
se utiliza para especificar parámetros adicionales para el comandoFORMAT
, en este caso, para desactivar la visualización de los caracteres de espacio en blanco.executeCommand
con el argumentoparams
y unExecutionEvent
con valores predeterminados para los otros argumentos.Con estas modificaciones, todos los archivos Java afectados deberían formatearse automáticamente después de usar el complemento.