void ShellGenerator::writeTypeInfo(QTextStream &s, const AbstractMetaType *type, Option options) { if ((options & OriginalTypeDescription) && !type->originalTypeDescription().isEmpty()) { s << type->originalTypeDescription(); return; } if (type->isArray()) { writeTypeInfo(s, type->arrayElementType(), options); if (options & ArrayAsPointer) { s << "*"; } else { s << "[" << type->arrayElementCount() << "]"; } return; } const TypeEntry *te = type->typeEntry(); if (type->isConstant() && !(options & ExcludeConst)) s << "const "; if ((options & EnumAsInts) && (te->isEnum() || te->isFlags())) { s << "int"; } else if (te->isFlags()) { s << ((FlagsTypeEntry *) te)->originalName(); } else { s << fixCppTypeName(te->qualifiedCppName()); } if (type->instantiations().size() > 0 && (!type->isContainer() || (static_cast<const ContainerTypeEntry *>(te))->type() != ContainerTypeEntry::StringListContainer)) { s << '<'; QList<AbstractMetaType *> args = type->instantiations(); bool nested_template = false; for (int i=0; i<args.size(); ++i) { if (i != 0) s << ", "; nested_template |= args.at(i)->isContainer(); writeTypeInfo(s, args.at(i)); } if (nested_template) s << ' '; s << '>'; } s << QString(type->indirections(), '*'); if (type->isReference() && !(options & ExcludeReference) && !(options & ConvertReferenceToPtr)) s << "&"; if (type->isReference() && (options & ConvertReferenceToPtr)) { s << "*"; } if (!(options & SkipName)) s << ' '; }
void CppGenerator::writeFunctionArguments(QTextStream &s, const AbstractMetaArgumentList &arguments, Option option, int numArguments) { if (numArguments < 0) numArguments = arguments.size(); for (int i=0; i<numArguments; ++i) { if (i != 0) s << ", "; AbstractMetaArgument *arg = arguments.at(i); writeTypeInfo(s, arg->type(), option); if (!(option & SkipName)) s << " " << arg->indexedName(); if ((option & IncludeDefaultExpression) && !arg->originalDefaultValueExpression().isEmpty()) { s << " = "; QString expr = arg->originalDefaultValueExpression(); if (arg->type()->typeEntry()->isEnum() && expr.indexOf("::") < 0) s << ((EnumTypeEntry *)arg->type()->typeEntry())->qualifier() << "::"; s << expr; } } }
void ShellGenerator::writeFunctionArguments(QTextStream &s, const AbstractMetaClass* owner, const AbstractMetaArgumentList &arguments, Option option, int numArguments) { if (numArguments < 0) numArguments = arguments.size(); for (int i=0; i<numArguments; ++i) { if (i != 0) s << ", "; AbstractMetaArgument *arg = arguments.at(i); writeTypeInfo(s, arg->type(), option); if (!(option & SkipName)) { if (option & UseIndexedName) { s << " " << arg->indexedName(); } else { s << " " << arg->argumentName(); } } if ((option & IncludeDefaultExpression) && !arg->defaultValueExpression().isEmpty()) { s << " = "; QString expr = arg->defaultValueExpression(); if (expr != "0") { QString qualifier; if (arg->type()->typeEntry()->isEnum() && expr.indexOf("::") < 0) { qualifier = ((EnumTypeEntry *)arg->type()->typeEntry())->qualifier(); } else if (arg->type()->typeEntry()->isFlags() && expr.indexOf("::") < 0) { qualifier = ((FlagsTypeEntry *)arg->type()->typeEntry())->originator()->qualifier(); } if (!qualifier.isEmpty()) { s << qualifier << "::"; } } s << expr; } } }
void CppGenerator::writeTypeInfo(QTextStream &s, const AbstractMetaType *type, Option options) { if ((options & OriginalTypeDescription) && !type->originalTypeDescription().isEmpty()) { QString originalTypeDescription = type->originalTypeDescription(); if (options & NormalizeAndFixTypeSignature) { originalTypeDescription = QMetaObject::normalizedSignature(originalTypeDescription.toLatin1().constData()); originalTypeDescription = fixNormalizedSignatureForQt(originalTypeDescription); } s << originalTypeDescription; return; } if (type->isArray()) { writeTypeInfo(s, type->arrayElementType(), options); if (options & ArrayAsPointer) { s << "*"; } else { s << "[" << type->arrayElementCount() << "]"; } return; } const TypeEntry *te = type->typeEntry(); if (type->isConstant() && !(options & ExcludeConst)) s << "const "; if ((options & EnumAsInts) && (te->isEnum() || te->isFlags())) { s << "int"; } else if (te->isFlags()) { s << ((FlagsTypeEntry *) te)->originalName(); } else { if (options & VirtualDispatch && te->name() == "QModelIndex") s << "QModelIndexAccessor"; else s << fixCppTypeName(te->qualifiedCppName()); } if (type->instantiations().size() > 0 && (!type->isContainer() || (static_cast<const ContainerTypeEntry *>(te))->type() != ContainerTypeEntry::StringListContainer)) { s << '<'; QList<AbstractMetaType *> args = type->instantiations(); bool nested_template = false; for (int i=0; i<args.size(); ++i) { if (i != 0) s << ", "; nested_template |= args.at(i)->isContainer(); writeTypeInfo(s, args.at(i)); } if (nested_template) s << ' '; s << '>'; } int actual_indirections = type->indirections(); // for getting C++ elements from array we want pointers even if elements are // values because wrapper actually contains pointers if ((options & ForcePointer) && actual_indirections == 0 && !type->isPrimitive() && !type->typeEntry()->isStructInD() && type->name() != "QModelIndex" && !type->isEnum()) actual_indirections = 1; s << QString(actual_indirections, '*'); if (type->isReference() && !(options & ExcludeReference)) s << "&"; if (!(options & SkipName)) s << ' '; }
void CppGenerator::writeFunctionSignature(QTextStream &s, const AbstractMetaFunction *java_function, const AbstractMetaClass *implementor, const QString &name_prefix, Option option, const QString &classname_prefix, const QStringList &extra_arguments, int numArguments) { // ### remove the implementor AbstractMetaType *function_type = java_function->type(); if (java_function->isStatic() && (option & ShowStatic)) s << "static "; if ((option & SkipReturnType) == 0) { if (function_type) { writeTypeInfo(s, function_type, option); s << " "; } else if (!java_function->isConstructor()) { s << "void "; } } if (implementor) { if (classname_prefix.isEmpty()) s << shellClassName(implementor) << "::"; else s << classname_prefix << implementor->name() << "::"; } QString function_name; if (option & OriginalName) function_name = java_function->originalName(); else function_name = java_function->name(); if (option & UnderscoreSpaces) function_name = function_name.replace(' ', '_'); if (java_function->isConstructor()) function_name = shellClassName(java_function->ownerClass()); s << name_prefix << function_name; if (java_function->attributes() & AbstractMetaAttributes::SetterFunction) s << "_setter"; else if (java_function->attributes() & AbstractMetaAttributes::GetterFunction) s << "_getter"; s << "("; const AbstractMetaClass *owner = java_function->ownerClass(); bool has_d_ptr = java_function->isConstructor() && owner && (owner->isPolymorphic()/* || owner->typeEntry()->isObject()*/ ); const AbstractMetaArgumentList arg_list = java_function->arguments(); if (has_d_ptr) { s << "void *d_ptr"; if (arg_list.size() > 0) s << ", "; } writeFunctionArguments(s, arg_list, option, numArguments); // The extra arguments... for (int i=0; i<extra_arguments.size(); ++i) { if (i > 0 || java_function->arguments().size() != 0) s << ", "; s << extra_arguments.at(i); } s << ")"; if (java_function->isConstant()) s << " const"; }
void ShellGenerator::writeFunctionSignature(QTextStream &s, const AbstractMetaFunction *meta_function, const AbstractMetaClass *implementor, const QString &name_prefix, Option option, const QString &classname_prefix, const QStringList &extra_arguments, int numArguments) { // ### remove the implementor AbstractMetaType *function_type = meta_function->type(); if ((option & SkipReturnType) == 0) { if (function_type) { writeTypeInfo(s, function_type, option); s << " "; } else if (!meta_function->isConstructor()) { s << "void "; } } if (implementor) { if (classname_prefix.isEmpty()) s << wrapperClassName(implementor) << "::"; else s << classname_prefix << implementor->name() << "::"; } QString function_name; if (option & OriginalName) function_name = meta_function->originalName(); else function_name = meta_function->name(); if (option & UnderscoreSpaces) function_name = function_name.replace(' ', '_'); if (meta_function->isConstructor()) function_name = meta_function->ownerClass()->name(); if (meta_function->isStatic() && (option & ShowStatic)) { function_name = "static_" + meta_function->ownerClass()->name() + "_" + function_name; } if (function_name.startsWith("operator")) { function_name = meta_function->name(); } if (meta_function->attributes() & AbstractMetaAttributes::SetterFunction) s << "py_set_"; else if (meta_function->attributes() & AbstractMetaAttributes::GetterFunction) s << "py_get_"; s << name_prefix << function_name; s << "("; if ((option & FirstArgIsWrappedObject) && meta_function->ownerClass() && !meta_function->isConstructor() && !meta_function->isStatic()) { s << meta_function->ownerClass()->qualifiedCppName() << "* theWrappedObject"; if (meta_function->arguments().size() != 0) { s << ", "; } } writeFunctionArguments(s, meta_function->ownerClass(), meta_function->arguments(), Option(option & Option(~ConvertReferenceToPtr)), numArguments); // The extra arguments... for (int i=0; i<extra_arguments.size(); ++i) { if (i > 0 || meta_function->arguments().size() != 0) s << ", "; s << extra_arguments.at(i); } s << ")"; if (meta_function->isConstant()) s << " const"; }