2013-10-29 7 views
7

で一般属性の検査:私は、次の例では、クラスのメンバ関数の一般的な属性を解析したいlibclang

class Foo 
{ 
public: 
    void foo [[interesting]](); 
    void bar(); 
}; 

libclangのC APIを使用して、私はfoobarを区別(およびことを知っていただきたいと思いますfooにはinterestingという属性があります)。これは可能ですか?私は、APIで使われている概念を説明するサンプルやドキュメントを見つけるのに苦労しています(私はリファレンスを見つけましたが、概念が説明されていないときには使いにくいです)。それが(未テストコード...警告レクター)がない場合は、次のfirst_attr機能のような

答えて

1

ASTで一般化された属性を見つけることができませんでしたが(ASTを作成する前または作成する前に削除されているようですが)、回避策が見つかりました。

__attribute__((annotate("something"))) 

私は合理的な構文を得ることができ、マクロおよびASTに表示され、注釈付き:

#define INTERESTING __attribute__((annotate("interesting"))) 

class Foo 
{ 
public: 
    INTERESTING void foo(); 
    void bar(); 
}; 

属性次の形式でannotate打ち鳴らす属性があり

メソッドノードの子になり、display_nameは注釈文字列になります。可能ASTダンプ:

<CursorKind.TRANSLATION_UNIT> 
    "test.h" 
{ 
    __builtin_va_list <CursorKind.TYPEDEF_DECL> 
    "__builtin_va_list" 
    type_info <CursorKind.CLASS_DECL> 
    "type_info" 
    Foo <CursorKind.CLASS_DECL> 
    "Foo" 
    { 
    <CursorKind.CXX_ACCESS_SPEC_DECL> 
     "" 
    foo <CursorKind.CXX_METHOD> 
     "foo()" 
    { 
     <CursorKind.ANNOTATE_ATTR> 
     "interesting" 
    } 
    bar <CursorKind.CXX_METHOD> 
     "bar()" 
    } 
} 

それはあまりにもvoid foo INTERESTING();と同じ出力を生成します。

2

何かが、それが存在する場合、渡されたカーソルの最初の属性のカーソルを取得、またはnullカーソルます

CXChildVisitResult attr_visit(CXCursor cursor, CXCursor parent, CXClientData data) { 
    if (clang_isAttribute(cursor)) { 
     *data = cursor; 
     return CXChildVisit_Break; 
    } 
    return CXChildVisit_Continue; 
} 

CXCursor first_attr(const CXCursor& c) { 
    CXCursor attr; 
    unsigned visit_result = clang_visitChildren(c, attr_visit, &attr); 
    if (!visit_result) // attribute not found 
     attr = clang_getNullCursor(); 
    return attr; 
} 

CXCursor_IBActionAttr 
CXCursor_IBOutletAttr 
CXCursor_IBOutletCollectionAttr 
CXCursor_CXXFinalAttr 
CXCursor_CXXOverrideAttr 
CXCursor_AnnotateAttr 
CXCursor_AsmLabelAttr 

すべてがCXCursor_UnexposedAttr次のようになります。具体的にはaが表すカーソル属性の発見、clang_getCursorKind(a)の結果を助けることができますが、公開属性のみであるためとして

dのテキストを得るために私が考えることができる唯一の方法は、clang_getCursorExtent(a)を調べることです(つまり、ソースコードを読んでください; cf. clang_tokenize)。注釈の場合、使用される特定の注釈は、clang_getCursorDisplayNameから利用できます。

+0

コードをプロトタイプ化するためにPythonバインディングでこれを実行しようとしましたが、アトリビュートはASTでは全く表示されませんでした(未露光のアトリビュートではありません)。追加したときに、ASTダンプに 'noreturn'属性が表示されました。 –

関連する問題