Bee Jay の JEDI Code Formatter CLI のハード フォークです。これ自体は Lazarus JCF のフォークですが、インデントを改善し、最新の Delphi 変数宣言に必要なサポートを追加して少し改良しました。古くて複雑で、ほとんど文書化されていないコードを回避するのは非常に困難でした。それでも、なんとか希望通りの内容を実現することができました。入力ソース コードがいかにトリッキーであるか、どこかで何かを壊さずに AST の個々のエッジ ケースをターゲットにすることがいかに難しいかを考えると、これ以上拡張したり改善したりすることはほとんどできません。将来的には、ソースの詳細な解析を必要としないフォーマッタに切り替えることをお勧めします。
(このバージョンで動作する更新された VSCode 拡張機能もプル リクエストで入手できます。)
変更内容は次のとおりです。
Delphi インライン変数宣言のサポート:
var I: Integer := 10 ;
型推論を使用する場合:
var I := 42 ;
for
ステートメント内:
for var I := Low (myArray) to High (myArray) do
インライン変数を含むソース ファイルによってフォーマッタが失敗することがなくなりました。
新しいオプションIndentCaseLabels
case
ブロック全体から独立してcase
ラベル ステートメントのインデントを制御します。たとえば、 IndentCaseLabels
True
(デフォルト) に設定すると、次のようになります。
case i of
1 .. 9 :
for i := 1 to i do write(i, ' , ' );
10 : begin
writeln;
writeln;
end ;
else
myProcedure;
end ;
IndentCaseLabels
False
に設定した場合:
case i of
1 .. 9 :
for i := 1 to i do write(i, ' , ' );
10 : begin
writeln;
writeln;
end ;
else
myProcedure;
end ;
新しいオプションIndentMethodParams
により、次のようにメソッド パラメーターを記述することができます ( IndentMethodParams
False
に設定)。
function myFunction (aParam: string
; aParam2: real): boolean;
また、2 行目のインデントは避けてください。それ以外の場合 ( True
に設定):
function myFunction (aParam: string
; aParam2: real): boolean;
インターフェイス GUID がインデントされるのを防ぐための新しいオプションIndentInterfaceGuid
。 True
に設定します。
IFace = interface
[ ' {5E3C2BCA-56C8-46DE-959F-338AF5F69C1A} ' ]
procedure proc ;
end ;
False
に設定:
IFace = interface
[ ' {5E3C2BCA-56C8-46DE-959F-338AF5F69C1A} ' ]
procedure proc ;
end ;
フォーマッタは、コメント内の行末を正しく処理し、間にコメントが含まれる制御ステートメントの書式設定を回避するようになりました。
フォーマッタのソース コードは、フォーマッタ自体によって処理され、「実際に」正しい機能が検証されています。
何かを忘れない限り、すべての変更には// fix:
コメントが「タグ付け」されます。
バイナリが利用可能です。 64 ビット Windows ビルドは FPC からのものです。 32 ビット Windows バージョンは Delphi で構築されています。他のオペレーティング システムでは、ほとんど変更を加えずに構築できます。
テスト方法:
pascal-format -config=pascal-format.new.cfg -out test.fmt.pas test.pas
TODO: GUI が削除されたため、試行錯誤で行わない限り、解析された AST をデバッグすることは不可能です。 AST ビューをテキスト形式で出力するように書き直すか、できれば LCL で単純に作り直す必要があります (ただし、Delphi サポートはありません)。基本的に空のフォーム上の単なるツリービューであることを考えると、非常に簡単に実行できるはずです。
したがって、他の誰かが時間を無駄にして、これをよりスマートにしようと試み続けたい場合に備えて、ここで説明します。
元の説明は次のとおりです。
私 (Bee Jay) は、Lazarus IDE リポジトリから Jedi Code Formatter (JCF) を取得し、元の GUI バージョンから GUI (グラフィカル ユーザー インターフェイス) 部分をすべて削除して CLI (コマンド ライン インターフェイス) バージョンとして作成しました。 CLI バージョンは、Visual Studio Code の Pascal コード フォーマッタとして、またはオンライン Pascal コード ビューティファイアのバックエンド エンジンとして使用できます。
オリジナル: r823 jcf2 svn ツリーのコピー (場合によっては変更): https://jedicodeformat.svn.sourceforge.net/svnroot/jedicodeformat/trunk/CodeFormat/Jcf2
原作者はアンソニー・スティール。
元のライセンス: MPL 1.1。
jcf-pascal-format
GitHub リポジトリを独自のフォルダーに複製またはダウンロードします。jcf-pascal-format/App
フォルダー内のpascal_format.lpi
プロジェクトを開きます。jcf-pascal-format
フォルダーから実行可能なpascal-format
ファイルをpascal-format.cfg
構成ファイルとともに取得します。./pascal-format -?
を使用してテストしてください。指示。使用説明書が表示されるはずです。 jcf-pascal-format
GitHub リポジトリを独自のフォルダーに複製またはダウンロードします。jcf-pascal-format/App
フォルダー内のpascal_format.lpi
プロジェクトを開きます。jcf-pascal-format
フォルダーからtest.pas
ファイルを開きます。JCF
プログラムをテストすると、 test.pas
ファイルに結果が表示されます。 pascal-format
およびpascal-format.cfg
構成ファイルを Pascal ワークスペース フォルダーにコピーします。tasks.json
が既にある場合は開きます。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 を-obfuscate
に変更します。tasks.json
保存します。これで、タスク リストに新しい Pascal 形式のタスクが表示されるはずです。 JCF は優れた Pascal コード フォーマッタですが、非常に厄介な問題が 1 つあります。 JCF では、コードがコンパイル可能である必要があります。これは、コードが完全なプログラムであり、構文的に正しい必要があることを意味します。 JCF はコード スニペットまたは間違ったコードで失敗します。コード スニペットで機能させるには、次のようにbegin..end
ペアの間に配置し、正しいprogram
ヘッダーを持たせる必要があります。
program test;
begin
// put code snippet here
end .
以下は、VS Code 内で動作する JCF CLI (OmniPascal を使用) です。
注:デモに示されている他のタスクにも興味がある場合は、ここでその要点を参照してください。
他の Pascal 仲間にとっても役立つことを願っています。楽しむ! ?