用libclang检查泛化属性

我想在下面的例子中解析类成员函数的泛化属性:

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

使用libclang C API,我想在源代码中区分foobar (并且知道foo具有interesting属性)。 这可能吗? 我很难找到解释在API中使用的概念的示例或文档(我找到了一个参考,但是当这些概念没有解释时,这很难使用)。


类似下面的first_attr函数将获取传递的游标的第一个属性的游标(如果它存在),或者如果它不包含空游标(未测试的代码...警告文件)

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;
}

至于查找游标a表示哪个特定属性, clang_getCursorKind(a)的结果可以提供帮助,但唯一暴露的属性是:

CXCursor_IBActionAttr
CXCursor_IBOutletAttr
CXCursor_IBOutletCollectionAttr
CXCursor_CXXFinalAttr
CXCursor_CXXOverrideAttr
CXCursor_AnnotateAttr
CXCursor_AsmLabelAttr

其他的东西都是CXCursor_UnexposedAttr ,我能想到得到它的文本的唯一方法是检查clang_getCursorExtent(a) (即读取源代码;参见clang_tokenize )。 在注释的情况下,通过clang_getCursorDisplayName可以使用特定注释。


虽然我无法在AST中找到广义属性(看起来在构建AST时或之前它们被删除,而不是在它之后),但我确实找到了解决方法。

有以下形式的annotate clang属性:

__attribute__((annotate("something")))

使用宏我可以得到一个合理的语法和AST中可见的注释:

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

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

该属性将是方法节点的子节点,其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 ();生成相同的输出void foo INTERESTING (); 太。

链接地址: http://www.djcxy.com/p/16917.html

上一篇: Inspecting generalized attributes with libclang

下一篇: Visual Studio 2012 Performance Analysis failing to load symbol file