Как вы обнаруживаете разницу между enum и enum с областью видимости, используя libclang?
Я пишу синтаксический анализатор C++ AST, используя превосходный C-интерфейс libclang ( http://clang.llvm.org/doxygen/group__CINDEX.html). К сожалению, между перечислениями в области видимости C++ 11 и устаревшими перечислениями, похоже, нет никакой неоднозначности: оба имеют тип курсора CXCursor_EnumDecl и тип CXType_Enum, т. Е. Идентичный.
Я пытался навестить детей, чтобы увидеть, отличается ли их тип родителей - к сожалению, нет. Я попытался попросить базовый тип, я получаю целое число для обоих. Я проверил все элементы, объявленные после Enum, чтобы увидеть, может ли для старомодных Enums появиться bind или typedef, опять же, никаких различий не очевидно.
Я начинаю думать, что я что-то упускаю. Нужно ли использовать API для завершения кода, чтобы выяснить, какой это тип Enum или что-то еще?
1 ответ
Итак, вот одно из решений, хотя оно и не очень, но может помочь другим. CXCursor - это структура, которая выглядит следующим образом:
typedef struct {
enum CXCursorKind kind;
int xdata;
const void *data[3];
} CXCursor;
В настоящее время void *data[3] отображается на { const clang::Decl *Parent, const clang::Stmt *S, CXTranslationUnit TU }. Зная это, мы можем написать код, который извлекает внутренние объекты Clang C++ из состояния C libclang:
#include "clang/AST/Decl.h"
bool isScoped=false;
{
using namespace clang;
const Decl *D = static_cast<const Decl *>(cursor.data[0]);
if(const EnumDecl *TD = dyn_cast_or_null<EnumDecl>(D))
{
isScoped=TD->isScoped();
}
}
С этим решением может случиться много плохого, если ваши заголовки кланга отклоняются от вашего libclang. Мне не очень важно это решение, но оно работает.