コードインテリジェンス開発ガイドライン
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 } ... ]
