2012-03-23 16 views
5

C++メソッドがclangでconst修飾されているかどうかをテストするにはどうすればよいですか?例えばClang Const修飾されたC++メソッド

::

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

私が打ち鳴らす-Cライブラリを使用していると私はinner_methodノード上clang_isConstQualifiedTypeを使用して試してみました。しかし、これはfalseを返します。

答えがclang C++ヘッダーを使用するかどうかは関係ありません。

答えて

2

C++インターフェイスでは、CXXMethodDecl::getTypeQualifiers()を使用するか、またはFunctionProtoType::getTypeQuals()(宣言または型があるかどうかによって異なります)を使用して確認する方法があります。 Qualifiers::Constビットは、メソッド(またはメソッドタイプ)がconstかどうかを示します。

libclang C APIでは、この情報は、結果が解析されないようにgetCursorUSRの実装でのみ使用されているようです。したがって、C++ APIを使用するか、C APIにこの機能を追加するためのパッチを送信してください。最高のオプション。

1

私は同じ問題がありましたが、私はC++ APIなしでこれを行う必要がありました。私は将来の参考のために私のソリューションを以下に載せます。アイデアは、この方法のすべての修飾子をループにlibclangトークン化機能を使用することです:

std::set<std::string> qualifiers; 
GetMethodQualifiers(translationUnit, qualifiers, cursor); 
bool isConstant = (qualifiers.find("const") != qualifiers.end()); 
0
cursorでインデックス付け方法は constは、次のコマンドで確認することができ宣言されているかどうか

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); 
} 

clang_getCursorUSR(LLVM 3.1のソースコードに基づく)の解析コードを含むコードin this SO answerを提供しました。

関連する問題