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

标签 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
  • 构造函数

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

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

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

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

总结一下

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

最佳答案

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)

Given a cursor that represents a template, determine the cursor kind of the specializations would be generated by instantiating the template.

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

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

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

别问,黑魔法。

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

cindex.CursorKind.from_id(tk)

关于python - 模板化构造函数游标和模板化成员游标在 libclang 中具有 FUNCTION_TEMPLATE 种类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35629380/

相关文章:

python - 从 flask 蓝图中的主应用程序导入

python - 如何在示例中编辑python dict?

c++ - 在 C++ libusb 中将数据写入 Datalogic PM9500 扫描仪的正确格式

python - 如何播放.wav(或任何其他类型的文件)文件?像实际的音频输出

python - 如何使用 PyKalman 获得标准差?

c++ - 减慢for循环的速度

c++ - VS2013 : passing iterator to a function that takes pointer (migrating VS2010 to VS2013)

LLVM - 如何获取指令的结果变量

ocaml - LLVM OCaml 绑定(bind)是否包含内在支持?

LLVM代码生成: fptoui instruction with constant value