diff options
Diffstat (limited to 'sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp')
-rw-r--r-- | sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp | 134 |
1 files changed, 88 insertions, 46 deletions
diff --git a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp index c194c0ea4..9410bc158 100644 --- a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp +++ b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp @@ -55,6 +55,13 @@ static inline QString briefAttribute() { return QStringLiteral("brief"); } static inline QString none() { return QStringLiteral("None"); } +static void stripPythonQualifiers(QString *s) +{ + const int lastSep = s->lastIndexOf(QLatin1Char('.')); + if (lastSep != -1) + s->remove(0, lastSep + 1); +} + static bool shouldSkip(const AbstractMetaFunction* func) { // Constructors go to separate section @@ -167,12 +174,33 @@ static QTextStream &ensureEndl(QTextStream &s) return s; } -static void formatSince(QTextStream &s, const char *what, const TypeEntry *te) +static inline QVersionNumber versionOf(const TypeEntry *te) { - if (te && te->version() > QVersionNumber(0, 0)) { - s << ".. note:: This " << what << " was introduced in Qt " - << te->version().toString() << '.' << endl; + if (te) { + const auto version = te->version(); + if (!version.isNull() && version > QVersionNumber(0, 0)) + return version; } + return QVersionNumber(); +} + +struct rstVersionAdded +{ + explicit rstVersionAdded(const QVersionNumber &v) : m_version(v) {} + + const QVersionNumber m_version; +}; + +static QTextStream &operator<<(QTextStream &s, const rstVersionAdded &v) +{ + s << ".. versionadded:: "<< v.m_version.toString() << "\n\n"; + return s; +} + +static QByteArray rstDeprecationNote(const char *what) +{ + return QByteArrayLiteral(".. note:: This ") + + what + QByteArrayLiteral(" is deprecated.\n\n"); } // RST anchor string: Anything else but letters, numbers, '_' or '.' replaced by '-' @@ -1013,22 +1041,19 @@ static QString fixLinkText(const QtXmlToSphinx::LinkContext *linkContext, || linkContext->type == QtXmlToSphinx::LinkContext::Reference) { return linktext; } - // For the language reference documentation, clear the link text if it matches - // the function/class/enumeration name. - linktext.replace(QLatin1String("::"), QLatin1String(".")); + // For the language reference documentation, strip the module name. + // Clear the link text if that matches the function/class/enumeration name. + const int lastSep = linktext.lastIndexOf(QLatin1String("::")); + if (lastSep != -1) + linktext.remove(0, lastSep + 2); + else + stripPythonQualifiers(&linktext); if (linkContext->linkRef == linktext) return QString(); if ((linkContext->type & QtXmlToSphinx::LinkContext::FunctionMask) != 0 && (linkContext->linkRef + QLatin1String("()")) == linktext) { return QString(); } - const QStringRef item = linkContext->linkRef.splitRef(QLatin1Char('.')).constLast(); - if (item == linktext) - return QString(); - if ((linkContext->type & QtXmlToSphinx::LinkContext::FunctionMask) != 0 - && (item + QLatin1String("()")) == linktext) { - return QString(); - } return linktext; } @@ -1576,7 +1601,11 @@ void QtDocGenerator::generateClass(QTextStream &s, GeneratorContext &classContex writeInheritedByList(s, metaClass, classes()); - formatSince(s, "class", metaClass->typeEntry()); + const auto version = versionOf(metaClass->typeEntry()); + if (!version.isNull()) + s << rstVersionAdded(version); + if (metaClass->attributes().testFlag(AbstractMetaAttributes::Deprecated)) + s << rstDeprecationNote("class"); writeFunctionList(s, metaClass); @@ -1608,7 +1637,7 @@ void QtDocGenerator::generateClass(QTextStream &s, GeneratorContext &classContex else s << ".. method:: "; - writeFunction(s, true, metaClass, func); + writeFunction(s, metaClass, func); } writeInjectDocumentation(s, TypeSystem::DocModificationAppend, metaClass, 0); @@ -1697,7 +1726,9 @@ void QtDocGenerator::writeEnums(QTextStream& s, const AbstractMetaClass* cppClas for (AbstractMetaEnum *en : enums) { s << section_title << getClassTargetFullName(cppClass) << '.' << en->name() << endl << endl; writeFormattedText(s, en->documentation(), cppClass); - formatSince(s, "enum", en->typeEntry()); + const auto version = versionOf(en->typeEntry()); + if (!version.isNull()) + s << rstVersionAdded(version); } } @@ -1717,7 +1748,6 @@ void QtDocGenerator::writeFields(QTextStream& s, const AbstractMetaClass* cppCla void QtDocGenerator::writeConstructors(QTextStream& s, const AbstractMetaClass* cppClass) { static const QString sectionTitle = QLatin1String(".. class:: "); - static const QString sectionTitleSpace = QString(sectionTitle.size(), QLatin1Char(' ')); AbstractMetaFunctionList lst = cppClass->queryFunctions(AbstractMetaClass::Constructors | AbstractMetaClass::Visible); for (int i = lst.size() - 1; i >= 0; --i) { @@ -1728,14 +1758,23 @@ void QtDocGenerator::writeConstructors(QTextStream& s, const AbstractMetaClass* bool first = true; QHash<QString, AbstractMetaArgument*> arg_map; + IndentorBase<1> indent1; + indent1.indent = INDENT.total(); for (AbstractMetaFunction *func : qAsConst(lst)) { + s << indent1; if (first) { first = false; s << sectionTitle; - } else { - s << sectionTitleSpace; + indent1.indent += sectionTitle.size(); } - writeFunction(s, false, cppClass, func); + s << functionSignature(cppClass, func) << "\n\n"; + + const auto version = versionOf(func->typeEntry()); + if (!version.isNull()) + s << indent1 << rstVersionAdded(version); + if (func->attributes().testFlag(AbstractMetaAttributes::Deprecated)) + s << indent1 << rstDeprecationNote("constructor"); + const AbstractMetaArgumentList &arguments = func->arguments(); for (AbstractMetaArgument *arg : arguments) { if (!arg_map.contains(arg->name())) { @@ -1747,7 +1786,7 @@ void QtDocGenerator::writeConstructors(QTextStream& s, const AbstractMetaClass* s << endl; for (QHash<QString, AbstractMetaArgument*>::const_iterator it = arg_map.cbegin(), end = arg_map.cend(); it != end; ++it) { - Indentation indentation(INDENT); + Indentation indentation(INDENT, 2); writeParameterType(s, cppClass, it.value()); } @@ -1910,7 +1949,7 @@ bool QtDocGenerator::writeInjectDocumentation(QTextStream& s, return didSomething; } -void QtDocGenerator::writeFunctionSignature(QTextStream& s, const AbstractMetaClass* cppClass, const AbstractMetaFunction* func) +QString QtDocGenerator::functionSignature(const AbstractMetaClass* cppClass, const AbstractMetaFunction* func) { QString className; if (!func->isConstructor()) @@ -1922,23 +1961,25 @@ void QtDocGenerator::writeFunctionSignature(QTextStream& s, const AbstractMetaCl if (!funcName.startsWith(className)) funcName = className + funcName; - s << funcName << "(" << parseArgDocStyle(cppClass, func) << ")"; + return funcName + QLatin1Char('(') + parseArgDocStyle(cppClass, func) + + QLatin1Char(')'); } QString QtDocGenerator::translateToPythonType(const AbstractMetaType* type, const AbstractMetaClass* cppClass) { QString strType; - if (type->name() == QLatin1String("QString")) { + const QString name = type->name(); + if (name == QLatin1String("QString")) { strType = QLatin1String("unicode"); - } else if (type->name() == QLatin1String("QVariant")) { + } else if (name == QLatin1String("QVariant")) { strType = QLatin1String("object"); - } else if (type->name() == QLatin1String("QStringList")) { + } else if (name == QLatin1String("QStringList")) { strType = QLatin1String("list of strings"); - } else if (type->isConstant() && type->name() == QLatin1String("char") && type->indirections() == 1) { + } else if (type->isConstant() && name == QLatin1String("char") && type->indirections() == 1) { strType = QLatin1String("str"); - } else if (type->name().startsWith(QLatin1String("unsigned short"))) { + } else if (name.startsWith(QLatin1String("unsigned short"))) { strType = QLatin1String("int"); - } else if (type->name().startsWith(QLatin1String("unsigned "))) { // uint and ulong + } else if (name.startsWith(QLatin1String("unsigned "))) { // uint and ulong strType = QLatin1String("long"); } else if (type->isContainer()) { QString strType = translateType(type, cppClass, Options(ExcludeConst) | ExcludeReference); @@ -1962,7 +2003,7 @@ QString QtDocGenerator::translateToPythonType(const AbstractMetaType* type, cons refTag = QLatin1String("attr"); else refTag = QLatin1String("class"); - strType = QLatin1Char(':') + refTag + QLatin1String(":`") + type->fullName() + QLatin1Char('`'); + strType = QLatin1Char(':') + refTag + QLatin1String(":`") + name + QLatin1Char('`'); } return strType; } @@ -1976,8 +2017,6 @@ void QtDocGenerator::writeParameterType(QTextStream& s, const AbstractMetaClass* void QtDocGenerator::writeFunctionParametersType(QTextStream &s, const AbstractMetaClass *cppClass, const AbstractMetaFunction *func) { - Indentation indentation(INDENT); - s << endl; const AbstractMetaArgumentList &funcArgs = func->arguments(); for (AbstractMetaArgument *arg : funcArgs) { @@ -2009,22 +2048,25 @@ void QtDocGenerator::writeFunctionParametersType(QTextStream &s, const AbstractM s << endl; } -void QtDocGenerator::writeFunction(QTextStream& s, bool writeDoc, const AbstractMetaClass* cppClass, const AbstractMetaFunction* func) +void QtDocGenerator::writeFunction(QTextStream& s, const AbstractMetaClass* cppClass, + const AbstractMetaFunction* func) { - writeFunctionSignature(s, cppClass, func); - s << endl; - - formatSince(s, "method", func->typeEntry()); + s << functionSignature(cppClass, func) << "\n\n"; - if (writeDoc) { - s << endl; + { + Indentation indentation(INDENT); writeFunctionParametersType(s, cppClass, func); - s << endl; - writeInjectDocumentation(s, TypeSystem::DocModificationPrepend, cppClass, func); - if (!writeInjectDocumentation(s, TypeSystem::DocModificationReplace, cppClass, func)) - writeFormattedText(s, func->documentation(), cppClass); - writeInjectDocumentation(s, TypeSystem::DocModificationAppend, cppClass, func); + const auto version = versionOf(func->typeEntry()); + if (!version.isNull()) + s << INDENT << rstVersionAdded(version); + if (func->attributes().testFlag(AbstractMetaAttributes::Deprecated)) + s << INDENT << rstDeprecationNote("function"); } + + writeInjectDocumentation(s, TypeSystem::DocModificationPrepend, cppClass, func); + if (!writeInjectDocumentation(s, TypeSystem::DocModificationReplace, cppClass, func)) + writeFormattedText(s, func->documentation(), cppClass); + writeInjectDocumentation(s, TypeSystem::DocModificationAppend, cppClass, func); } static void writeFancyToc(QTextStream& s, const QStringList& items, int cols = 4) @@ -2159,7 +2201,7 @@ void QtDocGenerator::writeModuleDocumentation() Documentation moduleDoc = m_docParser->retrieveModuleDocumentation(it.key()); if (moduleDoc.format() == Documentation::Native) { QString context = it.key(); - context.remove(0, context.lastIndexOf(QLatin1Char('.')) + 1); + stripPythonQualifiers(&context); QtXmlToSphinx x(this, moduleDoc.value(), context); s << x; } else { |