मुझे एक ही समस्या थी, लेकिन मुझे सी ++ एपीआई के बिना ऐसा करने की आवश्यकता थी। मैंने भविष्य में संदर्भ के लिए अपना समाधान नीचे रखा है। विचार विधि के सभी क्वालिफायर से अधिक पाश को libclang tokenization सुविधा का उपयोग करने के लिए है:
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());