string InterfaceGenerator::generateClass(Class &c) { string tmp = TEMPLATE_CLASS; replaceAll(tmp, "<namespaceStart>", generateNamespaceStart(c.namesp)); replaceAll(tmp, "<namespaceEnd>", generateNamespaceEnd(c.namesp)); replaceAll(tmp, "<className>", "I" + c.name); replaceAll(tmp, "<classComment>", "[interface] I" + c.name + ": " + c.comment); replaceAll(tmp, "<interfaceName>", c.fullName); std::string ms; //methods for (Method::List::iterator m = c.methods.begin(); m != c.methods.end(); m++) { ms.append(generateMethod(*m)); } replaceAll(tmp, "<methods>", ms); std::string ss; //methods for (Signal::List::iterator s = c.signals.begin(); s != c.signals.end(); s++) { ss.append(generateSignal(*s)); } replaceAll(tmp, "<signals>", ss); return tmp; }
void SmokeClassFiles::writeClass(QTextStream& out, const Class* klass, const QString& className, QSet<QString>& includes) { const QString underscoreName = QString(className).replace("::", "__"); const QString smokeClassName = "x_" + underscoreName; QString switchCode; QTextStream switchOut(&switchCode); out << QString("class %1").arg(smokeClassName); if (!klass->isNameSpace()) out << QString(" : public %1").arg(className); out << " {\n"; if (Util::canClassBeInstanciated(klass)) { out << " SmokeBinding* _binding;\n"; out << "public:\n"; out << " void x_0(Smoke::Stack x) {\n"; out << " // set the smoke binding\n"; out << " _binding = (SmokeBinding*)x[1].s_class;\n"; out << " }\n"; switchOut << " case 0: xself->x_0(args);\tbreak;\n"; } else { out << "public:\n"; } int xcall_index = 1; const Method *destructor = 0; foreach (const Method& meth, klass->methods()) { if (meth.access() == Access_private) continue; if (meth.isDestructor()) { destructor = &meth; continue; } switchOut << " case " << xcall_index << ": " << (((meth.flags() & Method::Static) || meth.isConstructor()) ? smokeClassName + "::" : "xself->") << "x_" << xcall_index << "(args);\tbreak;\n"; if (Util::fieldAccessors.contains(&meth)) { // accessor method? const Field* field = Util::fieldAccessors[&meth]; if (meth.name().startsWith("set")) { generateSetAccessor(out, className, *field, meth.parameters()[0].type(), xcall_index); } else { generateGetAccessor(out, className, *field, meth.type(), xcall_index); } } else { generateMethod(out, className, smokeClassName, meth, xcall_index, includes); } xcall_index++; } QString enumCode; QTextStream enumOut(&enumCode); const Enum* e = 0; bool enumFound = false; foreach (const BasicTypeDeclaration* decl, klass->children()) { if (!(e = dynamic_cast<const Enum*>(decl))) continue; if (e->access() == Access_private) continue; foreach (const EnumMember& member, e->members()) { switchOut << " case " << xcall_index << ": " << smokeClassName << "::x_" << xcall_index << "(args);\tbreak;\n"; if (e->parent()) generateEnumMemberCall(out, className, member.name(), xcall_index++); else generateEnumMemberCall(out, e->nameSpace(), member.name(), xcall_index++); } // only generate the xenum_call if the enum has a valid name if (e->name().isEmpty()) continue; enumFound = true; // xenum_operation method code QString enumString = e->toString(); enumOut << " case " << m_smokeData->typeIndex[&types[enumString]] << ": //" << enumString << '\n'; enumOut << " switch(xop) {\n"; enumOut << " case Smoke::EnumNew:\n"; enumOut << " xdata = (void*)new " << enumString << ";\n"; enumOut << " break;\n"; enumOut << " case Smoke::EnumDelete:\n"; enumOut << " delete (" << enumString << "*)xdata;\n"; enumOut << " break;\n"; enumOut << " case Smoke::EnumFromLong:\n"; enumOut << " *(" << enumString << "*)xdata = (" << enumString << ")xvalue;\n"; enumOut << " break;\n"; enumOut << " case Smoke::EnumToLong:\n"; enumOut << " xvalue = (long)*(" << enumString << "*)xdata;\n"; enumOut << " break;\n"; enumOut << " }\n"; enumOut << " break;\n"; } foreach (const Method* meth, Util::virtualMethodsForClass(klass)) { generateVirtualMethod(out, *meth, includes); }