aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp')
-rw-r--r--sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp134
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 {