1

C++ コードのフォーマット エラーを検出するスクリプトを作成しています。(たとえば、すべてのメンバー変数に接頭辞が付けられていることを確認しますm_)。私がやりたいことの 1 つは、ポインターである型の型にアスタリスクが付いていることを確認することです ( int* num, not int *num)。

そのため、ソース コードにある型のテキストを取得する必要があります。ただし、カーソルまたはタイプのスペルを取得すると、きれいに印刷されたバージョンが返されます。int *ソースに が含まれていても、常に が返されますint*

これを回避するために、カーソルの範囲を取得し、ソース ファイルから部分文字列を取得して確認します。ただし、タイプの範囲を取得する方法がないように思われるため、実際のスペルを取得できませんか? これを行う方法はありますか?おそらく、型のトークンを取得してから、それらの範囲を取得することでしょうか?

(私は Python バインディングを使用していますが、必要に応じて C API に切り替えることができます)

4

2 に答える 2

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 
}

もちろん、これは疑似コードです。コンパイラの手が触れていないコード。

于 2016-05-16T00:55:24.910 に答える