本文へスキップ
cd /languages
  • 長寿のデスクトップ
  • プログラミング
  • AST・シンボル対応

MaguyvaのPascal・Delphi対応: ユニットとクラスのグラフ

MaguyvaはAST、シンボル、グラフでPascalとDelphiのユニットに対応しています。AIエージェントは変更前にuses句、クラス、プロシージャをマッピングできます。

Pascalのコードベースにまずマップが必要な理由

DelphiやFree Pascalのアプリケーションは、ほかのすべてが使ういくつかの大きなユニットを中心に育つことがよくあります。フォームは基底フォームを、コンポーネントは基底コンポーネントを継承し、業務ルールは十数個の画面から呼ばれるプロシージャに置かれています。ファイル単位では読みやすくても、変更がうまくいかなくなるのは依存関係の部分です。

Maguyvaはまずエージェントにユニットとクラスの構造を渡すため、何かを書く前に、変更がどこに影響するかを示せます。

MaguyvaがPascalで抽出するもの

Maguyvaは .pas と .pp のソースユニットに対応しています。プロシージャと関数の定義は呼び出し可能なシンボルとして抽出され、定義名からは procedure、function、var、const のキーワードが取り除かれます。クラスとインターフェースは、構造検索で型定義として選択できます。

インポートは uses 句から作られ、キーワードを取り除いてユニット名をグラフに保存します。呼び出しは、メンバーの接頭辞、引数、囲みの括弧を取り除いて正規化されるため、Self.Save(x) と書かれた呼び出しは Save として保存されます。

グラフには、呼び出し、継承、インターフェース実装、オーバーライド、インスタンス化、型参照、読み取りと書き込み、例外の送出とハンドラーのエッジが記録されます。約107個のランタイムライブラリのルーチン(WriteLn、ReadLn、Inc、Dec、Ord など)は関係性から除外されます。

エージェントへのプロンプト例

  • 「DataModuleMain を使うユニットはどれで、そこから何を呼び出しているか?」(dependency_search の incoming)
  • 「TBaseEditForm を継承するフォームはどれで、どのメソッドをオーバーライドしているか?」(find_symbol、次に dependency_search)
  • 「ボタンのハンドラーからデータベースユニットまで、請求書がどのように計上されるかを説明して。」(get_task_context)

既知の制限

  • Pascalに対応付けられているのは .pas と .pp だけです。.dpr や .dfm のようなDelphiのプロジェクトファイルやフォームファイルは拡張子リストに含まれていないため、フォームのレイアウトやプロジェクトの構成はグラフの対象外です。
  • メソッドは通常のプロシージャと同じ構文を使うため、structural_search の methods プリセットは何も選択しません。functions プリセットを使ってください。
  • 除外されたランタイムライブラリのルーチンへの呼び出しは、グラフのエッジとして現れません。それらには text_pattern_search を使ってください。

次のステップ

クイックスタートでリポジトリを接続し、互換性ページで対応マトリクスを確認してください。アプリケーションがCのライブラリをリンクしている場合は、Cガイドもご覧ください。

最適な用途

  • > 元の作者がすでに離れたDelphiやLazarus/Free Pascalのアプリケーションを保守するチーム。
  • > 深いクラス階層、インターフェース、大きな共有ユニットを持つObject Pascalのコードベース。
  • > 最初の成果物がユニットとその依存関係のマップになる、モダナイゼーションや移植の作業。

エージェントワークフロー

  • > 共有ユニットを変更する前に、それを `uses` 句に挙げているユニットをすべて一覧にする。
  • > 基底フォームや基底コンポーネントを継承するクラスと、それらがオーバーライドするメソッドを見つける。
  • > ルーチンのパラメーターを変更する前に、それを呼び出すプロシージャを追跡する。

エンジンの詳細

  • > Pascalの対応は `.pas` と `.pp` のユニットを含みます。`.dpr` や `.dfm` のようなDelphiのプロジェクトファイルやフォームファイルは拡張子リストに含まれていません。
  • > `uses` 句はインポートの関係になり、呼び出しはメンバーの接頭辞、引数、囲みの括弧を取り除いて正規化されます。
  • > `WriteLn`、`Inc`、`Ord` など約107個のランタイムライブラリのルーチンは関係性から除外されるため、アプリケーションのコードが際立ちます。

役立つMCPエントリーポイント

  • find_symbol

    定義と参照が必要なときに、クラス、フォーム、プロシージャの名前で使ってください。

  • dependency_search

    共有ユニットや基底クラスに対してincomingのトラバーサルを使い、どのユニットや派生クラスが依存しているかを確認してください。

  • get_task_context

    「ボタンのハンドラーからデータベースユニットまで、請求書がどのように計上されるかを説明して」のようなプロンプトに使ってください。