我对libclang并不熟悉。我只是在修改一个使用the python bindings to libclang的vim插件。
有一个python函数接收一个游标参数。几乎在当前C ++缓冲区的AST中的每个节点都会调用它。
cursor.kind
用于获取游标的种类。一切都好,除了
都具有相同类型:FUNCTION_TEMPLATE
。我需要区分它们。
例如,上面的非模板化版本具有以下种类:
FUNCTION_DECL
CXX_METHOD
和CONSTRUCTOR
。我搜索了cindex.py的来源,但没有CXX_METHOD_TEMPLATE
或CONSTRUCTOR_TEMPLATE
或类似内容。
我试图以某种方式获得我需要的信息,但没有成功,例如使用cursor.get_definition()
和cursor.underlying_typedef_type.get_declaration()
。
我获得的唯一部分成功是,对于方法和构造函数,语义和词汇父级是STRUCT_DECL
。
我不在乎它是否有模板化。我只关心它是构造函数,成员还是自由函数。
给定一个游标,我怎么知道它是一个方法(甚至模板化),一个构造函数(甚至是模板化的)还是一个自由函数声明?
答案 0 :(得分:1)
TL;博士
cindex.CursorKind.from_id(cindex.conf.lib.clang_getTemplateCursorKind(cursor))
浏览我们在C libclang online doxygen documentation函数C++ AST introspection
中找到的clang_getTemplateCursorKindCINDEX_LINKAGE enum CXCursorKind clang_getTemplateCursorKind (CXCursor C)
给定代表模板的游标,确定游标种类 通过实例化生成专业化 模板。
这正是我想要的。不幸的是,用Python调用它并不那么简单。
通过四处查看,这就是我们如何调用未在Python中显式实现的C
函数:
tk = cindex.conf.lib.clang_getTemplateCursorKind(cursor)
不要问,黑魔法。
道路上的下一个障碍是这个函数返回一个长整数。如果我们真的想要CursorKind
对象,我们需要这个:
cindex.CursorKind.from_id(tk)