es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

}
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para formatear todos los demás archivos además del archivo Java seleccionado, puedes modificar el bucle for de la siguiente manera:

    for (String generatedClass : generatedClasses) {
        try {
            // ¿Puedo encontrar el tipo de IType de cada archivo Java afectado aquí si ayuda?
            var type = compilationUnit.getJavaProject().findType(generatedClass);
    
            // Aquí es donde se debe realizar el formateo. El código a continuación formatea solo el archivo seleccionado actualmente.
            var editor = JavaUI.openInEditor(type);
            var commandId = IJavaEditorActionDefinitionIds.FORMAT;
            var handlerService = workbench.getService(IHandlerService.class);
            var params = new HashMap<String, Object>();
            params.put("org.eclipse.ui.edit.text.toggleShowWhitespace", "false");
            handlerService.executeCommand(commandId, new ExecutionEvent(null, params, null, null));
            editor.doSave(new NullProgressMonitor());
            editor.close(false);
        } catch (JavaModelException | CoreException | ExecutionException e) {
            e.printStackTrace();
        }
    }
    

    Explicación:

    • La primera línea dentro del bucle abre el archivo Java afectado en un editor.
    • La variable params se utiliza para especificar parámetros adicionales para el comando FORMAT, en este caso, para desactivar la visualización de los caracteres de espacio en blanco.
    • Se llama al método executeCommand con el argumento params y un ExecutionEvent con valores predeterminados para los otros argumentos.
    • Después del formateo, los cambios se guardan y luego se cierra el editor sin guardar, ya que los cambios ya se realizaron en el archivo.
    • Cualquier excepción que ocurra durante este proceso se captura e imprime en la consola.

    Con estas modificaciones, todos los archivos Java afectados deberían formatearse automáticamente después de usar el complemento.

Comments are closed.