我如何测试c ++方法是否在clang中是const限定的?
例如::
class Inner{
public:
int i;
Inner();
float inner_method() const;
};
我正在使用clang-c库,我尝试在clang_isConstQualifiedType
节点上使用inner_method
。但是这会返回false。
我不介意答案是否使用了clang c ++标题。
答案 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的源代码)。