aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sources/pyside2/PySide2/__init__.py.in3
-rw-r--r--sources/pyside2/libpyside/pysidesignal.cpp2
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.cpp45
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.h38
-rw-r--r--sources/shiboken2/ApiExtractor/doxygenparser.cpp82
-rw-r--r--sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp178
-rw-r--r--sources/shiboken2/generator/qtdoc/qtdocgenerator.h8
-rw-r--r--sources/shiboken2/libshiboken/embed/signature_bootstrap.py2
-rw-r--r--sources/shiboken2/shibokenmodule/__init__.py.in2
-rw-r--r--sources/shiboken2/tests/minimalbinding/brace_pattern_test.py2
-rw-r--r--sources/shiboken2/tests/samplebinding/pointerprimitivetype_test.py2
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