Clang Const Квалифицированный метод C ++ - PullRequest
5 голосов
/ 23 марта 2012

Как мне проверить, является ли метод c ++ подходящим для clang?1006 * на узле inner_method.однако это возвращает false.

Я не против, если в ответе используются заголовки clang c ++.

Ответы [ 3 ]

2 голосов
/ 30 апреля 2012

В интерфейсе C ++ способ проверить это - использовать CXXMethodDecl::getTypeQualifiers() или FunctionProtoType::getTypeQuals() (в зависимости от того, есть ли у вас объявление или тип).Бит Qualifiers::Const указывает, является ли метод (или тип метода) постоянным.

В API libclang C эта информация, по-видимому, используется только в реализации getCursorUSR, результат которого не предназначен длянеобходимо проанализировать, поэтому наилучшим вариантом будет использование API C ++ или отправка исправления для добавления этой функции в API C.

1 голос
/ 31 июля 2012

У меня была такая же проблема, но мне нужно было сделать это без C ++ API.Я поставил свое решение ниже для дальнейшего использования.Идея состоит в том, чтобы использовать функцию токенизации libclang для циклического перебора всех квалификаторов метода:

std::string GetClangString(CXString str)
{
  const char* tmp = clang_getCString(str);
  if (tmp == NULL)
  {
    return "";
  }
  else
  {
    std::string translated = std::string(tmp);
    clang_disposeString(str);
    return translated;
  }
}

void GetMethodQualifiers(CXTranslationUnit translationUnit,
                         std::set<std::string>& qualifiers,
                         CXCursor cursor)
{
  qualifiers.clear();

  CXSourceRange range = clang_getCursorExtent(cursor);
  CXToken* tokens;
  unsigned int numTokens;
  clang_tokenize(translationUnit, range, &tokens, &numTokens);

  bool insideBrackets = false;
  for (unsigned int i = 0; i < numTokens; i++)
  {
    std::string token = GetClangString(clang_getTokenSpelling(translationUnit, tokens[i]));
    if (token == "(")
    {
      insideBrackets = true;
    }
    else if (token == "{" || token == ";")
    {
      break;
    }
    else if (token == ")")
    {
      insideBrackets = false;
    }
    else if (clang_getTokenKind(tokens[i]) == CXToken_Keyword && 
             !insideBrackets)
    {
      qualifiers.insert(token);
    }
  }

  clang_disposeTokens(translationUnit, tokens, numTokens);
}

Можно ли проверить метод, индексированный cursor, const, с помощью следующих команд:

std::set<std::string> qualifiers;
GetMethodQualifiers(translationUnit, qualifiers, cursor);
bool isConstant = (qualifiers.find("const") != qualifiers.end());
0 голосов
/ 31 августа 2012

Я предоставил код в этом ответе SO , который содержит код анализа для clang_getCursorUSR (на основе исходного кода LLVM 3.1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...