завершение кода clang — дизайн реализации

Есть ли какая-то скрытая документация о том, как реализована часть clang для завершения кода? До сих пор я обнаружил, что специальный токен (tok :: code_completion) вставляется в лексер и обрабатывается в парсере. После просмотра такого токена парсер может заполнить возможные строки завершения.

Что я не понимаю
Если вызываемая функциональность решает, что мы можем вставить переменную, которая доступна в текущем контексте. Как обрабатывается такой случай?

struct FooBar {
void foo() {
ba<<code completion here>>
}
void bar() {
}
};

Синтаксический анализатор еще не видел бар, но его можно вызывать.

4

Решение

На мой взгляд, это общая проблема при разборе определений методов внутри структуры, и она не является специфичной для завершения кода. В любом случае, в парсере есть специальная обработка именно для этого случая, которую вы можете найти в файл 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(...

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

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector