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());
            }
        });
    }
Exemple #2
0
/*===============================================
 * 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;
}
Exemple #3
0
/*=====================================================
 * 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);
}