void ViewCompilerImpl::codegen_class(const std::string &name) { declared_types.insert(name); const ViewClassType &type = class_types[name]; if (type.name.empty()) return; if (!type.base.empty()) { if (declared_types.find(type.base) == declared_types.end()) codegen_class(type.base); } add_line(""); if (!type.base.empty()) add_line("\tclass %1 : public %2", type.name, type.base); else add_line("\tclass %1 : public View", type.name); add_line("\t{"); add_line("\tpublic:"); add_line("\t\t%1();", type.name); codegen_class_children(type.children); add_line("\t};"); }
/* * codegen_classes: Generate code for all classes. */ void codegen_classes(void) { list_type templist, c = NULL; int numclasses, classpos, endpos, i; /* Make list of only classes which appeared in current source file */ for (templist = st.classes; templist != NULL; templist = templist->next) if ( ((class_type) (templist->data))->is_new == True) c = list_add_item(c, templist->data); /* Write out # of classes */ numclasses = list_length(c); OutputInt(outfile, numclasses); classpos = FileCurPos(outfile); /* Write out class table */ for (i=0; i < numclasses; i++) { /* Leave space for class id # */ OutputInt(outfile, 0); /* Leave space for class offset */ OutputInt(outfile, 0); } /* Loop through classes found in source code */ for ( ; c != NULL; c = c->next) { class_type each_class = (class_type) (c->data); /* Backpatch in class id # and offset of current class */ endpos = FileCurPos(outfile); FileGoto(outfile, classpos); OutputInt(outfile, each_class->class_id->idnum); OutputInt(outfile, endpos); classpos = FileCurPos(outfile); /* Move to next entry */ FileGotoEnd(outfile); codegen_class(each_class); if (!codegen_ok) return; } }
std::string ViewCompilerImpl::codegen() { code.clear(); add_line(""); add_line("// Note: this file was autogenerated by the uicore view compiler"); add_line(""); add_line("#pragma once"); add_line(""); add_line("#include <uicore.h>"); add_line(""); add_line("namespace uiview"); add_line("{"); add_line("\tusing namespace uicore;"); add_line(""); for (const auto &it : class_types) { const ViewClassType &type = it.second; add_line("\tclass %1;", type.name); } for (const auto &it : class_types) { codegen_class(it.first); } for (const auto &it : class_types) { codegen_constructor(it.first); } add_line("}"); return code; }