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::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 << ' '; }