Clang Const合格的C ++方法

时间:2012-03-23 16:18:33

标签: clang

我如何测试c ++方法是否在clang中是const限定的?

例如::

class Inner{
public:
    int i;
    Inner();
    float inner_method() const;
};

我正在使用clang-c库,我尝试在clang_isConstQualifiedType节点上使用inner_method。但是这会返回false。

我不介意答案是否使用了clang c ++标题。

3 个答案:

答案 0 :(得分:2)

在C ++界面中,检查方法是使用CXXMethodDecl::getTypeQualifiers(),或使用FunctionProtoType::getTypeQuals()(取决于您是否有声明或类型)。 Qualifiers::Const位指示方法(或方法类型)是否为const。

在libclang C API中,此信息似乎仅用于getCursorUSR的实现,其结果不打算解析,因此使用C ++ API或提交补丁以将此功能添加到C API是最好的选择。

答案 1 :(得分:1)

我遇到了同样的问题,但我需要在没有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());

答案 2 :(得分:0)

我提供了代码in this SO answer,其中包含clang_getCursorUSR的解析代码(基于LLVM 3.1的源代码)。