diff options
11 files changed, 231 insertions, 133 deletions
diff --git a/sources/pyside2/PySide2/__init__.py.in b/sources/pyside2/PySide2/__init__.py.in index 5c33c57a0..94683b463 100644 --- a/sources/pyside2/PySide2/__init__.py.in +++ b/sources/pyside2/PySide2/__init__.py.in @@ -64,7 +64,8 @@ def _setupQtDirectories(): # Trigger signature initialization. try: - type.__signature__ + # PYSIDE-829: Avoid non-existent attributes in compiled code (Nuitka). + eval("type.__signature__") except AttributeError: print(dedent('''\ {stars} diff --git a/sources/pyside2/libpyside/pysidesignal.cpp b/sources/pyside2/libpyside/pysidesignal.cpp index 367f85fff..aa215aa45 100644 --- a/sources/pyside2/libpyside/pysidesignal.cpp +++ b/sources/pyside2/libpyside/pysidesignal.cpp @@ -687,6 +687,8 @@ QByteArray getTypeName(PyObject *type) return QByteArrayLiteral("double"); if (objType == &PyBool_Type) return QByteArrayLiteral("bool"); + if (objType == &PyList_Type) + return QByteArrayLiteral("QVariantList"); if (Py_TYPE(objType) == SbkEnumType_TypeF()) return Shiboken::Enum::getCppName(objType); return QByteArrayLiteral("PyObject"); diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp index 3680375c4..6452a251a 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp +++ b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt for Python. @@ -88,6 +88,49 @@ const AbstractMetaClass *recurseClassHierarchy(const AbstractMetaClass *klass, } /******************************************************************************* + * Documentation + */ + +Documentation::Documentation(const QString &value, Documentation::Type t, Documentation::Format fmt) +{ + setValue(value, t, fmt); +} + +bool Documentation::isEmpty() const +{ + for (int i = 0; i < Type::Last; i++) { + if (!m_data.value(static_cast<Type>(i)).isEmpty()) + return false; + } + return true; +} + +QString Documentation::value(Documentation::Type t) const +{ + return m_data.value(t); +} + +void Documentation::setValue(const QString &value, Documentation::Type t, Documentation::Format fmt) +{ + const QString v = value.trimmed(); + if (v.isEmpty()) + m_data.remove(t); + else + m_data[t] = value.trimmed(); + m_format = fmt; +} + +Documentation::Format Documentation::format() const +{ + return m_format; +} + +void Documentation::setFormat(Documentation::Format f) +{ + m_format = f; +} + +/******************************************************************************* * AbstractMetaVariable */ diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.h b/sources/shiboken2/ApiExtractor/abstractmetalang.h index d99a54fc2..de7a1e3a5 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetalang.h +++ b/sources/shiboken2/ApiExtractor/abstractmetalang.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt for Python. @@ -39,6 +39,7 @@ #include <QtCore/qobjectdefs.h> #include <QtCore/QStringList> +#include <QtCore/QMap> QT_FORWARD_DECLARE_CLASS(QDebug) @@ -72,34 +73,27 @@ public: Native, Target }; + enum Type { + Detailed, + Brief, + Last + }; Documentation() = default; + Documentation(const QString& value, Type t = Documentation::Detailed, + Format fmt = Documentation::Native); - Documentation(const QString& value, Format fmt = Documentation::Native) - : m_data(value.trimmed()), m_format(fmt) {} - - bool isEmpty() const { return m_data.isEmpty(); } - - QString value() const - { - return m_data; - } - - void setValue(const QString& value, Format fmt = Documentation::Native) - { - m_data = value.trimmed(); - m_format = fmt; - } + bool isEmpty() const; - Documentation::Format format() const - { - return m_format; - } + QString value(Type t = Documentation::Detailed) const; + void setValue(const QString& value, Type t = Documentation::Detailed, + Format fmt = Documentation::Native); - void setFormat(Format f) { m_format = f; } + Documentation::Format format() const; + void setFormat(Format f); private: - QString m_data; + QMap<Type, QString> m_data; Format m_format = Documentation::Native; }; diff --git a/sources/shiboken2/ApiExtractor/doxygenparser.cpp b/sources/shiboken2/ApiExtractor/doxygenparser.cpp index 7c15db1ca..9fceb4328 100644 --- a/sources/shiboken2/ApiExtractor/doxygenparser.cpp +++ b/sources/shiboken2/ApiExtractor/doxygenparser.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt for Python. @@ -94,12 +94,24 @@ void DoxygenParser::fillDocumentation(AbstractMetaClass* metaClass) return; } + static const QList<QPair<Documentation::Type, QString>> docTags = { + { Documentation::Brief, QLatin1String("briefdescription") }, + { Documentation::Detailed, QLatin1String("detaileddescription") } + }; // Get class documentation - const QString classQuery = QLatin1String("/doxygen/compounddef/detaileddescription"); - QString classDoc = getDocumentation(xquery, classQuery, - metaClass->typeEntry()->docModifications()); - if (classDoc.isEmpty()) - qCWarning(lcShibokenDoc, "%s", qPrintable(msgCannotFindDocumentation(doxyFilePath, "class", metaClass->name(), classQuery))); + Documentation classDoc; + + for (const auto &tag : docTags) { + const QString classQuery = QLatin1String("/doxygen/compounddef/") + tag.second; + QString doc = getDocumentation(xquery, classQuery, + metaClass->typeEntry()->docModifications()); + if (doc.isEmpty()) + qCWarning(lcShibokenDoc, "%s", + qPrintable(msgCannotFindDocumentation(doxyFilePath, "class", metaClass->name(), + classQuery))); + else + classDoc.setValue(doc, tag.first); + } metaClass->setDocumentation(classDoc); //Functions Documentation @@ -128,28 +140,38 @@ void DoxygenParser::fillDocumentation(AbstractMetaClass* metaClass) if (!arg->type()->isPrimitive()) { query += QLatin1String("/../param[") + QString::number(i) + QLatin1String("]/type/ref[text()=\"") - + arg->type()->name() + QLatin1String("\"]/../.."); + + arg->type()->cppSignature().toHtmlEscaped() + + QLatin1String("\"]/../.."); } else { query += QLatin1String("/../param[") + QString::number(i) - + QLatin1String("]/type[text()=\"") - + arg->type()->name() + QLatin1String("\"]/.."); + + QLatin1String("]/type[text(), \"") + + arg->type()->cppSignature().toHtmlEscaped() + + QLatin1String("\"]/.."); } ++i; } } } - if (!isProperty) { - query += QLatin1String("/../detaileddescription"); - } else { - query = QLatin1Char('(') + query; - query += QLatin1String("/../detaileddescription)[1]"); - } - QString doc = getDocumentation(xquery, query, DocModificationList()); - if (doc.isEmpty()) { - qCWarning(lcShibokenDoc, "%s", - qPrintable(msgCannotFindDocumentation(doxyFilePath, metaClass, func, query))); + Documentation funcDoc; + for (const auto &tag : docTags) { + QString funcQuery(query); + if (!isProperty) { + funcQuery += QLatin1String("/../") + tag.second; + } else { + funcQuery = QLatin1Char('(') + funcQuery; + funcQuery += QLatin1String("/../%1)[1]").arg(tag.second); + } + + QString doc = getDocumentation(xquery, funcQuery, DocModificationList()); + if (doc.isEmpty()) { + qCWarning(lcShibokenDoc, "%s", + qPrintable(msgCannotFindDocumentation(doxyFilePath, metaClass, func, + funcQuery))); + } else { + funcDoc.setValue(doc, tag.first); + } } - func->setDocumentation(doc); + func->setDocumentation(funcDoc); isProperty = false; } @@ -159,14 +181,20 @@ void DoxygenParser::fillDocumentation(AbstractMetaClass* metaClass) if (field->isPrivate()) return; - QString query = QLatin1String("/doxygen/compounddef/sectiondef/memberdef/name[text()=\"") - + field->name() + QLatin1String("\"]/../detaileddescription"); - QString doc = getDocumentation(xquery, query, DocModificationList()); - if (doc.isEmpty()) { - qCWarning(lcShibokenDoc, "%s", - qPrintable(msgCannotFindDocumentation(doxyFilePath, metaClass, field, query))); + Documentation fieldDoc; + for (const auto &tag : docTags) { + QString query = QLatin1String("/doxygen/compounddef/sectiondef/memberdef/name[text()=\"") + + field->name() + QLatin1String("\"]/../") + tag.second; + QString doc = getDocumentation(xquery, query, DocModificationList()); + if (doc.isEmpty()) { + qCWarning(lcShibokenDoc, "%s", + qPrintable(msgCannotFindDocumentation(doxyFilePath, metaClass, field, + query))); + } else { + fieldDoc.setValue(doc, tag.first); + } } - field->setDocumentation(doc); + field->setDocumentation(fieldDoc); } //Enums diff --git a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp index 967c8fcc9..878ad9d57 100644 --- a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp +++ b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt for Python. @@ -1527,7 +1527,7 @@ QString QtDocGenerator::fileNameForContext(const GeneratorContext &context) cons { const AbstractMetaClass *metaClass = context.metaClass(); if (!context.forSmartPointer()) { - return getClassTargetFullName(metaClass, false) + fileNameSuffix(); + return metaClass->name() + fileNameSuffix(); } const AbstractMetaType *smartPointerType = context.preciseType(); QString fileNameBase = getFileNameBaseForSmartPointer(smartPointerType, metaClass); @@ -1535,18 +1535,19 @@ QString QtDocGenerator::fileNameForContext(const GeneratorContext &context) cons } void QtDocGenerator::writeFormattedText(QTextStream &s, const Documentation &doc, - const AbstractMetaClass *metaClass) + const AbstractMetaClass *metaClass, + Documentation::Type docType) { QString metaClassName; if (metaClass) - metaClassName = getClassTargetFullName(metaClass); + metaClassName = metaClass->fullName(); if (doc.format() == Documentation::Native) { - QtXmlToSphinx x(this, doc.value(), metaClassName); + QtXmlToSphinx x(this,doc.value(docType), metaClassName); s << x; } else { - const QString &value = doc.value(); + const QString &value = doc.value(docType); const auto lines = QStringView{value}.split(QLatin1Char('\n')); int typesystemIndentation = std::numeric_limits<int>::max(); // check how many spaces must be removed from the beginning of each line @@ -1583,7 +1584,7 @@ static void writeInheritedByList(QTextStream& s, const AbstractMetaClass* metaCl s << "**Inherited by:** "; QStringList classes; for (AbstractMetaClass *c : qAsConst(res)) - classes << QLatin1String(":ref:`") + getClassTargetFullName(c, false) + QLatin1Char('`'); + classes << QLatin1String(":ref:`") + c->name() + QLatin1Char('`'); s << classes.join(QLatin1String(", ")) << Qt::endl << Qt::endl; } @@ -1621,7 +1622,7 @@ void QtDocGenerator::generateClass(QTextStream &s, const GeneratorContext &class m_docParser->setPackageName(metaClass->package()); m_docParser->fillDocumentation(const_cast<AbstractMetaClass*>(metaClass)); - QString className = getClassTargetFullName(metaClass, false); + QString className = metaClass->name(); s << ".. _" << className << ":" << "\n\n"; s << ".. currentmodule:: " << metaClass->package() << "\n\n\n"; @@ -1631,10 +1632,11 @@ void QtDocGenerator::generateClass(QTextStream &s, const GeneratorContext &class auto documentation = metaClass->documentation(); Documentation brief; if (extractBrief(&documentation, &brief)) - writeFormattedText(s, brief, metaClass); + writeFormattedText(s, brief.value(), metaClass); - s << ".. inheritance-diagram:: " << getClassTargetFullName(metaClass, true) << Qt::endl - << " :parts: 2\n\n"; // TODO: This would be a parameter in the future... + s << ".. inheritance-diagram:: " << metaClass->fullName() << Qt::endl + << " :parts: 2" << Qt::endl << Qt::endl; + // TODO: This would be a parameter in the future... writeInheritedByList(s, metaClass, classes()); @@ -1657,7 +1659,7 @@ void QtDocGenerator::generateClass(QTextStream &s, const GeneratorContext &class writeInjectDocumentation(s, TypeSystem::DocModificationPrepend, metaClass, nullptr); if (!writeInjectDocumentation(s, TypeSystem::DocModificationReplace, metaClass, nullptr)) - writeFormattedText(s, documentation, metaClass); + writeFormattedText(s, documentation.value(), metaClass); if (!metaClass->isNamespace()) writeConstructors(s, metaClass); @@ -1666,6 +1668,7 @@ void QtDocGenerator::generateClass(QTextStream &s, const GeneratorContext &class writeFields(s, metaClass); + QStringList uniqueFunctions; for (AbstractMetaFunction *func : qAsConst(functionList)) { if (shouldSkip(func)) continue; @@ -1675,7 +1678,8 @@ void QtDocGenerator::generateClass(QTextStream &s, const GeneratorContext &class else s << ".. method:: "; - writeFunction(s, metaClass, func); + writeFunction(s, metaClass, func, !uniqueFunctions.contains(func->name())); + uniqueFunctions.append(func->name()); } writeInjectDocumentation(s, TypeSystem::DocModificationAppend, metaClass, nullptr); @@ -1696,9 +1700,9 @@ void QtDocGenerator::writeFunctionList(QTextStream& s, const AbstractMetaClass* QString className; if (!func->isConstructor()) - className = getClassTargetFullName(cppClass) + QLatin1Char('.'); + className = cppClass->fullName() + QLatin1Char('.'); else if (func->implementingClass() && func->implementingClass()->enclosingClass()) - className = getClassTargetFullName(func->implementingClass()->enclosingClass()) + QLatin1Char('.'); + className = func->implementingClass()->enclosingClass()->fullName() + QLatin1Char('.'); QString funcName = getFuncName(func); QString str = QLatin1String("def :meth:`"); @@ -1760,8 +1764,8 @@ void QtDocGenerator::writeEnums(QTextStream& s, const AbstractMetaClass* cppClas const AbstractMetaEnumList &enums = cppClass->enums(); for (AbstractMetaEnum *en : enums) { - s << section_title << getClassTargetFullName(cppClass) << '.' << en->name() << Qt::endl << Qt::endl; - writeFormattedText(s, en->documentation(), cppClass); + s << section_title << cppClass->fullName() << '.' << en->name() << Qt::endl << Qt::endl; + writeFormattedText(s, en->documentation().value(), cppClass); const auto version = versionOf(en->typeEntry()); if (!version.isNull()) s << rstVersionAdded(version); @@ -1775,9 +1779,9 @@ void QtDocGenerator::writeFields(QTextStream& s, const AbstractMetaClass* cppCla const AbstractMetaFieldList &fields = cppClass->fields(); for (AbstractMetaField *field : fields) { - s << section_title << getClassTargetFullName(cppClass) << "." << field->name() << Qt::endl << Qt::endl; + s << section_title << cppClass->fullName() << "." << field->name() << Qt::endl << Qt::endl; //TODO: request for member ‘documentation’ is ambiguous - writeFormattedText(s, field->AbstractMetaAttributes::documentation(), cppClass); + writeFormattedText(s, field->AbstractMetaAttributes::documentation().value(), cppClass); } } @@ -1796,25 +1800,29 @@ void QtDocGenerator::writeConstructors(QTextStream& s, const AbstractMetaClass* IndentorBase<1> indent1; indent1.indent = INDENT.total(); - for (AbstractMetaFunction *func : qAsConst(lst)) { - s << indent1; - if (first) { - first = false; - s << sectionTitle; - indent1.indent += sectionTitle.size(); - } - 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())) { - arg_map.insert(arg->name(), arg); + if (lst.isEmpty()) { + s << sectionTitle << cppClass->fullName(); + } else { + for (AbstractMetaFunction *func : qAsConst(lst)) { + s << indent1; + if (first) { + first = false; + s << sectionTitle; + indent1.indent += sectionTitle.size(); + } + 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())) { + arg_map.insert(arg->name(), arg); + } } } } @@ -1829,7 +1837,7 @@ void QtDocGenerator::writeConstructors(QTextStream& s, const AbstractMetaClass* s << Qt::endl; for (AbstractMetaFunction *func : qAsConst(lst)) - writeFormattedText(s, func->documentation(), cppClass); + writeFormattedText(s, func->documentation().value(), cppClass); } QString QtDocGenerator::parseArgDocStyle(const AbstractMetaClass* /* cppClass */, @@ -1964,8 +1972,8 @@ bool QtDocGenerator::writeInjectDocumentation(QTextStream& s, else continue; - doc.setValue(mod.code() , fmt); - writeFormattedText(s, doc, cppClass); + doc.setValue(mod.code(), Documentation::Detailed, fmt); + writeFormattedText(s, doc.value(), cppClass); didSomething = true; } } @@ -1986,15 +1994,11 @@ bool QtDocGenerator::writeInjectDocumentation(QTextStream& s, QString QtDocGenerator::functionSignature(const AbstractMetaClass* cppClass, const AbstractMetaFunction* func) { - QString className; - if (!func->isConstructor()) - className = getClassTargetFullName(cppClass) + QLatin1Char('.'); - else if (func->implementingClass() && func->implementingClass()->enclosingClass()) - className = getClassTargetFullName(func->implementingClass()->enclosingClass()) + QLatin1Char('.'); + QString funcName; - QString funcName = getFuncName(func); - if (!funcName.startsWith(className)) - funcName = className + funcName; + funcName = cppClass->fullName(); + if (!func->isConstructor()) + funcName += QLatin1Char('.') + getFuncName(func); return funcName + QLatin1Char('(') + parseArgDocStyle(cppClass, func) + QLatin1Char(')'); @@ -2002,20 +2006,42 @@ QString QtDocGenerator::functionSignature(const AbstractMetaClass* cppClass, con QString QtDocGenerator::translateToPythonType(const AbstractMetaType* type, const AbstractMetaClass* cppClass) { - QString strType; + static const QStringList nativeTypes = { + QLatin1String("bool"), + QLatin1String("float"), + QLatin1String("int"), + QLatin1String("object"), + QLatin1String("str") + }; const QString name = type->name(); - if (name == QLatin1String("QString")) { - strType = QLatin1String("unicode"); - } else if (name == QLatin1String("QVariant")) { - strType = QLatin1String("object"); - } else if (name == QLatin1String("QStringList")) { - strType = QLatin1String("list of strings"); - } else if (type->isConstant() && name == QLatin1String("char") && type->indirections() == 1) { + if (nativeTypes.contains(name)) + return name; + + static const QMap<QString, QString> typeMap = { + { QLatin1String("PyObject"), QLatin1String("object") }, + { QLatin1String("QString"), QLatin1String("str") }, + { QLatin1String("uchar"), QLatin1String("str") }, + { QLatin1String("QStringList"), QLatin1String("list of strings") }, + { QLatin1String("QVariant"), QLatin1String("object") }, + { QLatin1String("quint32"), QLatin1String("int") }, + { QLatin1String("uint32_t"), QLatin1String("int") }, + { QLatin1String("quint64"), QLatin1String("int") }, + { QLatin1String("qint64"), QLatin1String("int") }, + { QLatin1String("size_t"), QLatin1String("int") }, + { QLatin1String("int64_t"), QLatin1String("int") }, + { QLatin1String("qreal"), QLatin1String("float") } + }; + const auto found = typeMap.find(name); + if (found != typeMap.end()) + return found.value(); + + QString strType; + if (type->isConstant() && name == QLatin1String("char") && type->indirections() == 1) { strType = QLatin1String("str"); } else if (name.startsWith(QLatin1String("unsigned short"))) { strType = QLatin1String("int"); } else if (name.startsWith(QLatin1String("unsigned "))) { // uint and ulong - strType = QLatin1String("long"); + strType = QLatin1String("int"); } else if (type->isContainer()) { QString strType = translateType(type, cppClass, Options(ExcludeConst) | ExcludeReference); strType.remove(QLatin1Char('*')); @@ -2033,12 +2059,9 @@ QString QtDocGenerator::translateToPythonType(const AbstractMetaType* type, cons .arg(types[0], types[1]); } } else { - QString refTag; - if (type->isEnum()) - refTag = QLatin1String("attr"); - else - refTag = QLatin1String("class"); - strType = QLatin1Char(':') + refTag + QLatin1String(":`") + name + QLatin1Char('`'); + const AbstractMetaClass *k = AbstractMetaClass::findClass(classes(), type->typeEntry()); + strType = k ? k->fullName() : type->name(); + strType = QStringLiteral(":any:`") + strType + QLatin1Char('`'); } return strType; } @@ -2084,12 +2107,15 @@ void QtDocGenerator::writeFunctionParametersType(QTextStream &s, const AbstractM } void QtDocGenerator::writeFunction(QTextStream& s, const AbstractMetaClass* cppClass, - const AbstractMetaFunction* func) + const AbstractMetaFunction* func, bool indexed) { - s << functionSignature(cppClass, func) << "\n\n"; + s << functionSignature(cppClass, func); { Indentation indentation(INDENT); + if (!indexed) + s << QLatin1Char('\n') << INDENT << QLatin1String(":noindex:"); + s << "\n\n"; writeFunctionParametersType(s, cppClass, func); const auto version = versionOf(func->typeEntry()); if (!version.isNull()) @@ -2097,14 +2123,15 @@ void QtDocGenerator::writeFunction(QTextStream& s, const AbstractMetaClass* cppC 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); + if (!writeInjectDocumentation(s, TypeSystem::DocModificationReplace, cppClass, func)) { + writeFormattedText(s, func->documentation(), cppClass, Documentation::Brief); + writeFormattedText(s, func->documentation(), cppClass, Documentation::Detailed); + } writeInjectDocumentation(s, TypeSystem::DocModificationAppend, cppClass, func); } -static void writeFancyToc(QTextStream& s, const QStringList& items, int cols = 4) +static void writeFancyToc(QTextStream& s, const QStringList& items, int cols = 2) { using TocMap = QMap<QChar, QStringList>; TocMap tocMap; @@ -2113,12 +2140,13 @@ static void writeFancyToc(QTextStream& s, const QStringList& items, int cols = 4 for (QString item : items) { if (item.isEmpty()) continue; - if (item.startsWith(Q) && item.length() > 1) - idx = item[1]; - else - idx = item[0]; // To group classes without the 'Q' prefix - item.chop(4); // Remove the .rst extension + // skip namespace if necessary + const QString className = item.split(QLatin1Char('.')).last(); + if (className.startsWith(Q) && className.length() > 1) + idx = className[1]; + else + idx = className[0]; tocMap[idx] << item; } QtXmlToSphinx::Table table; diff --git a/sources/shiboken2/generator/qtdoc/qtdocgenerator.h b/sources/shiboken2/generator/qtdoc/qtdocgenerator.h index e4067cc6f..b0f4c2552 100644 --- a/sources/shiboken2/generator/qtdoc/qtdocgenerator.h +++ b/sources/shiboken2/generator/qtdoc/qtdocgenerator.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt for Python. @@ -33,6 +33,7 @@ #include <QtCore/QScopedPointer> #include <QtCore/QTextStream> #include <QXmlStreamReader> +#include "abstractmetalang.h" #include "generator.h" #include "docparser.h" #include "typesystem_enums.h" @@ -252,7 +253,7 @@ private: void writeArguments(QTextStream &s, const AbstractMetaClass *cppClass, const AbstractMetaFunction *func); QString functionSignature(const AbstractMetaClass* cppClass, const AbstractMetaFunction* func); void writeFunction(QTextStream& s, const AbstractMetaClass* cppClass, - const AbstractMetaFunction* func); + const AbstractMetaFunction* func, bool indexed = true); void writeFunctionParametersType(QTextStream &s, const AbstractMetaClass *cppClass, const AbstractMetaFunction* func); void writeFunctionList(QTextStream& s, const AbstractMetaClass* cppClass); @@ -261,7 +262,8 @@ private: void writeConstructors(QTextStream &s, const AbstractMetaClass *cppClass); void writeFormattedText(QTextStream &s, const Documentation &doc, - const AbstractMetaClass *metaclass = nullptr); + const AbstractMetaClass *metaclass = nullptr, + Documentation::Type docType = Documentation::Detailed); bool writeInjectDocumentation(QTextStream& s, TypeSystem::DocModificationMode mode, const AbstractMetaClass* cppClass, const AbstractMetaFunction* func); void writeDocSnips(QTextStream &s, const CodeSnipList &codeSnips, TypeSystem::CodeSnipPosition position, TypeSystem::Language language); diff --git a/sources/shiboken2/libshiboken/embed/signature_bootstrap.py b/sources/shiboken2/libshiboken/embed/signature_bootstrap.py index eb182d8c4..3a74bb42e 100644 --- a/sources/shiboken2/libshiboken/embed/signature_bootstrap.py +++ b/sources/shiboken2/libshiboken/embed/signature_bootstrap.py @@ -73,7 +73,7 @@ def bootstrap(): if recursion_trap: # we are probably called from outside, already print("Recursion occurred in Bootstrap. Did you start by hand? Then it's ok.") - print("But you should trigger start by 'type.__signature__', only!") + print("""But you should trigger start by 'eval("type.__signature__")', only!""") recursion_trap += 1 @contextmanager diff --git a/sources/shiboken2/shibokenmodule/__init__.py.in b/sources/shiboken2/shibokenmodule/__init__.py.in index ed6ce5623..eb392e847 100644 --- a/sources/shiboken2/shibokenmodule/__init__.py.in +++ b/sources/shiboken2/shibokenmodule/__init__.py.in @@ -27,4 +27,4 @@ if sys.version_info[0] == 3: from .shiboken2 import * # Trigger signature initialization. -type.__signature__ +eval("type.__signature__") diff --git a/sources/shiboken2/tests/minimalbinding/brace_pattern_test.py b/sources/shiboken2/tests/minimalbinding/brace_pattern_test.py index e48027d2a..bcaccac44 100644 --- a/sources/shiboken2/tests/minimalbinding/brace_pattern_test.py +++ b/sources/shiboken2/tests/minimalbinding/brace_pattern_test.py @@ -49,7 +49,7 @@ from shiboken_paths import init_paths init_paths() import shiboken2 -type.__signature__ # trigger bootstrap +eval("type.__signature__") # trigger bootstrap from shibokensupport.signature.lib.tool import build_brace_pattern diff --git a/sources/shiboken2/tests/samplebinding/pointerprimitivetype_test.py b/sources/shiboken2/tests/samplebinding/pointerprimitivetype_test.py index 9ce641f61..3abd01cd9 100644 --- a/sources/shiboken2/tests/samplebinding/pointerprimitivetype_test.py +++ b/sources/shiboken2/tests/samplebinding/pointerprimitivetype_test.py @@ -54,7 +54,7 @@ init_paths() from sample import IntArray2, VirtualMethods import shiboken2 -type.__signature__ # trigger init, which does not happen in tests +eval("type.__signature__") # trigger init, which does not happen in tests from shibokensupport.signature import typing |
