2013-09-27 21 views
0

我想用鐺來標記CPP文件:對於Clang中的CXSourceRange,是否有任何特殊值「所有文件」?

// range = all the file 
CXSourceLocation beginning = clang_getLocationForOffset(TU, file, 0); 
CXSourceLocation end = clang_getLocationForOffset(TU, file, 53); // TODO : set actual file length 
CXSourceRange range = clang_getRange(beginning, end); 

clang_tokenize(TU, range, &tokens, &numTokens); 

代碼工作,我可以看到實際的令牌。

我需要爲此設置CXSourceRange。在我的情況下,它始終是「所有文件」從頭到尾。有沒有什麼特殊的含義是「所有文件」?否則,我必須獲得文件大小或硬編碼任何實際值,如上例。

+0

如果我指定最大(INT)或任何大值,該值越大則文件大小clang_tokenize返回0令牌這意味着它不正確範圍 – 4ntoine

回答

3

你可以做

CXSourceRange range = clang_getCursorExtent(clang_getTranslationUnitCursor(TU));

獲得覆蓋整個翻譯單元的範圍。見clang_getTranslationUnitCursor(...)clang_getCursorExtent(...)

E.g.這一方案給予標記化作爲參數文件:

#include <clang-c/Index.h> 
#include <iostream> 

int main (int argc, char *argv[]) 
{ 
    if (argc != 2) { 
     std::cerr << "Usage: tokenize <file>" << std::endl; 
     return 1; 
    } 

    CXIndex index = clang_createIndex(0, 0); 
    CXTranslationUnit TU = clang_parseTranslationUnit(index, 0, argv, argc, 0, 0, CXTranslationUnit_None); 
    CXSourceRange range = clang_getCursorExtent(clang_getTranslationUnitCursor(TU)); 

    // Tokenize. 
    CXToken *tokens; 
    unsigned int numTokens; 
    clang_tokenize(TU, range, &tokens, &numTokens); 

    for (int i = 0; i < numTokens; ++i) { 
     CXToken token = tokens[i]; 
     switch (clang_getTokenKind(token)) { 
      case CXToken_Punctuation: 
       std::cout << "CXToken_Punctuation" << std::endl; 
       break; 
      case CXToken_Keyword: 
       std::cout << "CXToken_Keyword" << std::endl; 
       break; 
      case CXToken_Identifier: 
       std::cout << "CXToken_Identifier" << std::endl; 
       break; 
      case CXToken_Literal: 
       std::cout << "CXToken_Literal" << std::endl; 
       break; 
      case CXToken_Comment: 
       std::cout << "CXToken_Comment" << std::endl; 
       break; 
      default: 
       std::cout << "Unknown" << std::endl; 
     } 
    } 

    clang_disposeTokens(TU, tokens, numTokens); 
    clang_disposeTranslationUnit(TU); 
    clang_disposeIndex(index); 

    return 0; 
} 
相關問題