Mein Hard Fork von JEDI Code Formatter CLI von Bee Jay, der selbst ein Fork von Lazarus JCF ist, den ich leicht verbessert habe, mit besserer Einrückung und dringend benötigter Unterstützung für moderne Delphi-Variablendeklarationen. Es war wirklich schwierig, sich in seinem alten, komplexen und fast vollständig undokumentierten Code zurechtzufinden. Dennoch gelang es mir, das umzusetzen, was ich wollte. Es lässt sich einfach kaum noch erweitern oder verbessern, wenn man bedenkt, wie knifflig Eingabequellcode sein kann und wie schwierig es ist, einzelne Randfälle im AST anzusprechen, ohne irgendwo etwas anderes kaputt zu machen. In Zukunft wäre es besser, auf einen Formatierer umzusteigen, der kein tiefgreifendes Parsen der Quelle erfordert.
(Die aktualisierte VSCode-Erweiterung, die mit dieser Version funktioniert, ist ebenfalls verfügbar, Pull-Anfrage.)
Zu den Änderungen gehören:
Unterstützung für Delphi-Inline-Variablendeklarationen:
var I: Integer := 10 ;
Mit Typinferenz:
var I := 42 ;
Innen for
Aussage:
for var I := Low (myArray) to High (myArray) do
Quelldateien mit Inline-Variablen führen nicht mehr dazu, dass das Formatierungsprogramm fehlschlägt.
Neue Option IndentCaseLabels
um die Einrückung von case
Label-Anweisungen unabhängig vom gesamten case
-Block zu steuern. Beispiel: Wenn IndentCaseLabels
auf True
(Standard) gesetzt ist:
case i of
1 .. 9 :
for i := 1 to i do write(i, ' , ' );
10 : begin
writeln;
writeln;
end ;
else
myProcedure;
end ;
Wenn IndentCaseLabels
auf False
gesetzt ist:
case i of
1 .. 9 :
for i := 1 to i do write(i, ' , ' );
10 : begin
writeln;
writeln;
end ;
else
myProcedure;
end ;
Neue Option IndentMethodParams
, sodass es möglich ist, Methodenparameter wie diesen zu schreiben ( IndentMethodParams
auf False
gesetzt ):
function myFunction (aParam: string
; aParam2: real): boolean;
Und vermeiden Sie, dass die zweite Zeile eingerückt wird. Andernfalls (auf True
gesetzt):
function myFunction (aParam: string
; aParam2: real): boolean;
Neue Option IndentInterfaceGuid
um zu verhindern, dass die Schnittstellen-GUID eingerückt wird. Auf True
setzen:
IFace = interface
[ ' {5E3C2BCA-56C8-46DE-959F-338AF5F69C1A} ' ]
procedure proc ;
end ;
Auf False
setzen:
IFace = interface
[ ' {5E3C2BCA-56C8-46DE-959F-338AF5F69C1A} ' ]
procedure proc ;
end ;
Das Formatierungsprogramm verarbeitet Zeilenenden innerhalb von Kommentaren jetzt korrekt und vermeidet außerdem die Formatierung von Steueranweisungen mit dazwischen liegenden Kommentaren.
Der Quellcode des Formatierers wurde durch den Formatierer selbst verarbeitet, um die korrekte Funktion „in freier Wildbahn“ zu validieren.
Sofern ich nichts vergessen habe, sind alle meine Änderungen mit // fix:
comments „getaggt“.
Binärdateien sind verfügbar. Der 64-Bit-Windows-Build stammt von FPC. Die 32-Bit-Windows-Version wurde mit Delphi erstellt. Andere Betriebssysteme sollten mit geringen bis keinen Änderungen erstellt werden.
So testen Sie:
pascal-format -config=pascal-format.new.cfg -out test.fmt.pas test.pas
TODO: Da die GUI jetzt entfernt ist, ist das Debuggen des analysierten AST nicht möglich, es sei denn, dies geschieht durch Versuch und Irrtum. Die AST-Ansicht muss neu geschrieben werden, um sie in Textform auszugeben, oder, noch besser, einfach in LCL neu erstellt werden (jedoch ohne Delphi-Unterstützung). Sollte recht einfach zu bewerkstelligen sein, da es sich im Grunde nur um eine Baumansicht auf einem leeren Formular handelt.
Hier ist es also für den Fall, dass jemand anderes seine Zeit verschwenden und weiterhin versuchen möchte, dieses Ding intelligenter zu machen.
Originalbeschreibung folgt.
Ich (Bee Jay) habe Jedi Code Formatter (JCF) aus dem Lazarus IDE-Repository genommen und daraus eine CLI-Version (Befehlszeilenschnittstelle) erstellt, indem ich alle GUI-Teile (grafische Benutzeroberfläche) aus der ursprünglichen GUI-Version entfernt habe. Die CLI-Version kann als Pascal-Code-Formatierer in Visual Studio Code oder als Backend-Engine eines Online-Pascal-Code-Verschönerers verwendet werden.
Original: eine Kopie (manchmal modifiziert) des r823 jcf2 SVN-Baums: https://jedicodeformat.svn.sourceforge.net/svnroot/jedicodeformat/trunk/CodeFormat/Jcf2
Ursprünglicher Autor: Anthony Steele.
Originallizenz: MPL 1.1.
jcf-pascal-format
oder laden Sie es in Ihren eigenen Ordner herunter.pascal_format.lpi
im Ordner jcf-pascal-format/App
.pascal-format
aus dem Ordner jcf-pascal-format
zusammen mit der Konfigurationsdatei pascal-format.cfg
../pascal-format -?
Befehl. Es sollte die Bedienungsanleitung zeigen. jcf-pascal-format
oder laden Sie es in Ihren eigenen Ordner herunter.pascal_format.lpi
im Ordner jcf-pascal-format/App
.test.pas
aus dem Ordner jcf-pascal-format
.JCF
-Programm über das Menü „Aufgaben“ → „Aufgabe ausführen ... “ → „pascal-format: Test CLI Program“. Das Ergebnis sollte in der Datei test.pas
angezeigt werden. pascal-format
und pascal-format.cfg
in Ihren Pascal-Arbeitsbereichsordner.tasks.json
falls Sie bereits eine haben.tasks.json
ein. {
"label" : " JCF: Beautify Code " ,
"type" : " shell " ,
"command" : " ./pascal-format " ,
"args" : [
" ${file} " ,
" -clarify " ,
" -inplace " ,
" -config=pascal-format.xml "
],
"presentation" : {
"reveal" : " never "
},
"problemMatcher" : []
},
-clarify
arg in -obfuscate
.tasks.json
. Jetzt sollten Sie die Aufgaben des neuen Pascal-Formats in Ihrer Aufgabenliste haben. Obwohl JCF ein guter Pascal-Codeformatierer ist, gibt es ein einziges Problem, das ziemlich nervig ist. JCF verlangt, dass der Code kompilierbar sein muss, was bedeutet, dass es sich um ein vollständiges Programm und syntaktisch korrekt handeln muss. JCF schlägt bei Codeausschnitten oder falschem Code fehl. Damit es mit dem Codeausschnitt funktioniert, muss er zwischen einem begin..end
-Paar eingefügt werden und über einen korrekten program
verfügen, etwa so:
program test;
begin
// put code snippet here
end .
Hier ist die JCF-CLI in Aktion in VS Code (mit OmniPascal):
Hinweis: Wenn Sie auch an meinen anderen in der Demo gezeigten Aufgaben interessiert sind, sehen Sie sich hier meinen Kerninhalt an.
Ich hoffe, es wird für andere Pascal-Kollegen da draußen nützlich sein. Viel Spaß! ?