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,它可以非常方便地用来构造我们项目的模型层。...