Как `clangd` узнает, где находится определение функции, когда был проиндексирован только один файл?

#clang #llvm #language-server-protocol #clangd

#clang #llvm #язык-сервер-протокол #clangd

Вопрос:

Как clangd узнать, где находится определение функции, если только один файл был проиндексирован через сообщение LSP (Language Server Protocol) textDocument/didOpen ?

Этот вопрос основан на предположении, что нет compile_commands.json файла для clangd работы.

Насколько мне известно, clangd будет частично индексировать(?) данный файл при clangd получении сообщения LSP textDocument/didOpen без compile_commands.json файла в рабочей области (?).

Таким образом, индекс частично проиндексированного файла будет находиться только в памяти.

Итак, как clangd известно об определениях за пределами частично проиндексированного файла, когда он не знает ни о каких внешних файлах?

Или он знает?

Или он получает информацию о других файлах с помощью некоторой эвристики, которая просматривает относительный путь или включает ( #include "<filename.hpp>" ), которые находятся только в каталогах root-project-dir/src и им подобных?

Комментарии:

1. Поскольку это плохо документировано, лучшим способом может быть отладка в исходном коде.

2. У меня были споры обо всем этом как с LSP, так и с Clangd. Clangd открывает файлы с диска, даже если он не получает вызов DidOpen специально для включенных файлов. Это делается для того, чтобы скомпилировать исходный код, что было бы невозможно без файлов заголовков. Итак, да, он знает гораздо больше, чем DidOpen. Тем не менее, я не уверен, как он определяет рабочее пространство и как он определяет пути включения. Это либо запрашивается через сообщение клиенту, либо что-то вычисляет это на стороне клиента, а затем отправляет это на сервер.