Как вы обнаруживаете разницу между 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. Мне не очень важно это решение, но оно работает.

Другие вопросы по тегам