适用于父类声明的AST匹配器

时间:2015-05-29 16:53:54

标签: clang abstract-syntax-tree llvm-clang

给定一个类层次结构:

class A {};
class B {};
class C : public A {};
class D : public C {};

我正在尝试重构C类以继承B类而不是A类。我可以使用recordDecl轻松获取定义语句:

recordDecl(hasName("C"), isDefinition()).bind("MyClass")

使用关联的MatchCallback,我可以dump()该类来验证它是否与正确的节点匹配。但是,我还没有找到一种方法来绑定public A,或者更好的是A

为C类捕获public AA的适当AST匹配器是什么?

修改

在这种情况下,为C类过滤的clang -ast-dump输出会显示类似于以下内容的内容:

CXXRecordDecl [address] <line numbers> <loc> class C definition
|- public 'class A'
|- CXXRecordDecl [address 2] <columns> <loc> implicit referenced class C

好像没有AST节点类型来表示ast-dump中的父类声明。

1 个答案:

答案 0 :(得分:2)

我发现这个link提供了一些如何向下钻取的背景。值得注意的是,一个教程建议在返回节点的匹配处理程序中使用var consoleLogArray = ['NORMAL','MIDDLE','VERBOSE']; var consoleLogLevel = 3; $(document).ready( function(){ // Got to let me know we are starting in some cases console.log('VERBOSE MERSSAGE: Started'); // Some Basic code var x = 5; var y = 10; var check = 2; if (!x+y === 14){ // This should be a verbose log // This should only show in Verbose setting console.error('We have a variable assignment problem') } if(x/y === check){ // This should be a middle level // This should only show in Verbose setting or Middle Setting console.log('Yup, 10 divided by 5 is still 2...') } // This should be a normal level // This should show in Normal, Middle, and Verbose settings console.log('Finished with no errors!'); }) 与使用RecordDecl的此引用。因此,如果我们在匹配处理程序中输出每个基数:

CXXRecordDecl

我们发现对A类的引用是if (const CXXRecord *entityBase = Result.Nodes.getNodeAs<clang::CXXRecordDecl>("entityBase")) { for (auto &p : entityBase->bases()) { p.dump(); } } ,由RecordType引用。无论使用CXXRecord,我都找不到将clang-query链接到任何有助于提取match recordType(...)public A的方法的方法。相反,解决方案变得与此类似:

A

我并没有将此标记为答案,以防万一有人有办法使用recordType直接获取基类引用而不是迭代和检查基类类型名称,如上所示。