Elimine automáticamente declaraciones explícitas de paquetes con declaraciones de importación en Java
eclipse refactoring (8)
Tengo un proyecto creado por otros que incluye miles de archivos de clase y tiene los nombres de los paquetes escritos explícitamente para cada referencia a cualquiera de sus clases. Parece que el código fue ingeniería inversa. ¿Existe una buena herramienta para Java que refactorice el código para que los prefijos de paquetes escritos explícitamente se eliminen de las referencias de clase y se muevan a las declaraciones de importación?
Gracias de antemano.
EDITAR:
Creo que un ejemplo ayudará. Quiero tener las importaciones en la parte superior, y no me importa cuántas importaciones hay.
javax.swing.JButton button1 = new javax.swing.JButton();
Imagine el código anterior pero absolutamente en todas partes en miles y miles de líneas de código entre miles de archivos de clase. Me gustaría poder eliminar todos los prefijos y simplemente tener una buena importación javax.swing.JButton; en la parte superior de cada archivo de clase.
He podido eliminar todos los nombres de paquetes explícitos en las interfaces ejecutando el siguiente comando sed en los archivos de destino, y luego reorganizando las importaciones en eclipse:
sed -e ''s/java/.[^ ]*/.//g;s/com/.[^ ]*/.//g''
IntelliJ Idea tiene herramientas para hacer esto por archivo. Probablemente también puedes hacerlo a granel, pero no sé cómo.
Pruebe una evaluación de 30 días y probablemente quedará satisfecho con las funciones de limpieza de importación.
No conozco una herramienta para este caso de uso, pero tuve que hacer algo similar hace unos meses.
Escriba una secuencia de comandos o realice una búsqueda de reemplazo con expresiones regulares para deshacerse de los prefijos de paquetes escritos explícitamente.
Luego deje que eclipse haga el resto usando "organizar importaciones". Ctrl-1
Sugerencia: para evitar ambigüedades, configure el classpath sin más de las librerías necesarias. Para cerca de 800 clases terminé en 2 horas.
- O consigue a alguien que lo merezca para hacer este trabajo.
EDITAR: Debe saber que en Preferencias / Java / Editor / Guardar acciones, Organizar las importaciones se puede configurar como acción de guardar.
Para un solo tipo, eclipse ofrece la acción ''Agregar importación'' (Shift + Ctrl + M). Hace exactamente lo que quiere, con la gran y gran limitación: tiene que colocar el cursor en un tipo y solo afectará la aparición "seleccionada".
Pero tal vez esta acción se puede utilizar en un método global / con script. Un complemento JDT podría rastrear a través del AST y llamar a esta acción en cada tipo que encuentre.
Probablemente necesites reemplazar todos los javax.swing.
. Entonces organiza las importaciones.
Tuve el mismo problema con los archivos generados por ejes, y escribí un pequeño script para hacer esto. No hago todo (tienes que usar las importaciones organizadas en eclipse después de ejecutarlo), y no lo he probado muy bien, así que utilízalo con cuidado. También se limita a los nombres de paquetes en minúsculas y los nombres de las clases en camello, pero puede ser un buen punto de partida
def replaceExplicitPackageNamesInFile(File javaFile){
eol = org.codehaus.groovy.tools.Utilities.eol()
newFile = ""
explicitImportExpr = /([^/w])(([a-z0-9]+/.)+)([A-Z][a-zA-Z0-9]+)/
imports = ""
javaFile.eachLine {
line = it.replaceAll(explicitImportExpr, {
Object [] match ->
imports += "import ${match[2]+match[-1]};${eol}"
match[1]+match[-1]
})
newFile += line+"${eol}"
}
newFile2 = ""
newFile.eachLine { line ->
newFile2 +=
line.replaceAll(/(^/s*package.*$)/, {
Object [] match ->
match[0] + eol + imports
} ) + eol
}
javaFile.setText(newFile2)
}
def replaceExplicitPackageNamesInDir(File dir){
dir.eachFileRecurse {
if (it.isFile() && it.name ==~ /.*/.java/z/){
println "Processing ${it.absolutePath - dir.absolutePath}"
replaceExplicitPackageNamesInFile(it)
}
}
}
Uso un plugin de Eclipse de Michael Ernst que hace lo que quieres. Convierte referencias como java.util.Collection
a Collection
con la adición de una import java.util.Collection;
en la parte superior del archivo.
De hecho, es lo mismo que usar "Fuente -> Agregar importación" para una referencia completamente calificada, excepto que le permite hacerlo para un archivo .java completo a la vez.
Aún mejor, le permite procesar por lotes todos los archivos .java que ha seleccionado en el Explorador de paquetes. Simplemente haga clic con el botón derecho en la selección y seleccione "Fuente -> Limpiar declaraciones de tipo calificadas" del menú contextual.
Sitio de actualización de Eclipse: http://cqtp.sourceforge.net/eclipse/
Este hilo dice:
seleccione la vista del explorador de paquetes, haga clic derecho en su proyecto, elija la fuente y luego organice las importaciones. Bobs tu tío - se eliminan todas las importaciones no deseadas
Para hacerlo mejor formateado:
Right click project > Source > Organize imports
Ahora, lo que queda, es encontrar una manera de quitar los nombres completos del código. Puedes pensar en alguna expresión regular. Echa un vistazo a esta biblioteca - parece útil. Este artículo también debería ser útil.