void ProtoBufExport::Record(clang::RecordDecl const *record) { exportData([&](ct::proto::Envelope &env) { ct::proto::RecordDef *rec; if (clang::CXXRecordDecl const *cxxRecord = clang::dyn_cast<clang::CXXRecordDecl>(record)) { auto cRecord = env.mutable_c_record(); rec = cRecord->mutable_base(); std::for_each(cxxRecord->bases_begin(), cxxRecord->bases_end(), [&](clang::CXXBaseSpecifier const &base) { mapper.ResolveType(*cRecord->add_parents(), base.getType()); }); } else { rec = env.mutable_record(); } if (record->isClass()) { rec->set_variant(ct::proto::RecordDef_Variant_CLASS); } else if (record->isStruct()) { rec->set_variant(ct::proto::RecordDef_Variant_STRUCT); } else if (record->isUnion()) { rec->set_variant(ct::proto::RecordDef_Variant_UNION); } else { rec->set_variant(ct::proto::RecordDef_Variant_UNKNOWN); } mapper.ResolveType(*rec->mutable_internal_type(), clang::QualType(record->getTypeForDecl(), 0)); mapper.ResolveName(*rec->mutable_name(), *record); if (record->hasBody()) { mapper.ResolveLocation(*rec->mutable_definition(), record->getBody()->getSourceRange()); } }); }
/*=============================================== * add_parents -- add parents to tree recursively *=============================================*/ static DISPNODE add_parents (NODE indi, INT gen, INT maxgen, INT * count) { DISPNODE tn = alloc_displaynode(); tn->keynum = indi_to_keynum(indi); tn->firstchild = 0; tn->nextsib = 0; (*count)++; if (gen<maxgen) { tn->firstchild = add_parents(indi_to_fath(indi), gen+1, maxgen, count); /* reload indi in case lost from cache */ if (tn->keynum) indi=keynum_to_indi(tn->keynum); tn->firstchild->nextsib = add_parents(indi_to_moth(indi), gen+1, maxgen, count); } return tn; }
/*===================================================== * show_ancestors -- build ancestor tree & print it out * Build a displaynode tree then print it out in * inorder traversal * Created: 2000/12/07, Perry Rapp *===================================================*/ void pedigree_draw_ancestors (RECORD irec, CANVASDATA canvas, BOOLEAN reuse) { int gen=0; INT row = canvas->rect->top; INT indent = get_indent(); /* build displaynode tree */ if (!reuse) { INT count=0; free_entire_tree(); Root = add_parents(nztop(irec), gen, Gens, &count); set_scroll_max(canvas, count); } check_scroll_max(canvas); /* inorder traversal */ trav_bin_in_print_tn(Root, &row, gen, indent, canvas); }