C++ 用libclang检查广义属性

C++ 用libclang检查广义属性,c++,clang,abstract-syntax-tree,libclang,C++,Clang,Abstract Syntax Tree,Libclang,我想在下面的示例中解析类成员函数的通用属性: class Foo { public: void foo [[interesting]] (); void bar (); }; 使用libclangcapi,我想区分源代码中的foo和bar(并且知道foo具有有趣的属性)。这可能吗?我很难找到解释API中使用的概念的示例或文档(我找到了一个参考,但在没有解释概念的情况下很难使用)。类似下面的first\u attr函数将获取传递的游标的第一个属性的游标(如果存在的话),如果没有,

我想在下面的示例中解析类成员函数的通用属性:

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

使用libclangcapi,我想区分源代码中的
foo
bar
(并且知道
foo
具有
有趣的
属性)。这可能吗?我很难找到解释API中使用的概念的示例或文档(我找到了一个参考,但在没有解释概念的情况下很难使用)。

类似下面的
first\u attr
函数将获取传递的游标的第一个属性的游标(如果存在的话),如果没有,则为空光标(未测试的代码…警告选择器)

至于查找游标
a
表示的特定属性,clang_getCursorKind(a)
的结果可能会有所帮助,但只显示以下属性:

CXCursor_IBActionAttr
CXCursor_IBOutletAttr
CXCursor_IBOutletCollectionAttr
CXCursor_CXXFinalAttr
CXCursor_CXXOverrideAttr
CXCursor_AnnotateAttr
CXCursor_AsmLabelAttr

其他一切都将是一个
CXCursor\u unposeredattr
,我能想到的获取文本的唯一方法是检查
clang\u getCursorExtent(a)
(即,读取源代码;参见
clang\u标记化
)。对于注释,使用的特定注释可通过
clang_getCursorDisplayName

获得。虽然我无法在AST中找到通用属性(它们似乎在构建AST时或之前被删除,而不是在构建AST之后),但我确实找到了解决方法

有一个
annotate
clang属性,格式如下:

__attribute__((annotate("something")))
使用宏,我可以获得合理的语法和注释,这些语法和注释在AST中可见:

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

class Foo
{
public:
    INTERESTING void foo();
    void bar();
};
该属性将是方法节点的子级,其显示名称为注释字符串。可能的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()"
  }
}

“test.h”
{
__内置列表
“\uuuuu内置的\uu va\u列表”
类型信息
“输入信息”
福
“福”
{
""
福
“foo()”
{
“有趣”
}
酒吧
“bar()”
}
}

它生成与
voidfoo-interest()相同的输出也是

我尝试使用python绑定来实现代码的原型,但该属性在AST中根本不可见(甚至不作为未公开的属性)。添加属性时,AST转储中确实出现了一个
noreturn
属性。
 <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()"
  }
}