模板化构造函数游标和模板化成员游标在libclang中具有类型FUNCTION_TEMPLATE

时间:2016-02-25 13:58:30

标签: python c++ llvm abstract-syntax-tree libclang

某些背景

我对libclang并不熟悉。我只是在修改一个使用the python bindings to libclang的vim插件。

有一个python函数接收一个游标参数。几乎在当前C ++缓冲区的AST中的每个节点都会调用它。

问题

cursor.kind用于获取游标的种类。一切都好,除了

  • 模板化自由函数声明,
  • 模板化构造函数声明和
  • 模板化方法声明

都具有相同类型:FUNCTION_TEMPLATE。我需要区分它们。

更多洞察力

例如,上面的非模板化版本具有以下种类:

  • FUNCTION_DECL
  • CXX_METHOD
  • CONSTRUCTOR

我搜索了cindex.py的来源,但没有CXX_METHOD_TEMPLATECONSTRUCTOR_TEMPLATE或类似内容。

我试图以某种方式获得我需要的信息,但没有成功,例如使用cursor.get_definition()cursor.underlying_typedef_type.get_declaration()

我获得的唯一部分成功是,对于方法和构造函数,语义和词汇父级是STRUCT_DECL

我不在乎它是否有模板化。我只关心它是构造函数,成员还是自由函数。

总结一下

给定一个游标,我怎么知道它是一个方法(甚至模板化),一个构造函数(甚至是模板化的)还是一个自由函数声明?

1 个答案:

答案 0 :(得分:1)

TL;博士

cindex.CursorKind.from_id(cindex.conf.lib.clang_getTemplateCursorKind(cursor))

浏览我们在C libclang online doxygen documentation函数C++ AST introspection

中找到的clang_getTemplateCursorKind
CINDEX_LINKAGE enum CXCursorKind  clang_getTemplateCursorKind (CXCursor C)
     

给定代表模板的游标,确定游标种类   通过实例化生成专业化   模板。

这正是我想要的。不幸的是,用Python调用它并不那么简单。

通过四处查看,这就是我们如何调用未在Python中显式实现的C函数:

tk = cindex.conf.lib.clang_getTemplateCursorKind(cursor)

不要问,黑魔法。

道路上的下一个障碍是这个函数返回一个长整数。如果我们真的想要CursorKind对象,我们需要这个:

cindex.CursorKind.from_id(tk)