QString BaseGenerator::getDefaultValue(const BaseField *field) { switch(type) { case BaseField::TYPE_INT: return QString::number(static_cast<const IntField *>(field)->defaultValue); case BaseField::TYPE_DOUBLE: return QString::number(static_cast<const DoubleField *>(field)->defaultValue); case BaseField::TYPE_BOOL: return static_cast<const BoolField *>(field)->defaultValue ? "true" : "false"; case BaseField::TYPE_ENUM: return QString::number(static_cast<const EnumField *>(field)->defaultValue); case BaseField::TYPE_STRING: return QString("\"") + QString(static_cast<const StringField *>(field)->defaultValue.c_str()) + QString("\""); case BaseField::TYPE_POINTER: return "NULL"; case BaseField::TYPE_COMPOSITE: { const CompositeField *cfield = static_cast<const CompositeField *>(field); const Reflection *referent = cfield->reflection; return toCamelCase(referent->name.name, true) + "()"; } case BaseField::TYPE_COMPOSITE_ARRAY: { const CompositeArrayField *cafield = static_cast<const CompositeArrayField *>(field); const Reflection *referent = cafield->reflection; return QString("std::vector<") + toCamelCase(referent->name.name, true) + ">()"; } default: return "/* Something is not supported by generator */"; } }
QString BaseGenerator::getCppTypeForElementType(const BaseField::FieldType type) { switch(type) { case BaseField::TYPE_INT: return "int"; case BaseField::TYPE_TIMESTAMP: return "int64_t"; case BaseField::TYPE_DOUBLE: return "double"; case BaseField::TYPE_BOOL: return "bool"; case BaseField::TYPE_STRING: return "std::string"; case BaseField::TYPE_WSTRING: return "std::wstring"; case BaseField::TYPE_ENUM: { QString enumName = toCamelCase(QString(static_cast<const EnumField*>(field)->enumReflection->name.name), true); return enumName+"::"+enumName; } case BaseField::TYPE_POINTER: return QString(static_cast<const PointerField*>(field)->targetClass) + " *"; case BaseField::TYPE_COMPOSITE: return toCamelCase(static_cast<const CompositeField *>(field)->typeName, true); case BaseField::TYPE_COMPOSITE_ARRAY: return QString("std::vector<") + toCamelCase(static_cast<const CompositeField *>(field)->typeName, true) + ">"; default: return "/* Something is not supported by generator */"; } }
QString BaseGenerator::getDefaultElementValue(const BaseField *field) { switch(type) { case BaseField::TYPE_INT: case (BaseField::TYPE_INT | BaseField::TYPE_VECTOR_BIT): return QString::number(static_cast<const IntField *>(field)->defaultValue); case BaseField::TYPE_DOUBLE: case (BaseField::TYPE_DOUBLE | BaseField::TYPE_VECTOR_BIT): return QString::number(static_cast<const DoubleField *>(field)->defaultValue); case BaseField::TYPE_BOOL: return static_cast<const BoolField *>(field)->defaultValue ? "true" : "false"; case BaseField::TYPE_ENUM: return QString::number(static_cast<const EnumField *>(field)->defaultValue); case BaseField::TYPE_STRING: return QString("\"") + QString::fromStdString (static_cast<const StringField *>(field)->defaultValue) + QString("\""); case BaseField::TYPE_WSTRING: { QString result; result += "L\""; std::wstring wstr = static_cast<const WStringField *>(field)->defaultValue; for (std::wstring::size_type i = 0; i < wstr.size(); i++) { uint32_t c = (uint32_t)wstr[i]; result += "\\u"; result += QString("%1").arg((uint)c, 4, 16, QLatin1Char('0')); } result += "\""; return result; } case BaseField::TYPE_POINTER: return "NULL"; case BaseField::TYPE_COMPOSITE: { const CompositeField *cfield = static_cast<const CompositeField *>(field); const Reflection *referent = cfield->reflection; return toCamelCase(referent->name.name, true) + "()"; } case BaseField::TYPE_COMPOSITE_ARRAY: { const CompositeArrayField *cafield = static_cast<const CompositeArrayField *>(field); const Reflection *referent = cafield->reflection; return QString("std::vector<") + toCamelCase(referent->name.name, true) + ">()"; } default: return "/* default value is not supported by generator */"; } }
QString StringKit::toPascalCase(const QString& str) { if (str.isEmpty()) return ""; QString tmpStr = toCamelCase(str); tmpStr[0] = tmpStr.at(0).toUpper(); return tmpStr; }
void ClassTemplate::addTypelistGetter(const QString &aName, const QString &aValue) { QStringList types = aValue.split(";"); if(types.size() == 1 && types[0] == "empty") types = QStringList{}; QString content = "{"; for(int i = 0; i < types.size(); i++) { QString item = types[i]; item = item.remove(" "); if(item.contains("-component")) localIncludes_.insert("generated/" + toCamelCase(item, true)); content += toCamelCase(item, true); content += "::TYPE"; if(i != types.size() - 1) content += ", "; } content += "}"; content = "\tQStringList list = QStringList" + content + ";\n"; content += "\treturn list;\n"; addMethod("QStringList", aName, "", content, true); }
std::string toLowerCamelCase(const std::string& s) { std::string result = toCamelCase(s); result = boost::regex_replace(result,boost::regex("^([A-Z])"),"\\l$1"); return result; }
std::string toUpperCamelCase(const std::string& s) { std::string result = toCamelCase(s); result = boost::regex_replace(result,boost::regex("^([a-z])"),"\\u$1"); return result; }
QString BaseGenerator::getWidgetNameForName(QString name) { return toCamelCase(name, true) + getWidgetSuffixForType(BaseField::TYPE_COMPOSITE); }
void ClassTemplate::resolveStringProperty(ClassProperty *aProperty, QSet<ClassProperty *> &aCleanSet, QSet<ClassProperty *> &aCallstack, QSet<ClassProperty *>aAll) { //qDebug() << "resolveStringProperty " << aProperty->name(); if(aCallstack.contains(aProperty)) { qDebug() << "Property tokens circular dependency! " + aProperty->name(); return; } if(aCleanSet.contains(aProperty)) { //resolved already return; } QString value = aProperty->defaultValue(); if((!value.contains("{") && !value.contains("}")) || aProperty->isConst()) { aCleanSet.insert(aProperty); if(!aProperty->isConst()) initializationSection_ += "\t" + aProperty->name() + " = " + wrap(value) + ";\n"; //nothing to resolve return; } QRegularExpression token("\\{([^\\}]+)\\}"); QString temp = value; QRegularExpressionMatchIterator i = token.globalMatch(value); while (i.hasNext()) { QRegularExpressionMatch match = i.next(); QString toReplace = match.captured(0); if(toReplace == "{a}") continue;//skipping article QString token = toReplace; token = token.replace("{", ""); token = token.replace("}", ""); ClassProperty *property = propertyByName(token, aAll); if(!property) { temp = temp.replace(toReplace, "\" + " + toCamelCase(token, false) + "() + \""); } else if(aCleanSet.contains(property)) { temp = temp.replace(toReplace, "\" + " + toCamelCase(token, false) + "() + \""); } else { /*aCallstack.insert(aProperty); resolveStringProperty(property, aCleanSet, aCallstack, aAll);//recursion temp = temp.replace(toReplace, "\" + " + toCamelCase(token, false) + "_ + \""); aCallstack.remove(aProperty);*/ qDebug() << "Pattern contains non-const tokens: " + value; } } aCleanSet.insert(aProperty); initializationSection_ += "\t" + aProperty->name() + " = " + wrap(temp) + ";\n"; }