코드 인텔리전스 개발 가이드라인
이 문서는 코드 인텔리전스의 디자인을 설명합니다.
GitLab의 내장 코드 인텔리전스는 LSIF에 의해 제공되며, CI 작업에서 프로젝트에 대한 LSIF 문서를 생성하고, 데이터를 처리하고, CI 아티팩트로 업로드하며, 프로젝트의 파일에 대한 이 정보를 표시하는 것으로 요약됩니다.
다음은 LSIF 아티팩트를 업로드하는 과정 다이어그램입니다:
-
CI/CD 작업은 프로젝트의 언어를 위한 인덱서를 사용하여 LSIF 형식(일반적으로
dump.lsif
)의 문서를 생성합니다. 이 형식은 method 또는 function과 그 정의 또는 참조 간의 상호작용을 설명합니다. 문서는 LSIF 보고서 아티팩트로 저장되도록 표시됩니다. -
아티팩트를 저장하는 요청을 받은 후, Workhorse는 GitLab Rails에 업로드를 승인하도록 요청합니다.
-
GitLab Rails는 아티팩트를 업로드할 수 있는지 검증하고, LSIF 아티팩트를 처리할 수 있는 경우
ProcessLsif: true
헤더를 보냅니다. -
Workhorse는 LSIF 문서를 한 줄씩 읽고 프로젝트의 각 파일에 대한 코드 인텔리전스 데이터를 생성합니다. 출력은 프로젝트 구조를 모방한 JSON 파일의 압축 디렉토리입니다:
프로젝트:
app controllers application_controller.rb models application.rb
생성된 데이터:
app controllers application_controller.rb.json models application.rb.json
-
압축된 디렉토리는 ZIP 아티팩트로 저장됩니다. Workhorse는 원래 LSIF 문서를 ZIP 아티팩트의 JSON 파일 세트로 교체하고, 메타데이터를 생성합니다. 메타데이터는 전체 파일을 압축 해제하거나 로드하지 않고도 ZIP 파일에서 단일 파일을 볼 수 있게 해줍니다. 이를 통해 단일 파일에 대한 코드 인텔리전스 데이터에 접근할 수 있습니다.
-
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 } ... ]