2012-03-23 39 views
5

Làm cách nào để kiểm tra nếu phương pháp C++ là const đủ điều kiện trong clang?Clang Const Đủ điều kiện C++ Phương pháp

Ví dụ ::

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

Tôi đang sử dụng thư viện kêu vang-c và tôi đã cố gắng sử dụng clang_isConstQualifiedType vào nút inner_method. tuy nhiên điều này trả về false.

Tôi không ngại nếu câu trả lời sử dụng tiêu đề clang C++.

Trả lời

2

Trong giao diện C++, cách kiểm tra này là sử dụng CXXMethodDecl::getTypeQualifiers() hoặc sử dụng FunctionProtoType::getTypeQuals() (tùy thuộc vào việc bạn có khai báo hay loại). Các bit Qualifiers::Const cho biết liệu phương pháp (hoặc loại phương pháp) là const.

Trong API libclang C, thông tin này dường như chỉ được sử dụng trong việc triển khai getCursorUSR, kết quả không được phân tích cú pháp, do đó, sử dụng API C++ hoặc gửi bản vá để thêm chức năng này vào API C các tùy chọn tốt nhất.

1

Tôi đã gặp vấn đề tương tự, nhưng tôi cần làm điều này mà không có API C++. Tôi đặt giải pháp của tôi dưới đây để tham khảo trong tương lai. Ý tưởng là để sử dụng tính năng tokenization libclang để lặp qua tất cả các vòng loại của phương pháp này:

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

Cho dù một phương pháp lập chỉ mục bởi cursor được khai báo const sau đó có thể được kiểm tra thông qua các lệnh sau:

std::set<std::string> qualifiers; 
GetMethodQualifiers(translationUnit, qualifiers, cursor); 
bool isConstant = (qualifiers.find("const") != qualifiers.end()); 
0

Tôi đã cung cấp mã số in this SO answer chứa mã phân tích cú pháp cho clang_getCursorUSR (dựa trên mã nguồn của LLVM 3.1).

Các vấn đề liên quan