LibClang 公开了一个函数来“确定被给定方法覆盖的方法集”(在此处解释)。然而,这个函数似乎没有在 python 绑定中公开。有人可以解释如何将此功能添加到绑定中还是我只是没有找到它?
问问题
141 次
1 回答
0
通常,向 libclang 添加方法遵循与库本身相同的基本模式。
- 您使用 ctypes 来查找要包装的方法的句柄。
- 您指定有关参数和返回类型的额外类型信息。
- 您将该 ctypes 函数包装在处理任何极端情况/缓存的 python 函数中。
对于简单的情况,您可以使用cymbal,这是一个新的 Python 模块,它来自一些试图回答这个问题的实验。Cymbal 允许您将方法附加到 libclang 类型和游标上。
但是,clang_getOverriddenCursors
它比正常情况稍微复杂一些,因为您需要处理调用返回的内存clang_disposeOverriddenCursors
。
此外,libclang 做了一些魔术,这意味着您从该函数返回的游标不适用于所有函数调用(它们省略了指向翻译单元的指针),因此您还需要生成更新的游标(基于翻译单元和地点)。
示例代码:
import clang.cindex
from clang.cindex import *
clang_getOverriddenCursors = clang.cindex.conf.lib.clang_getOverriddenCursors
clang_getOverriddenCursors.restype = None
clang_getOverriddenCursors.argtypes = [Cursor, POINTER(POINTER(Cursor)), POINTER(c_uint)]
clang_disposeOverriddenCursors = clang.cindex.conf.lib.clang_disposeOverriddenCursors
clang_disposeOverriddenCursors.restype = None
clang_disposeOverriddenCursors.argtypes = [ POINTER(Cursor) ]
def get_overriden_cursors(self):
cursors = POINTER(Cursor)()
num = c_uint()
clang_getOverriddenCursors(self, byref(cursors), byref(num))
updcursors = []
for i in xrange(int(num.value)):
c = cursors[i]
updcursor = Cursor.from_location(self._tu, c.location)
updcursors.append( updcursor )
clang_disposeOverriddenCursors(cursors)
return updcursors
假设您要解析这样的内容:
// sample.cpp
class foo {
public:
virtual void f();
};
class bar : public foo {
public:
virtual void f();
};
您可以在树中找到方法
idx = Index.create()
tu = idx.parse('sample.cpp', args = '-x c++'.split())
methods = []
for c in tu.cursor.walk_preorder():
if c.kind == CursorKind.CXX_METHOD:
methods.append(c)
然后您可以看到覆盖
def show_method(method):
return method.semantic_parent.spelling + '::' + method.spelling
for m in methods:
for override in get_overriden_cursors(m):
print show_method(m), 'overrides', show_method(override)
对我来说打印:
bar::f overrides foo::f
于 2016-05-07T08:05:45.453 回答