コードインテリジェンス開発ガイドライン
GitLab 13.1で導入されました。
このドキュメントでは、Code Intelligenceの設計について説明します。
GitLab にビルトインされた Code Intelligence はLSIF を利用しており、CI ジョブでプロジェクトの LSIF ドキュメントを生成し、データを処理して CI アーティファクトとしてアップロードし、プロジェクト内のファイルの情報を表示します。
以下はLSIFアーティファクトをアップロードするためのシーケンス図です:
-
CI/CDジョブは、プロジェクトの言語用のインデクサを使用して、LSIFフォーマット(通常は
dump.lsif
)のドキュメントを生成します。このフォーマットは、メソッドや関数とその定義や参照との間の相互作用を記述します。このドキュメントは、LSIFレポートアーティファクトとして保存されるようにマークされます。 -
アーティファクトの保存要求を受け取ると、WorkhorseはGitLab Railsにアップロードの承認を求めます。
-
GitLab Railsはアーティファクトをアップロードできるかどうかを検証し、LSIFアーティファクトを処理できる場合は
ProcessLsif: true
ヘッダを送信します。 -
Workhorse は LSIF ドキュメントを一行ずつ読み込み、プロジェクト内の各ファイルのコードインテリジェンスデータを生成します。出力はプロジェクトの構造を模したJSONファイルのzipディレクトリです:
プロジェクト
app controllers application_controller.rb models application.rb
生成されたデータ
app controllers application_controller.rb.json models application.rb.json
-
zip圧縮されたディレクトリはZIPアーティファクトとして保存されます。WorkhorseはオリジナルのLSIFドキュメントをZIPアーティファクト内のJSONファイルのセットに置き換え、メタデータを生成します。このメタデータにより、ファイル全体を解凍したり読み込んだりすることなく、ZIPファイル内の単一のファイルを表示できるようになります。これにより、1つのファイルのコード・インテリジェンス・データにアクセスできるようになります。
-
GitLabアプリケーションでファイルが表示されると、フロントエンドはそのファイルのコードインテリジェンスデータをオブジェクトストレージから直接取得します。ファイルには、ファイル内のコードユニットに関する情報が含まれています。例えば
[ { "definition_path": "cmd/check/main.go#L4", "hover": [ { "language": "go", "tokens": [ [ { "class": "kn", "value": "package" }, { "value": " " }, { "class": "s", "value": "\"fmt\"" } ] ] }, { "value": "Package fmt implements formatted I/O with functions analogous to C's printf and scanf. The format 'verbs' are derived from C's but are simpler. \n\n### hdr-PrintingPrinting\nThe verbs: \n\nGeneral: \n\n```\n%v\tthe value in a default format\n\twhen printing st..." } ], "start_char": 2, "start_line": 33 } ... ]