给定一个类层次结构:
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 A
或A
的适当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中的父类声明。
答案 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直接获取基类引用而不是迭代和检查基类类型名称,如上所示。