2016-05-16 70 views
1

我編寫一個腳本來檢測我的C++代碼中的格式錯誤。 (例如,確保所有成員變量的前綴爲m_)。我想要做的一件事是確保指針類型具有附加到該類型的asterix(int* num,而不是int *num)。獲取lib clang遊標/類型的實際拼寫

所以我需要獲取類型的文本,因爲它在源代碼中。但是,獲取光標或類型的拼寫將返回一個漂亮的打印版本,即使源具有int*,它也將始終返回int *

爲了解決這個問題,我得到了遊標的範圍,並從源文件中獲取子字符串並檢查它。然而,似乎沒有辦法獲得類型的範圍,所以我不能得到它的實際拼寫?有沒有辦法做到這一點?也許是通過獲得這種類型的令牌,然後獲得這些令牌的範圍?

(我使用Python綁定,但如有必要,可以切換到C API)

回答

0

你可以嘗試這樣的事情。獲取拼寫:

std::string symbol = clang_getCString(clang_getCursorSpelling(Cursor)); 

查找指針聲明:

case CXType_Pointer: 
{ 
    // ... 
} 

使用clang_tokenize,然後用它來查找*的位置。

// Tokens retrieved with clang_tokenize 
// symbol declared earlier 
auto finder = std::find(tokens.begin(), tokens.end(), symbol); 
if (*(finder) == "*") 
{ 
    if (*(finder + 1)) == " ") { /* ... */ } // int* asdf 
} else if (*(finder) == " ") { 
    if (*(finder + 1)) == "*") { /* ... */ } // int *asdf 
} 

當然這是僞代碼。代碼沒有被編譯器的手觸及。

+0

我很確定令牌不包含空格。 –

0

Libclang是一個很好的工具來查找匹配(或不匹配模式)的成員變量,但是有一種更簡單的方法可以解決代碼庫中漂亮的指針和引用的問題,那就是使用clang-format哪個是一種工具,用於格式化C/C++/Java/JavaScript/Objective-C/Protobuf代碼

Clang格式有大量的options,但可能最感興趣的是PointerAlignment,它可以具有以下值之一:Left,Right或Middle,它們適當地重新指定指針(和引用)的格式。

您可以從網上工具之一或產生鐺格式的一個新的配置文件中的內置樣式:

clang-format -style=llvm -dump-config > .clang-format 

編輯該文件設置PointerAlignment到左和運行:

clang-format main.cpp 

在一個類似的 「難」 格式化代碼片段:

// main.cpp 
int main() 
{ 
    int a; 
    int* b; 
    int *c; 
    int& d; 
    int &d; 
    int * e; 
    const int * f; 
    const int * const g; 
    return 0; 
} 

我GE t:

// main.cpp 
int main() { 
    int a; 
    int* b; 
    int* c; 
    int& d; 
    int& d; 
    int* e; 
    const int* f; 
    const int* const g; 
    return 0; 
} 

對於其他設置具有類似的結果。

如果你確實需要從代碼做到這一點,你可以使用libformat,即鞏固鐺格式庫,也可以使用調用鐺格式from a subprocess,這是在鐺代碼庫等工具是如何做到這一點。

+0

我看着clang格式,但似乎沒有辦法定義自定義規則。我沒有看libformat,但初看起來,它似乎只能調用格式化過程,而不能定義自定義規則。 –

+0

考慮分兩步進行 - 第一階段可以使用libclang或[clang替換](https://github.com/eliben/llvm-clang-samples/blob/master/src_clang/matchers_replacements.cpp)來查找(並可能替換成員變量),然後在第二遍中更正指針/引用。 –

相關問題