3

一些上下文

我对 libclang 不是很熟悉。我只是在修改一个使用python 绑定到 libclang的 vim 插件。

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

问题

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

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

都有相同的种类:FUNCTION_TEMPLATE。我需要区分它们。

更多见解

例如,上述的非模板版本有以下几种:

  • FUNCTION_DECL
  • CXX_METHOD
  • CONSTRUCTOR.

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

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

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

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

把它们加起来

给定一个游标,我如何判断它是方法(甚至是模板化的)、构造函数(甚至是模板化的)还是自由函数声明?

4

1 回答 1

2

tl;博士

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

浏览C libclang 在线 doxygen 文档,我们在C++ AST 自省中找到函数clang_getTemplateCursorKind

CINDEX_LINKAGE enum CXCursorKind  clang_getTemplateCursorKind (CXCursor C)

给定一个代表模板的游标,确定将通过实例化模板来生成特化的游标类型。

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

环顾四周,这就是我们如何调用C未在 Python 中显式实现的函数:

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

别问,黑魔法。

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

cindex.CursorKind.from_id(tk)
于 2016-02-25T17:18:38.867 回答