2012-03-23 19 views
5

अगर मैं सीए ++ विधि क्लैंग में योग्यता प्राप्त करता हूं तो मैं कैसे परीक्षण करूं?क्लैंग कॉन्स योग्यता सी ++ विधि

उदाहरण के लिए ::

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

मैं बजना-सी लाइब्रेरी का उपयोग कर रहा हूँ और मैं inner_method नोड पर clang_isConstQualifiedType उपयोग करने की कोशिश की है। हालांकि यह झूठी वापसी करता है।

मुझे कोई फर्क नहीं पड़ता कि उत्तर क्लैंग सी ++ हेडर का उपयोग करता है या नहीं।

उत्तर

2

सी ++ इंटरफ़ेस में, यह जांचने का तरीका CXXMethodDecl::getTypeQualifiers() का उपयोग कर रहा है, या FunctionProtoType::getTypeQuals() का उपयोग कर रहा है (इस पर निर्भर करता है कि आपके पास घोषणा या प्रकार है या नहीं)। Qualifiers::Const बिट इंगित करता है कि विधि (या विधि प्रकार) का आधार है या नहीं।

libclang सी एपीआई में, यह जानकारी केवल getCursorUSR के कार्यान्वयन में उपयोग की जाती है, जिसका परिणाम पार्स किए जाने का इरादा नहीं है, इसलिए C++ API का उपयोग करना या सी कार्यक्षमता को जोड़ने के लिए पैच सबमिट करना सर्वोत्तम विकल्प।

1

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

मैंने कोड in this SO answer प्रदान किया है जिसमें clang_getCursorUSR (एलएलवीएम 3.1 के स्रोत कोड के आधार पर) के लिए पार्सिंग कोड शामिल है।

संबंधित मुद्दे