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()"
}
}