void VisitUnknownType(QualType qtype, Displayer* displayer,
Displayer::Node* current_node){
if(qtype->isPointerType()){
}
else if(qtype->isStructureType()){
const RecordType* rtype = qtype->getAsStructureType();
DisplayerVisitRecordType(rtype, displayer, current_node);
}
else if(qtype->isArrayType()){
auto atype = dyn_cast_or_null<ArrayType>(qtype.getTypePtr());
DisplayerVisitArrayType(atype, displayer, current_node);
}
else if(qtype->isPointerType()){
auto ptype=dyn_cast_or_null<PointerType>(qtype.getTypePtr());
DisplayerVisitPointerType(ptype,displayer, current_node);
}
else{
qtype->dump();
}
}
void DisplayerVisitPointerType(const PointerType* ptype, Displayer* displayer, Displayer::Node* current_node) {
QualType qualType = ptype->getPointeeType();//child type
Displayer::Node* child_node=new Displayer::Node;
child_node->qualType=qualType;
{
std::unique_ptr<Displayer::Edge> edge = std::make_unique<Displayer::Edge>(
child_node, Displayer::EdgeType::PointEdge);
current_node->edges.push_back(std::move(edge));
}
VisitUnknownType(qualType, displayer, child_node);
}
void DisplayerVisitArrayType(const ArrayType* atype, Displayer* displayer, Displayer::Node* current_node) {
QualType qualType = atype->getElementType();//child type
Displayer::Node* child_node=new Displayer::Node;
child_node->qualType=qualType;
{
std::unique_ptr<Displayer::Edge> edge = std::make_unique<Displayer::Edge>(
child_node, Displayer::EdgeType::ArrayEdge, fieldDecl->getNameAsString());
current_node->edges.push_back(std::move(edge));
}
VisitUnknownType(qualType, displayer, child_node);
}
void DisplayerVisitRecordType(const RecordType* rtype, Displayer* displayer, Displayer::Node* current_node){
RecordDecl* recordDecl=rtype->getDecl();
for(auto fieldDecl : recordDecl->fields()){
QualType qualType = fieldDecl->getType();//child type
Displayer::Node* child_node=new Displayer::Node;
child_node->qualType=qualType;
{
std::unique_ptr<Displayer::Edge> edge = std::make_unique<Displayer::Edge>(
child_node, Displayer::EdgeType::StructEdge, fieldDecl->getNameAsString());
current_node->edges.push_back(std::move(edge));
}
VisitUnknownType(qualType, displayer, child_node);
}
}
void DisplayerStartDrawStruct(const RecordDecl* RD, Displayer* displayer){
const RecordType* recordType = RD->getTypeForDecl()->getAsStructureType();
DisplayerVisitRecordType(recordType, displayer, displayer->GetRootNode());
}
clang递归遍历recorddecl
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 二叉树的遍历是解决树类问题的关键,二叉树的遍历分为递归和非递归。一般来说,递归的非递归的简单许多,但是一般要求能够...
- 在我所做的项目中,不可缺的一个第三方库-----MJExtension,它可以非常方便地用来构造我们项目的模型层。...