Я использую Clang в расширении редактора кода для реализации свертывания / свертывания, и я столкнулся с проблемой.
Я анализирую только один файл за раз, а не весьпереводческий блок.Это отчасти для скорости и простоты, но также потому, что вы можете открыть файл заголовка самостоятельно и не знать, какой cpp все равно проанализировать.
Проблема в том, что как только clang встречает неизвестный символ, он просто отказываетсяи целые куски файла отсутствуют в AST.Рассмотрим следующий фрагмент
void Foo1()
{
while (PeekMessageA())
{
switch (0)
{
}
}
}
AST для этого просто
|-FunctionDecl 0x1fde8f67240 <Folding Test.cpp:1:1, line:9:1> line:1:6 Foo1 'void ()'
| `-CompoundStmt 0x1fde8f673f8 <line:2:1, line:9:1>
Нет информации для блока while или блока переключателей.Очевидно, что clang не может знать, является ли PeekMessageA вызовом функции или конструкцией объекта и т. Д., И я в порядке с этим.Мне не нужно, чтобы он был идеальным, но я хочу быть в состоянии добраться до времени и переключать блоки.
Есть ли способ получить Clang, чтобы предоставить больше информации в лицо в этом случае?В настоящее время я использую LibClang, но также могу использовать LibTooling.