Mon hard fork de JEDI Code Formatter CLI de Bee Jay, qui est lui-même un fork de Lazarus JCF, que j'ai légèrement amélioré avec une meilleure indentation et une prise en charge indispensable pour les déclarations de variables Delphi modernes. Il était vraiment difficile de se déplacer dans son code ancien, complexe et presque totalement non documenté. Pourtant, j’ai réussi à mettre en œuvre ce que je voulais. Il est tout simplement difficile de l'étendre ou de l'améliorer étant donné à quel point le code source d'entrée peut être délicat et à quel point il est difficile de cibler des cas extrêmes individuels dans l'AST sans casser quelque chose d'autre quelque part. À l'avenir, il serait préférable de passer à un formateur qui ne nécessite pas une analyse approfondie de la source.
(L'extension VSCode mise à jour qui fonctionne avec cette version est également disponible, pull request.)
Les changements incluent :
Prise en charge des déclarations de variables en ligne Delphi :
var I: Integer := 10 ;
Avec inférence de type :
var I := 42 ;
À l'intérieur for
la déclaration :
for var I := Low (myArray) to High (myArray) do
Les fichiers source avec des variables en ligne ne provoquent plus l'échec du formateur.
Nouvelle option IndentCaseLabels
pour contrôler l'indentation des instructions d'étiquette case
indépendamment de l'ensemble du bloc case
. Par exemple, avec IndentCaseLabels
défini sur True
(par défaut) :
case i of
1 .. 9 :
for i := 1 to i do write(i, ' , ' );
10 : begin
writeln;
writeln;
end ;
else
myProcedure;
end ;
Avec IndentCaseLabels
défini sur False
:
case i of
1 .. 9 :
for i := 1 to i do write(i, ' , ' );
10 : begin
writeln;
writeln;
end ;
else
myProcedure;
end ;
Nouvelle option IndentMethodParams
, il est donc possible d'écrire des paramètres de méthode comme celui-ci ( IndentMethodParams
défini sur False
) :
function myFunction (aParam: string
; aParam2: real): boolean;
Et évitez que la deuxième ligne soit en retrait. Sinon (défini sur True
) :
function myFunction (aParam: string
; aParam2: real): boolean;
Nouvelle option IndentInterfaceGuid
pour empêcher l’indentation du GUID de l’interface. Définir sur True
:
IFace = interface
[ ' {5E3C2BCA-56C8-46DE-959F-338AF5F69C1A} ' ]
procedure proc ;
end ;
Définir sur False
:
IFace = interface
[ ' {5E3C2BCA-56C8-46DE-959F-338AF5F69C1A} ' ]
procedure proc ;
end ;
Formatter traite désormais correctement les fins de ligne dans les commentaires et évite également de formater les instructions de contrôle avec des commentaires entre elles.
Le code source du formateur a été traité par le formateur lui-même pour valider le bon fonctionnement « dans la nature ».
Sauf si j'ai oublié quelque chose, toutes mes modifications sont « étiquetées » avec // fix:
comments.
Les binaires sont disponibles. La version Windows 64 bits provient de FPC. La version Windows 32 bits est construite avec Delphi. Les autres systèmes d'exploitation devraient être construits avec peu ou pas de modifications.
Comment tester :
pascal-format -config=pascal-format.new.cfg -out test.fmt.pas test.pas
À FAIRE : avec l'interface graphique désormais supprimée, le débogage de l'AST analysé est impossible, à moins de le faire par essais et erreurs. La vue AST doit être réécrite pour être affichée sous forme textuelle ou, mieux encore, simplement recréée en LCL (mais sans prise en charge de Delphi). Cela devrait être assez simple à faire étant donné qu’il ne s’agit essentiellement que d’une arborescence sur un formulaire vide.
Voilà donc au cas où quelqu'un d'autre voudrait perdre son temps et continuer à essayer de rendre cette chose plus intelligente.
La description originale suit.
J'ai (Bee Jay) pris Jedi Code Formatter (JCF) du référentiel Lazarus IDE et l'ai créé en version CLI (interface de ligne de commande) en supprimant toutes les parties GUI (interface utilisateur graphique) de la version GUI originale. La version CLI peut être utilisée comme formateur de code Pascal dans Visual Studio Code, ou comme moteur backend d'un embellisseur de code Pascal en ligne.
Original : une copie (parfois modifiée) de l'arborescence svn r823 jcf2 : https://jedicodeformat.svn.sourceforge.net/svnroot/jedicodeformat/trunk/CodeFormat/Jcf2
Auteur original : Anthony Steele.
Licence originale : MPL 1.1.
jcf-pascal-format
dans votre propre dossier.pascal_format.lpi
dans le dossier jcf-pascal-format/App
.pascal-format
du dossier jcf-pascal-format
avec le fichier de configuration pascal-format.cfg
../pascal-format -?
commande. Il devrait montrer le manuel d'utilisation. jcf-pascal-format
dans votre propre dossier.pascal_format.lpi
dans le dossier jcf-pascal-format/App
.test.pas
à partir du dossier jcf-pascal-format
.JCF
en utilisant Tâches → Exécuter la tâche... → format pascal : menu Test CLI Program et vous devriez voir le résultat dans le fichier test.pas
. pascal-format
et pascal-format.cfg
dans votre dossier d'espace de travail Pascal.tasks.json
si vous en avez déjà un.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 par -obfuscate
.tasks.json
. Vous devriez maintenant avoir les tâches du nouveau format pascal dans votre liste de tâches. Bien que JCF soit un bon formateur de code Pascal, il présente un seul problème assez ennuyeux. JCF exige que le code soit compilable, ce qui signifie qu'il doit s'agir d'un programme complet et syntaxiquement correct. JCF échouera en cas d'extraits de code ou de code erroné. Pour que cela fonctionne sur un extrait de code, il doit être placé entre une paire begin..end
et avoir un en-tête program
correct, comme ceci :
program test;
begin
// put code snippet here
end .
Voici JCF CLI en action dans VS Code (avec OmniPascal) :
Remarque : Si vous êtes également intéressé par mes autres tâches présentées dans la démo, consultez mon résumé ici.
J'espère que cela sera utile à d'autres boursiers Pascal. Amusez-vous! ?