Mi bifurcación dura de JEDI Code Formatter CLI de Bee Jay, que a su vez es una bifurcación de Lazarus JCF, que mejoré ligeramente con una mejor sangría y un soporte muy necesario para las declaraciones de variables modernas de Delphi. Era realmente difícil entender su código antiguo, complejo y casi completamente indocumentado. Aún así, logré implementar lo que quería. Difícilmente se puede ampliar o mejorar más dado lo complicado que puede ser el código fuente de entrada y lo difícil que es apuntar a casos extremos individuales en el AST sin romper algo más en alguna parte. En el futuro, sería mejor cambiar a un formateador que no requiera un análisis profundo de la fuente.
(La extensión VSCode actualizada que funciona con esta versión también está disponible, solicitud de extracción).
Los cambios incluyen:
Soporte para declaraciones de variables en línea de Delphi:
var I: Integer := 10 ;
Con inferencia de tipos:
var I := 42 ;
Interior for
declaración:
for var I := Low (myArray) to High (myArray) do
Los archivos de origen con variables en línea ya no provocan errores en el formateador.
Nueva opción IndentCaseLabels
para controlar la sangría de las declaraciones de etiquetas de case
independientemente de todo el bloque case
. Por ejemplo, con IndentCaseLabels
configurado en True
(predeterminado):
case i of
1 .. 9 :
for i := 1 to i do write(i, ' , ' );
10 : begin
writeln;
writeln;
end ;
else
myProcedure;
end ;
Con IndentCaseLabels
configurado en False
:
case i of
1 .. 9 :
for i := 1 to i do write(i, ' , ' );
10 : begin
writeln;
writeln;
end ;
else
myProcedure;
end ;
Nueva opción IndentMethodParams
, por lo que es posible escribir parámetros de método como este ( IndentMethodParams
establecido en False
):
function myFunction (aParam: string
; aParam2: real): boolean;
Y evite sangrar la segunda línea. De lo contrario (establecido en True
):
function myFunction (aParam: string
; aParam2: real): boolean;
Nueva opción IndentInterfaceGuid
para evitar que se aplique sangría al GUID de la interfaz. Establecer en True
:
IFace = interface
[ ' {5E3C2BCA-56C8-46DE-959F-338AF5F69C1A} ' ]
procedure proc ;
end ;
Establecer en False
:
IFace = interface
[ ' {5E3C2BCA-56C8-46DE-959F-338AF5F69C1A} ' ]
procedure proc ;
end ;
El formateador ahora procesa correctamente los finales de línea dentro de los comentarios y también evita formatear declaraciones de control con comentarios entre ellos.
El código fuente del formateador se ha procesado a través del propio formateador para validar la función correcta "en la naturaleza".
A menos que haya olvidado algo, todos mis cambios están "etiquetados" con // fix:
comentarios.
Los binarios están disponibles. La compilación de Windows de 64 bits es de FPC. La versión de Windows de 32 bits está construida con Delphi. Otros sistemas operativos deberían construirse con pocos o ningún cambio.
Cómo probar:
pascal-format -config=pascal-format.new.cfg -out test.fmt.pas test.pas
TODO: con la GUI ahora eliminada, la depuración del AST analizado es imposible, a menos que se haga mediante prueba y error. La vista AST debe reescribirse para generarse en forma textual o, mejor aún, simplemente rehacerse en LCL (pero sin soporte de Delphi). Debería ser bastante sencillo de hacer dado que básicamente es solo una vista de árbol en un formulario vacío.
Así que aquí está en caso de que alguien más quiera perder el tiempo y seguir intentando hacer esto más inteligente.
A continuación se incluye la descripción original.
Yo (Bee Jay) tomé Jedi Code Formatter (JCF) del repositorio IDE de Lazarus y lo hice como una versión CLI (interfaz de línea de comando) eliminando todas las partes de la GUI (interfaz gráfica de usuario) de la versión GUI original. La versión CLI se puede utilizar como formateador de código Pascal en Visual Studio Code o como motor backend de un embellecedor de código Pascal en línea.
Original: una copia (a veces modificada) del árbol svn r823 jcf2: https://jedicodeformat.svn.sourceforge.net/svnroot/jedicodeformat/trunk/CodeFormat/Jcf2
Autor original: Anthony Steele.
Licencia original: MPL 1.1.
jcf-pascal-format
en tu propia carpeta.pascal_format.lpi
dentro de la carpeta jcf-pascal-format/App
.pascal-format
de la carpeta jcf-pascal-format
junto con el archivo de configuración pascal-format.cfg
../pascal-format -?
dominio. Debería mostrar el manual de uso. jcf-pascal-format
en tu propia carpeta.pascal_format.lpi
dentro de la carpeta jcf-pascal-format/App
.test.pas
de la carpeta jcf-pascal-format
.JCF
usando Tareas → Ejecutar tarea... → formato pascal: menú Pruebe el programa CLI y debería ver el resultado en el archivo test.pas
. pascal-format
y pascal-format.cfg
en la carpeta de su espacio de trabajo de Pascal.tasks.json
si ya tiene una.tasks.json
. {
"label" : " JCF: Beautify Code " ,
"type" : " shell " ,
"command" : " ./pascal-format " ,
"args" : [
" ${file} " ,
" -clarify " ,
" -inplace " ,
" -config=pascal-format.xml "
],
"presentation" : {
"reveal" : " never "
},
"problemMatcher" : []
},
-clarify
arg a -obfuscate
.tasks.json
. Ahora debería tener nuevas tareas en formato Pascal en su lista de tareas. Aunque JCF es un buen formateador de código Pascal, tiene un único problema que es bastante molesto. JCF requiere que el código sea compilable, lo que significa que debe ser un programa completo y sintácticamente correcto. JCF fallará en fragmentos de código o código incorrecto. Para que funcione en un fragmento de código, debe colocarse entre un par de begin..end
y tener un encabezado program
correcto, como este:
program test;
begin
// put code snippet here
end .
Aquí está JCF CLI en acción dentro de VS Code (con OmniPascal):
Nota: Si también está interesado en mis otras tareas que se muestran en la demostración, consulte lo esencial al respecto aquí.
Espero que sea útil para otros compañeros de Pascal. ¡Divertirse! ?