2

私は現在、clangのpythonバインディングを使用して静的C ++コードアナライザーを作成していますが、何らかの理由でextern、適切と思われるCursorKindがあるにもかかわらず、ASTに何かがあるかどうかを見つけることができません(CXCursor_LinkageSpec)

私が言いたいのは、私のようなコードを解析するときextern int foo;、変数fooはASTでのみ検出され、そのリンケージ仕様の単一の手がかりは検出されないということです。

私は何が欠けていますか?
よろしく

4

2 に答える 2

3

クラス VarDecl にはメンバー関数があります: bool hasExternalStorage () const これは、変数が extern かどうかを示します。

私はclangのC++ライブラリを使用しています。あなたのpython作業に役立つことを願っています。

于 2012-09-21T08:05:13.580 に答える
1

ちょっとしたネクロアンサーですが、clang\lib\Sema\SemaCodeComplete.cpp (llvm のインストール手順に従う場合は \llvm\tools\ にあります) に移動し、次の行を追加すると:

case Decl::LinkageSpec:  return CXCursor_LinkageSpec;

スイッチに:

CXCursorKind clang::getCursorKindForDecl(const Decl *D)

これにより、clang の Python バインダーが正しい LINKAGE_SPEC ではなく UNEXPOSED_DECL を返す問題が解決されるはずです。この変更はリビジョン 183352(2013-06-05) で行われました。

私のバージョンの例:

CXCursorKind clang::getCursorKindForDecl(const Decl *D) {
if (!D)
    return CXCursor_UnexposedDecl;

switch (D->getKind()) {
    case Decl::Enum:               return CXCursor_EnumDecl; 
    case Decl::LinkageSpec:  return CXCursor_LinkageSpec;
   // ......
于 2013-06-06T04:38:17.833 に答える