Есть ли какая-то скрытая документация о том, как реализована часть clang для завершения кода? До сих пор я обнаружил, что специальный токен (tok :: code_completion) вставляется в лексер и обрабатывается в парсере. После просмотра такого токена парсер может заполнить возможные строки завершения.
Что я не понимаю
Если вызываемая функциональность решает, что мы можем вставить переменную, которая доступна в текущем контексте. Как обрабатывается такой случай?
struct FooBar {
void foo() {
ba<<code completion here>>
}
void bar() {
}
};
Синтаксический анализатор еще не видел бар, но его можно вызывать.
На мой взгляд, это общая проблема при разборе определений методов внутри структуры, и она не является специфичной для завершения кода. В любом случае, в парсере есть специальная обработка именно для этого случая, которую вы можете найти в файл ParseCXXInlineMethods.cpp.
Из комментария Parser::ParseCXXInlineMethodDef()
:
/// ParseCXXInlineMethodDef - We parsed and verified that the specified
/// Declarator is a well formed C++ inline method definition. Now lex its body
/// and store its tokens for parsing after the C++ class is complete.
Parser::DeclPtrTy
Parser::ParseCXXInlineMethodDef(...
И позже, код для анализа определений метода:
/// ParseLexedMethodDefs - We finished parsing the member specification of a top
/// (non-nested) C++ class. Now go over the stack of lexed methods that were
/// collected during its parsing and parse them all.
void Parser::ParseLexedMethodDefs(...
Таким образом, сгенерированные лексером токены для тел функций анализируются только после анализа остальной части класса.
Других решений пока нет …