Example #1
0
	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};");
	}
Example #2
0
/*
 * 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;
   }
}
Example #3
0
	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;
	}