diff options
Diffstat (limited to 'sources/shiboken2')
48 files changed, 1371 insertions, 1508 deletions
diff --git a/sources/shiboken2/ApiExtractor/CMakeLists.txt b/sources/shiboken2/ApiExtractor/CMakeLists.txt index 4355e32ef..8d68b0dcf 100644 --- a/sources/shiboken2/ApiExtractor/CMakeLists.txt +++ b/sources/shiboken2/ApiExtractor/CMakeLists.txt @@ -1,5 +1,7 @@ project(apiextractor) +cmake_minimum_required(VERSION 3.1) +cmake_policy(VERSION 3.1) find_package(LibXml2 2.6.32) find_package(LibXslt 1.1.19) @@ -55,11 +57,13 @@ clangparser/clangdebugutils.cpp clangparser/clangutils.cpp # Old parser parser/codemodel.cpp +parser/enumvalue.cpp ) set(APIEXTRACTOR_EXTRA_INCLUDES ${CLANG_EXTRA_INCLUDES}) set(APIEXTRACTOR_EXTRA_LIBRARIES ${CLANG_EXTRA_LIBRARIES}) +add_subdirectory(doc) if (NOT DISABLE_DOCSTRINGS) set(apiextractor_SRC ${apiextractor_SRC} diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp index 1afc7d135..b862ba548 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp +++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp @@ -508,8 +508,6 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom) addAbstractMetaClass(cls); } - figureOutEnumValues(); - for (const ClassModelItem &item : typeValues) traverseClassMembers(item); @@ -684,7 +682,6 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom) traverseStreamOperator(item); } - figureOutDefaultEnumArguments(); checkFunctionModifications(); // sort all classes topologically @@ -839,207 +836,6 @@ AbstractMetaClass *AbstractMetaBuilderPrivate::traverseNamespace(const FileModel return metaClass; } -struct Operator -{ - enum Type { Complement, Plus, ShiftRight, ShiftLeft, None }; - - Operator() : type(None) {} - - int calculate(int x) - { - switch (type) { - case Complement: return ~value; - case Plus: return x + value; - case ShiftRight: return x >> value; - case ShiftLeft: return x << value; - case None: return x; - } - return x; - } - - Type type; - int value; -}; - - - -Operator findOperator(QString* s) -{ - const char *names[] = { - "~", - "+", - ">>", - "<<" - }; - - for (int i = 0; i < Operator::None; ++i) { - QString name = QLatin1String(names[i]); - QString str = *s; - int splitPoint = str.indexOf(name); - if (splitPoint > -1) { - bool ok; - QString right = str.mid(splitPoint + name.length()); - Operator op; - - op.value = right.toInt(&ok); - if (!ok && right.length() > 0 && right.at(right.length() - 1).toLower() == QLatin1Char('u')) - op.value = right.left(right.length() - 1).toUInt(&ok, 0); - - if (ok) { - op.type = Operator::Type(i); - if (splitPoint > 0) - *s = str.left(splitPoint).trimmed(); - else - *s = QString(); - return op; - } - } - } - return Operator(); -} - -int AbstractMetaBuilderPrivate::figureOutEnumValue(const QString &stringValue, - int oldValuevalue, - AbstractMetaEnum *metaEnum, - AbstractMetaFunction *metaFunction) -{ - if (stringValue.isEmpty()) - return oldValuevalue; - - QStringList stringValues = stringValue.split(QLatin1Char('|')); - - int returnValue = 0; - - bool matched = false; - - for (int i = 0; i < stringValues.size(); ++i) { - QString s = stringValues.at(i).trimmed(); - - bool ok; - int v; - - Operator op = findOperator(&s); - - if (s.length() > 0 && s.at(0) == QLatin1Char('0')) - v = s.toUInt(&ok, 0); - else if (s.length() > 0 && s.at(s.length() - 1).toLower() == QLatin1Char('u')) - v = s.left(s.length() - 1).toUInt(&ok, 0); - else - v = s.toInt(&ok); - - if (ok || s.isEmpty()) { - matched = true; - } else if (m_enumValues.contains(s)) { - v = m_enumValues[s]->value(); - matched = true; - } else { - if (metaEnum) { - v = findOutValueFromString(s, matched); - if (!matched) { - QString enclosingClass = QString(metaEnum->enclosingClass() ? metaEnum->enclosingClass()->name() + colonColon() : QString()); - qCWarning(lcShiboken).noquote().nospace() - << "unhandled enum value: " << s << " in " - << enclosingClass << metaEnum->name() << " from header '" - << metaEnum->typeEntry()->include().name() << '\''; - } - } else { - qCWarning(lcShiboken) << "unhandled enum value: Unknown enum"; - } - } - - if (matched) - returnValue |= op.calculate(v); - } - - if (!matched) { - QString warn = QStringLiteral("unmatched enum %1").arg(stringValue); - - if (metaFunction) { - warn += QStringLiteral(" when parsing default value of '%1' in class '%2'") - .arg(metaFunction->name(), metaFunction->implementingClass()->name()); - } - warn += QLatin1String(" from header '") + metaEnum->typeEntry()->include().name() - + QLatin1Char('\''); - - qCWarning(lcShiboken).noquote().nospace() << warn; - returnValue = oldValuevalue; - } - - return returnValue; -} - -void AbstractMetaBuilderPrivate::figureOutEnumValuesForClass(AbstractMetaClass *metaClass, - QSet<AbstractMetaClass *> *classes) -{ - AbstractMetaClass* base = metaClass->baseClass(); - - if (base && !classes->contains(base)) - figureOutEnumValuesForClass(base, classes); - - if (classes->contains(metaClass)) - return; - - const AbstractMetaEnumList &enums = metaClass->enums(); - for (AbstractMetaEnum* e : enums) { - if (!e) { - qCWarning(lcShiboken).noquote().nospace() << "bad enum in class " << metaClass->name(); - continue; - } - AbstractMetaEnumValueList lst = e->values(); - int value = 0; - for (int i = 0; i < lst.size(); ++i) { - value = figureOutEnumValue(lst.at(i)->stringValue(), value, e); - lst.at(i)->setValue(value); - value++; - } - } - - *classes += metaClass; -} - - -void AbstractMetaBuilderPrivate::figureOutEnumValues() -{ - // Keep a set of classes that we already traversed. We use this to - // enforce that we traverse base classes prior to subclasses. - QSet<AbstractMetaClass*> classes; - for (AbstractMetaClass *c : qAsConst(m_metaClasses)) - figureOutEnumValuesForClass(c, &classes); - - for (AbstractMetaEnum* metaEnum : qAsConst(m_globalEnums)) { - AbstractMetaEnumValueList enumValues = metaEnum->values(); - int value = 0; - for (int i = 0; i < enumValues.size(); ++i) { - value = figureOutEnumValue(enumValues.at(i)->stringValue(), value, metaEnum); - enumValues.at(i)->setValue(value); - value++; - } - } -} - -void AbstractMetaBuilderPrivate::figureOutDefaultEnumArguments() -{ - for (AbstractMetaClass* metaClass : qAsConst(m_metaClasses)) { - const AbstractMetaFunctionList &functions = metaClass->functions(); - for (AbstractMetaFunction* metaFunction : functions) { - const AbstractMetaArgumentList &arguments = metaFunction->arguments(); - for (AbstractMetaArgument *arg : arguments) { - QString expr = arg->defaultValueExpression(); - if (expr.isEmpty()) - continue; - - if (!metaFunction->replacedDefaultExpression(metaFunction->implementingClass(), - arg->argumentIndex() + 1).isEmpty()) { - continue; - } - - arg->setDefaultValueExpression(expr); - } - } - } -} - - AbstractMetaEnum *AbstractMetaBuilderPrivate::traverseEnum(EnumModelItem enumItem, AbstractMetaClass *enclosing, const QSet<QString> &enumsDeclarations) @@ -1055,7 +851,7 @@ AbstractMetaEnum *AbstractMetaBuilderPrivate::traverseEnum(EnumModelItem enumIte nspace = QStringList(names.mid(0, names.size() - 1)).join(colonColon()); typeEntry = new EnumTypeEntry(nspace, enumName, QVersionNumber(0, 0)); TypeDatabase::instance()->addType(typeEntry); - } else if (!enumItem->isAnonymous()) { + } else if (enumItem->enumKind() != AnonymousEnum) { typeEntry = TypeDatabase::instance()->findType(qualifiedName); } else { QStringList tmpQualifiedName = enumItem->qualifiedName(); @@ -1096,12 +892,15 @@ AbstractMetaEnum *AbstractMetaBuilderPrivate::traverseEnum(EnumModelItem enumIte } AbstractMetaEnum *metaEnum = new AbstractMetaEnum; + metaEnum->setEnumKind(enumItem->enumKind()); + metaEnum->setSigned(enumItem->isSigned()); if (enumsDeclarations.contains(qualifiedName) || enumsDeclarations.contains(enumName)) { metaEnum->setHasQEnumsDeclaration(true); } - metaEnum->setTypeEntry((EnumTypeEntry*) typeEntry); + EnumTypeEntry *enumTypeEntry = static_cast<EnumTypeEntry *>(typeEntry); + metaEnum->setTypeEntry(enumTypeEntry); switch (enumItem->accessPolicy()) { case CodeModel::Public: *metaEnum += AbstractMetaAttributes::Public; @@ -1127,7 +926,8 @@ AbstractMetaEnum *AbstractMetaBuilderPrivate::traverseEnum(EnumModelItem enumIte metaEnumValue->setName(value->name()); // Deciding the enum value... - metaEnumValue->setStringValue(value->value()); + metaEnumValue->setStringValue(value->stringValue()); + metaEnumValue->setValue(value->value()); metaEnum->addEnumValue(metaEnumValue); if (ReportHandler::isDebug(ReportHandler::FullDebug)) { @@ -1158,7 +958,9 @@ AbstractMetaEnum *AbstractMetaBuilderPrivate::traverseEnum(EnumModelItem enumIte name += colonColon(); } name += e->name(); - EnumValueTypeEntry* enumValue = new EnumValueTypeEntry(name, e->value(), static_cast<EnumTypeEntry*>(typeEntry), typeEntry->version()); + EnumValueTypeEntry *enumValue = + new EnumValueTypeEntry(name, e->stringValue(), + enumTypeEntry, enumTypeEntry->version()); TypeDatabase::instance()->addType(enumValue); } @@ -2286,6 +2088,20 @@ AbstractMetaFunction *AbstractMetaBuilderPrivate::traverseFunction(FunctionModel bool ok; AbstractMetaType* metaType = translateType(arg->type(), &ok); if (!ok) { + // If an invalid argument has a default value, simply remove it + if (arg->defaultValue()) { + if (!m_currentClass + || (m_currentClass->typeEntry()->codeGeneration() + & TypeEntry::GenerateTargetLang)) { + qCWarning(lcShiboken).noquote().nospace() + << "Stripping argument #" << (i + 1) << " of " + << originalQualifiedSignatureWithReturn + << " due to unmatched type \"" << arg->type().toString() + << "\" with default expression \"" + << arg->defaultValueExpression() << "\"."; + } + break; + } Q_ASSERT(metaType == 0); const QString reason = msgUnmatchedParameterType(arg, i); qCWarning(lcShiboken).noquote().nospace() @@ -2321,7 +2137,7 @@ AbstractMetaFunction *AbstractMetaBuilderPrivate::traverseFunction(FunctionModel metaFunction->setArguments(metaArguments); // Find the correct default values - for (int i = 0; i < arguments.size(); ++i) { + for (int i = 0, size = metaArguments.size(); i < size; ++i) { ArgumentModelItem arg = arguments.at(i); AbstractMetaArgument* metaArg = metaArguments.at(i); @@ -2570,9 +2386,9 @@ AbstractMetaType *AbstractMetaBuilderPrivate::translateType(const TypeInfo &_typ arrayType->setArrayElementType(elementType); if (!typeInfo.arrays.at(i).isEmpty()) { bool _ok; - const int elems = findOutValueFromString(typeInfo.arrays.at(i), _ok); + const qint64 elems = findOutValueFromString(typeInfo.arrays.at(i), _ok); if (_ok) - arrayType->setArrayElementCount(elems); + arrayType->setArrayElementCount(int(elems)); } arrayType->setTypeEntry(new ArrayTypeEntry(elementType->typeEntry() , elementType->typeEntry()->version())); decideUsagePattern(arrayType); @@ -2712,9 +2528,9 @@ AbstractMetaType *AbstractMetaBuilderPrivate::translateType(const TypeInfo &_typ } -int AbstractMetaBuilderPrivate::findOutValueFromString(const QString &stringValue, bool &ok) +qint64 AbstractMetaBuilderPrivate::findOutValueFromString(const QString &stringValue, bool &ok) { - int value = stringValue.toInt(&ok); + qint64 value = stringValue.toLongLong(&ok); if (ok) return value; @@ -2735,13 +2551,13 @@ int AbstractMetaBuilderPrivate::findOutValueFromString(const QString &stringValu AbstractMetaEnumValue *enumValue = AbstractMetaClass::findEnumValue(m_metaClasses, stringValue); if (enumValue) { ok = true; - return enumValue->value(); + return enumValue->value().value(); } for (AbstractMetaEnum *metaEnum : qAsConst(m_globalEnums)) { if (const AbstractMetaEnumValue *ev = metaEnum->findEnumValue(stringValue)) { ok = true; - return ev->value(); + return ev->value().value(); } } diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h b/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h index 7a2565914..7f5e866ab 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h +++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h @@ -60,11 +60,6 @@ public: AbstractMetaClass *argumentToClass(ArgumentModelItem); - void figureOutEnumValuesForClass(AbstractMetaClass *metaClass, QSet<AbstractMetaClass *> *classes); - int figureOutEnumValue(const QString &name, int value, AbstractMetaEnum *meta_enum, AbstractMetaFunction *metaFunction = 0); - void figureOutEnumValues(); - void figureOutDefaultEnumArguments(); - void addAbstractMetaClass(AbstractMetaClass *cls); AbstractMetaClass *traverseTypeDef(const FileModelItem &dom, const TypeDefModelItem &typeDef); @@ -129,7 +124,7 @@ public: bool resolveType = true, bool resolveScope = true); - int findOutValueFromString(const QString &stringValue, bool &ok); + qint64 findOutValueFromString(const QString &stringValue, bool &ok); void decideUsagePattern(AbstractMetaType *type); diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp index 4e507cd38..235413165 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp +++ b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp @@ -1700,7 +1700,10 @@ QDebug operator<<(QDebug d, const AbstractMetaEnum *ae) d.nospace(); d << "AbstractMetaEnum("; if (ae) { - d << ae->fullName() << '['; + d << ae->fullName(); + if (!ae->isSigned()) + d << " (unsigned) "; + d << '['; const AbstractMetaEnumValueList &values = ae->values(); for (int i = 0, count = values.size(); i < count; ++i) { if (i) @@ -2411,7 +2414,7 @@ QDebug operator<<(QDebug d, const AbstractMetaClass *ac) */ AbstractMetaEnum::AbstractMetaEnum() : - m_hasQenumsDeclaration(false) + m_hasQenumsDeclaration(false), m_signed(true) { } @@ -2457,8 +2460,3 @@ QString AbstractMetaEnum::package() const { return m_typeEntry->targetLangPackage(); } - -bool AbstractMetaEnum::isAnonymous() const -{ - return m_typeEntry->isAnonymous(); -} diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.h b/sources/shiboken2/ApiExtractor/abstractmetalang.h index 45a55e570..7e0bfa322 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetalang.h +++ b/sources/shiboken2/ApiExtractor/abstractmetalang.h @@ -34,6 +34,7 @@ #include "typesystem_typedefs.h" #include "parser/codemodel_enums.h" +#include "parser/enumvalue.h" #include <QtCore/qobjectdefs.h> #include <QtCore/QStringList> @@ -1090,12 +1091,12 @@ class AbstractMetaEnumValue public: AbstractMetaEnumValue() {} - int value() const + EnumValue value() const { return m_value; } - void setValue(int value) + void setValue(EnumValue value) { m_value = value; } @@ -1134,7 +1135,7 @@ private: QString m_name; QString m_stringValue; - int m_value = 0; + EnumValue m_value; Documentation m_doc; }; @@ -1168,6 +1169,11 @@ public: return package() + QLatin1Char('.') + qualifier() + QLatin1Char('.') + name(); } + EnumKind enumKind() const { return m_enumKind; } + void setEnumKind(EnumKind kind) { m_enumKind = kind; } + + bool isAnonymous() const { return m_enumKind == AnonymousEnum; } + // Has the enum been declared inside a Q_ENUMS() macro in its enclosing class? void setHasQEnumsDeclaration(bool on) { @@ -1199,14 +1205,17 @@ public: m_class = c; } - bool isAnonymous() const; + bool isSigned() const { return m_signed; } + void setSigned(bool s) { m_signed = s; } private: AbstractMetaEnumValueList m_enumValues; EnumTypeEntry *m_typeEntry = nullptr; AbstractMetaClass *m_class = nullptr; + EnumKind m_enumKind = CEnum; uint m_hasQenumsDeclaration : 1; + uint m_signed : 1; }; #ifndef QT_NO_DEBUG_STREAM diff --git a/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp b/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp index 1ed054d91..b57ef2f43 100644 --- a/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp +++ b/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp @@ -41,6 +41,7 @@ #include <QtCore/QVector> #include <string.h> +#include <ctype.h> #if QT_VERSION < 0x050800 # define Q_FALLTHROUGH() (void)0 @@ -123,6 +124,24 @@ static void setFileName(const CXCursor &cursor, _CodeModelItem *item) } } +static bool isSigned(CXTypeKind kind) +{ + switch (kind) { + case CXType_UChar: + case CXType_Char16: + case CXType_Char32: + case CXType_UShort: + case CXType_UInt: + case CXType_ULong: + case CXType_ULongLong: + case CXType_UInt128: + return false; + default: + break; + } + return true; +} + class BuilderPrivate { public: typedef QHash<CXCursor, ClassModelItem> CursorClassHash; @@ -437,6 +456,36 @@ QString BuilderPrivate::cursorValueExpression(BaseVisitor *bv, const CXCursor &c return QString::fromLocal8Bit(equalSign, int(snippet.second - equalSign)).trimmed(); } +// A hacky reimplementation of clang_EnumDecl_isScoped() for Clang < 5.0 +// which simply checks for a blank-delimited " class " keyword in the enum snippet. + +#define CLANG_NO_ENUMDECL_ISSCOPED \ + (CINDEX_VERSION_MAJOR == 0 && CINDEX_VERSION_MINOR < 43) + +#if CLANG_NO_ENUMDECL_ISSCOPED +static const char *indexOf(const BaseVisitor::CodeSnippet &snippet, const char *needle) +{ + const size_t snippetLength = snippet.first ? size_t(snippet.second - snippet.first) : 0; + const size_t needleLength = strlen(needle); + if (needleLength > snippetLength) + return nullptr; + for (const char *c = snippet.first, *end = snippet.second - needleLength; c < end; ++c) { + if (memcmp(c, needle, needleLength) == 0) + return c; + } + return nullptr; +} + +long clang_EnumDecl_isScoped4(BaseVisitor *bv, const CXCursor &cursor) +{ + BaseVisitor::CodeSnippet snippet = bv->getCodeSnippet(cursor); + const char *classSpec = indexOf(snippet, "class"); + const bool isClass = classSpec && classSpec > snippet.first + && isspace(*(classSpec - 1)) && isspace(*(classSpec + 5)); + return isClass ? 1 : 0; +} +#endif // CLANG_NO_ENUMDECL_ISSCOPED + // Add a base class to the current class from CXCursor_CXXBaseSpecifier void BuilderPrivate::addBaseClass(const CXCursor &cursor) { @@ -641,13 +690,22 @@ BaseVisitor::StartTokenResult Builder::startToken(const CXCursor &cursor) break; case CXCursor_EnumDecl: { QString name = getCursorSpelling(cursor); - const bool anonymous = name.isEmpty(); - if (anonymous) + EnumKind kind = CEnum; + if (name.isEmpty()) { + kind = AnonymousEnum; name = QStringLiteral("enum_") + QString::number(++d->m_anonymousEnumCount); +#if !CLANG_NO_ENUMDECL_ISSCOPED + } else if (clang_EnumDecl_isScoped(cursor) != 0) { +#else + } else if (clang_EnumDecl_isScoped4(this, cursor) != 0) { +#endif + kind = EnumClass; + } d->m_currentEnum.reset(new _EnumModelItem(d->m_model, name)); setFileName(cursor, d->m_currentEnum.data()); d->m_currentEnum->setScope(d->m_scope); - d->m_currentEnum->setAnonymous(anonymous); + d->m_currentEnum->setEnumKind(kind); + d->m_currentEnum->setSigned(isSigned(clang_getEnumDeclIntegerType(cursor).kind)); if (!qSharedPointerDynamicCast<_ClassModelItem>(d->m_scopeStack.back()).isNull()) d->m_currentEnum->setAccessPolicy(accessPolicy(clang_getCXXAccessSpecifier(cursor))); d->m_scopeStack.back()->addEnum(d->m_currentEnum); @@ -661,8 +719,14 @@ BaseVisitor::StartTokenResult Builder::startToken(const CXCursor &cursor) appendDiagnostic(d); return Error; } + EnumValue enumValue; + if (d->m_currentEnum->isSigned()) + enumValue.setValue(clang_getEnumConstantDeclValue(cursor)); + else + enumValue.setUnsignedValue(clang_getEnumConstantDeclUnsignedValue(cursor)); EnumeratorModelItem enumConstant(new _EnumeratorModelItem(d->m_model, name)); - enumConstant->setValue(d->cursorValueExpression(this, cursor)); + enumConstant->setStringValue(d->cursorValueExpression(this, cursor)); + enumConstant->setValue(enumValue); d->m_currentEnum->addEnumerator(enumConstant); } break; diff --git a/sources/shiboken2/ApiExtractor/doc/CMakeLists.txt b/sources/shiboken2/ApiExtractor/doc/CMakeLists.txt index d78844dc8..a1995e96f 100644 --- a/sources/shiboken2/ApiExtractor/doc/CMakeLists.txt +++ b/sources/shiboken2/ApiExtractor/doc/CMakeLists.txt @@ -1,10 +1,10 @@ - +message("Building ApiExtractor documentation") find_program(SPHINX sphinx-build DOC "Path to sphinx-build binary.") if (SPHINX) - message("-- sphinx-build - found") + message(STATUS "sphinx-build - found") configure_file(conf.py.in conf.py @ONLY) - add_custom_target(doc ${SPHINX} -b html -c . ${CMAKE_CURRENT_SOURCE_DIR} html ) + add_custom_target(doc_apiextractor ${SPHINX} -b html -c . ${CMAKE_CURRENT_SOURCE_DIR} html ) else() - message("-- sphinx-build - not found! doc target disabled") -endif()
\ No newline at end of file + message(STATUS "sphinx-build - not found! doc_apiextractor target disabled") +endif() diff --git a/sources/shiboken2/ApiExtractor/doc/conf.py.in b/sources/shiboken2/ApiExtractor/doc/conf.py.in index 3a42707ad..7251aaccd 100644 --- a/sources/shiboken2/ApiExtractor/doc/conf.py.in +++ b/sources/shiboken2/ApiExtractor/doc/conf.py.in @@ -22,7 +22,8 @@ import sys, os # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.ifconfig', 'sphinx.ext.refcounting', 'sphinx.ext.coverage'] +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', + 'sphinx.ext.ifconfig', 'sphinx.ext.coverage'] rst_epilog = """ .. |project| replace:: API Extractor diff --git a/sources/shiboken2/ApiExtractor/doc/typesystem_specifying_types.rst b/sources/shiboken2/ApiExtractor/doc/typesystem_specifying_types.rst index 646e76043..322f9bca6 100644 --- a/sources/shiboken2/ApiExtractor/doc/typesystem_specifying_types.rst +++ b/sources/shiboken2/ApiExtractor/doc/typesystem_specifying_types.rst @@ -180,10 +180,6 @@ enum-type Notice that the **enum-type** tag can either have **name** or **identified-by-value** but not both. - The *optional* boolean attribute **class** specifies whether the underlying - enumeration is a C++ 11 enumeration class. In that case, the enumeration values - need to be qualified by the enumeration name to match the C++ Syntax. - The **revision** attribute can be used to specify a revision for each type, easing the production of ABI compatible bindings. diff --git a/sources/shiboken2/ApiExtractor/parser/codemodel.cpp b/sources/shiboken2/ApiExtractor/parser/codemodel.cpp index a35ca314b..1262f5901 100644 --- a/sources/shiboken2/ApiExtractor/parser/codemodel.cpp +++ b/sources/shiboken2/ApiExtractor/parser/codemodel.cpp @@ -1014,22 +1014,32 @@ void _EnumModelItem::addEnumerator(EnumeratorModelItem item) m_enumerators.append(item); } -bool _EnumModelItem::isAnonymous() const +bool _EnumModelItem::isSigned() const { - return m_anonymous; + return m_signed; } -void _EnumModelItem::setAnonymous(bool anonymous) +void _EnumModelItem::setSigned(bool s) { - m_anonymous = anonymous; + m_signed = s; } #ifndef QT_NO_DEBUG_STREAM void _EnumModelItem::formatDebug(QDebug &d) const { _CodeModelItem::formatDebug(d); - if (m_anonymous) - d << " (anonymous)"; + switch (m_enumKind) { + case CEnum: + break; + case AnonymousEnum: + d << " (anonymous)"; + break; + case EnumClass: + d << " (class)"; + break; + } + if (!m_signed) + d << " (unsigned)"; formatModelItemList(d, ", enumerators=", m_enumerators); } #endif // !QT_NO_DEBUG_STREAM @@ -1039,22 +1049,21 @@ _EnumeratorModelItem::~_EnumeratorModelItem() { } -QString _EnumeratorModelItem::value() const +QString _EnumeratorModelItem::stringValue() const { - return m_value; + return m_stringValue; } -void _EnumeratorModelItem::setValue(const QString &value) +void _EnumeratorModelItem::setStringValue(const QString &value) { - m_value = value; + m_stringValue = value; } #ifndef QT_NO_DEBUG_STREAM void _EnumeratorModelItem::formatDebug(QDebug &d) const { _CodeModelItem::formatDebug(d); - if (!m_value.isEmpty()) - d << ", value=\"" << m_value << '"'; + d << ", value=" << m_value << ", stringValue=\"" << m_stringValue << '"'; } #endif // !QT_NO_DEBUG_STREAM diff --git a/sources/shiboken2/ApiExtractor/parser/codemodel.h b/sources/shiboken2/ApiExtractor/parser/codemodel.h index 2aaea1f78..ed0eedf7d 100644 --- a/sources/shiboken2/ApiExtractor/parser/codemodel.h +++ b/sources/shiboken2/ApiExtractor/parser/codemodel.h @@ -33,6 +33,7 @@ #include "codemodel_fwd.h" #include "codemodel_enums.h" +#include "enumvalue.h" #include <QtCore/QHash> #include <QtCore/QSet> @@ -631,10 +632,10 @@ class _EnumModelItem: public _CodeModelItem public: DECLARE_MODEL_NODE(Enum) - explicit _EnumModelItem(CodeModel *model, int kind = __node_kind) - : _CodeModelItem(model, kind), m_accessPolicy(CodeModel::Public), m_anonymous(false) {} explicit _EnumModelItem(CodeModel *model, const QString &name, int kind = __node_kind) - : _CodeModelItem(model, name, kind), m_accessPolicy(CodeModel::Public), m_anonymous(false) {} + : _CodeModelItem(model, name, kind) {} + explicit _EnumModelItem(CodeModel *model, int kind = __node_kind) + : _CodeModelItem(model, kind) {} ~_EnumModelItem(); CodeModel::AccessPolicy accessPolicy() const; @@ -642,17 +643,22 @@ public: EnumeratorList enumerators() const; void addEnumerator(EnumeratorModelItem item); - bool isAnonymous() const; - void setAnonymous(bool anonymous); + + EnumKind enumKind() const { return m_enumKind; } + void setEnumKind(EnumKind kind) { m_enumKind = kind; } #ifndef QT_NO_DEBUG_STREAM void formatDebug(QDebug &d) const override; #endif + bool isSigned() const; + void setSigned(bool s); + private: - CodeModel::AccessPolicy m_accessPolicy; + CodeModel::AccessPolicy m_accessPolicy = CodeModel::Public; EnumeratorList m_enumerators; - bool m_anonymous; + EnumKind m_enumKind = CEnum; + bool m_signed = true; }; class _EnumeratorModelItem: public _CodeModelItem @@ -666,15 +672,19 @@ public: : _CodeModelItem(model, name, kind) {} ~_EnumeratorModelItem(); - QString value() const; - void setValue(const QString &value); + QString stringValue() const; + void setStringValue(const QString &stringValue); + + EnumValue value() const { return m_value; } + void setValue(EnumValue v) { m_value = v; } #ifndef QT_NO_DEBUG_STREAM void formatDebug(QDebug &d) const override; #endif private: - QString m_value; + QString m_stringValue; + EnumValue m_value; }; class _TemplateParameterModelItem: public _CodeModelItem diff --git a/sources/shiboken2/ApiExtractor/parser/codemodel_enums.h b/sources/shiboken2/ApiExtractor/parser/codemodel_enums.h index aa8b051d8..3115a9a94 100644 --- a/sources/shiboken2/ApiExtractor/parser/codemodel_enums.h +++ b/sources/shiboken2/ApiExtractor/parser/codemodel_enums.h @@ -35,4 +35,10 @@ enum ReferenceType { RValueReference }; +enum EnumKind { + CEnum, // Standard C: enum Foo { value1, value2 } + AnonymousEnum, // enum { value1, value2 } + EnumClass // C++ 11 : enum class Foo { value1, value2 } +}; + #endif // CODEMODEL_ENUMS_H diff --git a/sources/shiboken2/ApiExtractor/parser/enumvalue.cpp b/sources/shiboken2/ApiExtractor/parser/enumvalue.cpp new file mode 100644 index 000000000..84723eb14 --- /dev/null +++ b/sources/shiboken2/ApiExtractor/parser/enumvalue.cpp @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of PySide2. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "enumvalue.h" + +#include <QtCore/QDebug> +#include <QtCore/QString> +#include <QtCore/QTextStream> + +QString EnumValue::toString() const +{ + return m_type == EnumValue::Signed + ? QString::number(m_value) : QString::number(m_unsignedValue); +} + +void EnumValue::setValue(qint64 v) +{ + m_value = v; + m_type = Signed; +} + +void EnumValue::setUnsignedValue(quint64 v) +{ + m_unsignedValue = v; + m_type = Unsigned; +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug d,const EnumValue &v) +{ + QDebugStateSaver saver(d); + d.nospace(); + d.noquote(); + d << "EnumValue("; + if (v.m_type == EnumValue::Signed) + d << v.m_value; + else + d << v.m_unsignedValue << 'u'; + d << ')'; + return d; +} +#endif // !QT_NO_DEBUG_STREAM + +QTextStream &operator<<(QTextStream &s, const EnumValue &v) +{ + if (v.m_type == EnumValue::Signed) + s << v.m_value; + else + s << v.m_unsignedValue; + return s; +} diff --git a/sources/shiboken2/ApiExtractor/parser/enumvalue.h b/sources/shiboken2/ApiExtractor/parser/enumvalue.h new file mode 100644 index 000000000..2e2070306 --- /dev/null +++ b/sources/shiboken2/ApiExtractor/parser/enumvalue.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of PySide2. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef ENUMVALUE_H +#define ENUMVALUE_H + +#include <QtCore/QtGlobal> + +QT_FORWARD_DECLARE_CLASS(QDebug) +QT_FORWARD_DECLARE_CLASS(QString) +QT_FORWARD_DECLARE_CLASS(QTextStream) + +class EnumValue +{ +public: + enum Type + { + Signed, + Unsigned + }; + + QString toString() const; + + Type type() { return m_type; } + qint64 value() const { return m_value; } + quint64 unsignedValue() const { return m_unsignedValue; } + + void setValue(qint64 v); + void setUnsignedValue(quint64 v); + +private: +#ifndef QT_NO_DEBUG_STREAM + friend QDebug operator<<(QDebug, const EnumValue &); +#endif + friend QTextStream &operator<<(QTextStream &, const EnumValue &); + + union + { + qint64 m_value = 0; + quint64 m_unsignedValue; + }; + Type m_type = Signed; +}; + +#endif // ENUMVALUE_H diff --git a/sources/shiboken2/ApiExtractor/qtdocparser.cpp b/sources/shiboken2/ApiExtractor/qtdocparser.cpp index 0ac87bd16..85c3473cd 100644 --- a/sources/shiboken2/ApiExtractor/qtdocparser.cpp +++ b/sources/shiboken2/ApiExtractor/qtdocparser.cpp @@ -68,6 +68,17 @@ static void formatFunctionArgTypeQuery(QTextStream &str, const AbstractMetaArgum str << name; } break; + case AbstractMetaType::ContainerPattern: { // QVector<int> + str << metaType->typeEntry()->qualifiedCppName() << '<'; + const auto instantiations = metaType->instantiations(); + for (int i = 0, size = instantiations.size(); i < size; ++i) { + if (i) + str << ", "; + str << instantiations.at(i)->typeEntry()->qualifiedCppName(); + } + str << '>'; + } + break; default: // Fully qualify enums (Qt::AlignmentFlag), nested classes, etc. str << metaType->typeEntry()->qualifiedCppName(); break; @@ -218,7 +229,8 @@ Documentation QtDocParser::retrieveModuleDocumentation(const QString& name) xquery.setFocus(QUrl(sourceFile)); // Module documentation - QString query = QLatin1String("/WebXML/document/page[@name=\"") + moduleName + QLatin1String("\"]/description"); + QString query = QLatin1String("/WebXML/document/module[@name=\"") + + moduleName + QLatin1String("\"]/description"); const Documentation doc = getDocumentation(xquery, query, DocModificationList()); if (doc.isEmpty()) qCWarning(lcShiboken(), "%s", qPrintable(msgCannotFindDocumentation(sourceFile, "module", name, query))); diff --git a/sources/shiboken2/ApiExtractor/tests/testarrayargument.cpp b/sources/shiboken2/ApiExtractor/tests/testarrayargument.cpp index cbeb216c9..eb10fc8a0 100644 --- a/sources/shiboken2/ApiExtractor/tests/testarrayargument.cpp +++ b/sources/shiboken2/ApiExtractor/tests/testarrayargument.cpp @@ -133,7 +133,7 @@ void TestArrayArgument::testArrayArgumentWithSizeDefinedByEnumValue() const AbstractMetaArgument* arg = classA->functions().last()->arguments().first(); QVERIFY(arg->type()->isArray()); - QCOMPARE(arg->type()->arrayElementCount(), nvalues->value()); + QCOMPARE(arg->type()->arrayElementCount(), nvalues->value().value()); QCOMPARE(arg->type()->arrayElementType()->name(), QLatin1String("double")); }; @@ -164,7 +164,7 @@ void TestArrayArgument::testArrayArgumentWithSizeDefinedByEnumValueFromGlobalEnu const AbstractMetaArgument* arg = classA->functions().last()->arguments().first(); QVERIFY(arg->type()->isArray()); - QCOMPARE(arg->type()->arrayElementCount(), nvalues->value()); + QCOMPARE(arg->type()->arrayElementCount(), nvalues->value().value()); QCOMPARE(arg->type()->arrayElementType()->name(), QLatin1String("double")); }; diff --git a/sources/shiboken2/ApiExtractor/tests/testenum.cpp b/sources/shiboken2/ApiExtractor/tests/testenum.cpp index 55c098840..970f6d00c 100644 --- a/sources/shiboken2/ApiExtractor/tests/testenum.cpp +++ b/sources/shiboken2/ApiExtractor/tests/testenum.cpp @@ -149,12 +149,12 @@ void TestEnum::testAnonymousEnum() AbstractMetaEnumValue* enumValueA0 = anonEnumA1->values().first(); QCOMPARE(enumValueA0->name(), QLatin1String("A0")); - QCOMPARE(enumValueA0->value(), 0); + QCOMPARE(enumValueA0->value().value(), 0); QCOMPARE(enumValueA0->stringValue(), QString()); AbstractMetaEnumValue* enumValueA1 = anonEnumA1->values().last(); QCOMPARE(enumValueA1->name(), QLatin1String("A1")); - QCOMPARE(enumValueA1->value(), 1); + QCOMPARE(enumValueA1->value().value(), 1); QCOMPARE(enumValueA1->stringValue(), QString()); AbstractMetaEnum* anonEnumIsThis = classes[0]->findEnum(QLatin1String("isThis")); @@ -164,12 +164,12 @@ void TestEnum::testAnonymousEnum() AbstractMetaEnumValue* enumValueIsThis = anonEnumIsThis->values().first(); QCOMPARE(enumValueIsThis->name(), QLatin1String("isThis")); - QCOMPARE(enumValueIsThis->value(), static_cast<int>(true)); + QCOMPARE(enumValueIsThis->value().value(), static_cast<int>(true)); QCOMPARE(enumValueIsThis->stringValue(), QLatin1String("true")); AbstractMetaEnumValue* enumValueIsThat = anonEnumIsThis->values().last(); QCOMPARE(enumValueIsThat->name(), QLatin1String("isThat")); - QCOMPARE(enumValueIsThat->value(), static_cast<int>(false)); + QCOMPARE(enumValueIsThat->value().value(), static_cast<int>(false)); QCOMPARE(enumValueIsThat->stringValue(), QLatin1String("false")); } @@ -195,12 +195,12 @@ void TestEnum::testGlobalEnums() AbstractMetaEnumValue* enumValueA0 = enumA->values().first(); QCOMPARE(enumValueA0->name(), QLatin1String("A0")); - QCOMPARE(enumValueA0->value(), 0); + QCOMPARE(enumValueA0->value().value(), 0); QCOMPARE(enumValueA0->stringValue(), QString()); AbstractMetaEnumValue* enumValueA1 = enumA->values().last(); QCOMPARE(enumValueA1->name(), QLatin1String("A1")); - QCOMPARE(enumValueA1->value(), 1); + QCOMPARE(enumValueA1->value().value(), 1); QCOMPARE(enumValueA1->stringValue(), QString()); AbstractMetaEnum* enumB = globalEnums.last(); @@ -208,12 +208,12 @@ void TestEnum::testGlobalEnums() AbstractMetaEnumValue* enumValueB0 = enumB->values().first(); QCOMPARE(enumValueB0->name(), QLatin1String("B0")); - QCOMPARE(enumValueB0->value(), 2); + QCOMPARE(enumValueB0->value().value(), 2); QCOMPARE(enumValueB0->stringValue(), QLatin1String("2")); AbstractMetaEnumValue* enumValueB1 = enumB->values().last(); QCOMPARE(enumValueB1->name(), QLatin1String("B1")); - QCOMPARE(enumValueB1->value(), 4); + QCOMPARE(enumValueB1->value().value(), 4); QCOMPARE(enumValueB1->stringValue(), QLatin1String("0x4")); } @@ -245,12 +245,12 @@ void TestEnum::testEnumValueFromNeighbourEnum() AbstractMetaEnumValue* enumValueA0 = enumA->values().first(); QCOMPARE(enumValueA0->name(), QLatin1String("ValueA0")); - QCOMPARE(enumValueA0->value(), 0); + QCOMPARE(enumValueA0->value().value(), 0); QCOMPARE(enumValueA0->stringValue(), QString()); AbstractMetaEnumValue* enumValueA1 = enumA->values().last(); QCOMPARE(enumValueA1->name(), QLatin1String("ValueA1")); - QCOMPARE(enumValueA1->value(), 1); + QCOMPARE(enumValueA1->value().value(), 1); QCOMPARE(enumValueA1->stringValue(), QString()); AbstractMetaEnum* enumB = classes[0]->findEnum(QLatin1String("EnumB")); @@ -259,12 +259,12 @@ void TestEnum::testEnumValueFromNeighbourEnum() AbstractMetaEnumValue* enumValueB0 = enumB->values().first(); QCOMPARE(enumValueB0->name(), QLatin1String("ValueB0")); - QCOMPARE(enumValueB0->value(), 1); + QCOMPARE(enumValueB0->value().value(), 1); QCOMPARE(enumValueB0->stringValue(), QLatin1String("A::ValueA1")); AbstractMetaEnumValue* enumValueB1 = enumB->values().last(); QCOMPARE(enumValueB1->name(), QLatin1String("ValueB1")); - QCOMPARE(enumValueB1->value(), 0); + QCOMPARE(enumValueB1->value().value(), 0); QCOMPARE(enumValueB1->stringValue(), QLatin1String("ValueA0")); } @@ -272,21 +272,25 @@ void TestEnum::testEnumValueFromExpression() { const char* cppCode ="\ struct A {\n\ - enum EnumA {\n\ + enum EnumA : unsigned {\n\ ValueA0 = 3u,\n\ ValueA1 = ~3u,\n\ - ValueA2 = ~3,\n\ + ValueA2 = 0xffffffff,\n\ ValueA3 = 0xf0,\n\ ValueA4 = 8 |ValueA3,\n\ ValueA5 = ValueA3|32,\n\ ValueA6 = ValueA3 >> 1,\n\ ValueA7 = ValueA3 << 1\n\ };\n\ + enum EnumB : int {\n\ + ValueB0 = ~3,\n\ + };\n\ };\n"; const char* xmlCode = "\ <typesystem package=\"Foo\">\n\ <value-type name='A'>\n\ <enum-type name='EnumA'/>\n\ + <enum-type name='EnumB'/>\n\ </value-type>\n\ </typesystem>\n"; @@ -298,47 +302,58 @@ void TestEnum::testEnumValueFromExpression() AbstractMetaEnum* enumA = classA->findEnum(QLatin1String("EnumA")); QVERIFY(enumA); + QVERIFY(!enumA->isSigned()); QCOMPARE(enumA->typeEntry()->qualifiedCppName(), QLatin1String("A::EnumA")); AbstractMetaEnumValue* valueA0 = enumA->values().at(0); QCOMPARE(valueA0->name(), QLatin1String("ValueA0")); QCOMPARE(valueA0->stringValue(), QLatin1String("3u")); - QCOMPARE(valueA0->value(), (int) 3u); + QCOMPARE(valueA0->value().unsignedValue(), 3u); AbstractMetaEnumValue* valueA1 = enumA->values().at(1); QCOMPARE(valueA1->name(), QLatin1String("ValueA1")); QCOMPARE(valueA1->stringValue(), QLatin1String("~3u")); - QCOMPARE(valueA1->value(), (int) ~3u); + QCOMPARE(valueA1->value().unsignedValue(), ~3u); AbstractMetaEnumValue* valueA2 = enumA->values().at(2); QCOMPARE(valueA2->name(), QLatin1String("ValueA2")); - QCOMPARE(valueA2->stringValue(), QLatin1String("~3")); - QCOMPARE(valueA2->value(), ~3); + QCOMPARE(valueA2->stringValue(), QLatin1String("0xffffffff")); + QCOMPARE(valueA2->value().unsignedValue(), 0xffffffffu); AbstractMetaEnumValue* valueA3 = enumA->values().at(3); QCOMPARE(valueA3->name(), QLatin1String("ValueA3")); QCOMPARE(valueA3->stringValue(), QLatin1String("0xf0")); - QCOMPARE(valueA3->value(), 0xf0); + QCOMPARE(valueA3->value().unsignedValue(), 0xf0u); AbstractMetaEnumValue* valueA4 = enumA->values().at(4); QCOMPARE(valueA4->name(), QLatin1String("ValueA4")); QCOMPARE(valueA4->stringValue(), QLatin1String("8 |ValueA3")); - QCOMPARE(valueA4->value(), 8|0xf0); + QCOMPARE(valueA4->value().unsignedValue(), 8|0xf0u); AbstractMetaEnumValue* valueA5 = enumA->values().at(5); QCOMPARE(valueA5->name(), QLatin1String("ValueA5")); QCOMPARE(valueA5->stringValue(), QLatin1String("ValueA3|32")); - QCOMPARE(valueA5->value(), 0xf0|32); + QCOMPARE(valueA5->value().unsignedValue(), 0xf0u|32); AbstractMetaEnumValue* valueA6 = enumA->values().at(6); QCOMPARE(valueA6->name(), QLatin1String("ValueA6")); QCOMPARE(valueA6->stringValue(), QLatin1String("ValueA3 >> 1")); - QCOMPARE(valueA6->value(), 0xf0 >> 1); + QCOMPARE(valueA6->value().unsignedValue(), 0xf0u >> 1); AbstractMetaEnumValue* valueA7 = enumA->values().at(7); QCOMPARE(valueA7->name(), QLatin1String("ValueA7")); QCOMPARE(valueA7->stringValue(), QLatin1String("ValueA3 << 1")); - QCOMPARE(valueA7->value(), 0xf0 << 1); + QCOMPARE(valueA7->value().unsignedValue(), 0xf0u << 1); + + const AbstractMetaEnum *enumB = classA->findEnum(QLatin1String("EnumB")); + QVERIFY(enumB); + QVERIFY(enumB->isSigned()); + QCOMPARE(enumB->typeEntry()->qualifiedCppName(), QLatin1String("A::EnumB")); + QCOMPARE(enumB->values().size(), 1); + const AbstractMetaEnumValue *valueB0 = enumB->values().at(0); + QCOMPARE(valueB0->name(), QLatin1String("ValueB0")); + QCOMPARE(valueB0->stringValue(), QLatin1String("~3")); + QCOMPARE(valueB0->value().value(), ~3); } void TestEnum::testPrivateEnum() @@ -375,12 +390,12 @@ void TestEnum::testPrivateEnum() AbstractMetaEnumValue* pub0 = publicEnum->values().first(); QCOMPARE(pub0->name(), QLatin1String("Pub0")); - QCOMPARE(pub0->value(), 0x0f); + QCOMPARE(pub0->value().value(), 0x0f); QCOMPARE(pub0->stringValue(), QLatin1String("Priv0")); AbstractMetaEnumValue* pub1 = publicEnum->values().last(); QCOMPARE(pub1->name(), QLatin1String("Pub1")); - QCOMPARE(pub1->value(), 0xf0); + QCOMPARE(pub1->value().value(), 0xf0); QCOMPARE(pub1->stringValue(), QLatin1String("A::Priv1")); } @@ -408,12 +423,12 @@ void TestEnum::testTypedefEnum() AbstractMetaEnumValue* enumValueA0 = enumA->values().first(); QCOMPARE(enumValueA0->name(), QLatin1String("A0")); - QCOMPARE(enumValueA0->value(), 0); + QCOMPARE(enumValueA0->value().value(), 0); QCOMPARE(enumValueA0->stringValue(), QLatin1String("")); AbstractMetaEnumValue* enumValueA1 = enumA->values().last(); QCOMPARE(enumValueA1->name(), QLatin1String("A1")); - QCOMPARE(enumValueA1->value(), 1); + QCOMPARE(enumValueA1->value().value(), 1); QCOMPARE(enumValueA1->stringValue(), QString()); } diff --git a/sources/shiboken2/ApiExtractor/typesystem.cpp b/sources/shiboken2/ApiExtractor/typesystem.cpp index 600536aba..0a47b9b17 100644 --- a/sources/shiboken2/ApiExtractor/typesystem.cpp +++ b/sources/shiboken2/ApiExtractor/typesystem.cpp @@ -963,11 +963,6 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts m_currentEnum = new EnumTypeEntry(QStringList(names.mid(0, names.size() - 1)).join(colonColon()), names.constLast(), since); - if (!attributes.value(enumIdentifiedByValueAttribute()).isEmpty()) { - m_currentEnum->setEnumKind(EnumTypeEntry::AnonymousEnum); - } else if (convertBoolean(attributes.value(classAttribute()), classAttribute(), false)) { - m_currentEnum->setEnumKind(EnumTypeEntry::EnumClass); - } element->entry = m_currentEnum; m_currentEnum->setCodeGeneration(m_generate); m_currentEnum->setTargetLangPackage(m_defaultPackage); diff --git a/sources/shiboken2/ApiExtractor/typesystem.h b/sources/shiboken2/ApiExtractor/typesystem.h index 2f534c93d..eae064134 100644 --- a/sources/shiboken2/ApiExtractor/typesystem.h +++ b/sources/shiboken2/ApiExtractor/typesystem.h @@ -1041,12 +1041,6 @@ private: class EnumTypeEntry : public TypeEntry { public: - enum EnumKind { - CEnum, // Standard C: enum Foo { value1, value2 } - AnonymousEnum, // enum { value1, value2 } - EnumClass // C++ 11 : enum class Foo { value1, value2 } - }; - explicit EnumTypeEntry(const QString &nspace, const QString &enumName, const QVersionNumber &vr); @@ -1068,9 +1062,6 @@ public: m_qualifier = q; } - EnumKind enumKind() const { return m_enumKind; } - void setEnumKind(EnumKind kind) { m_enumKind = kind; } - bool preferredConversion() const override; bool isBoundsChecked() const @@ -1136,8 +1127,6 @@ public: m_forceInteger = force; } - bool isAnonymous() const { return m_enumKind == AnonymousEnum; } - private: QString m_packageName; QString m_qualifier; @@ -1150,8 +1139,6 @@ private: FlagsTypeEntry *m_flags = nullptr; - EnumKind m_enumKind = CEnum; - bool m_extensible = false; bool m_forceInteger = false; }; diff --git a/sources/shiboken2/CMakeLists.txt b/sources/shiboken2/CMakeLists.txt index e774a172b..b65e32974 100644 --- a/sources/shiboken2/CMakeLists.txt +++ b/sources/shiboken2/CMakeLists.txt @@ -56,6 +56,9 @@ endmacro() set(CLANG_DIR "") set(CLANG_DIR_SOURCE "") +set(clang_not_found_message "Unable to detect CLANG location by checking LLVM_INSTALL_DIR, \ + CLANG_INSTALL_DIR or running llvm-config.") + if (DEFINED ENV{LLVM_INSTALL_DIR}) set(CLANG_DIR $ENV{LLVM_INSTALL_DIR}) string(REPLACE "_ARCH_" "${PYTHON_ARCH}" CLANG_DIR "${CLANG_DIR}") @@ -69,6 +72,10 @@ else () get_llvm_config() endif() set(CLANG_DIR_SOURCE "${LLVM_CONFIG}") + if ("${CLANG_DIR_SOURCE}" STREQUAL "") + message(FATAL_ERROR "${clang_not_found_message}") + endif() + EXEC_PROGRAM("${LLVM_CONFIG}" ARGS "--prefix" OUTPUT_VARIABLE CLANG_DIR) if (NOT "${CLANG_DIR}" STREQUAL "") EXEC_PROGRAM("${LLVM_CONFIG}" ARGS "--version" OUTPUT_VARIABLE CLANG_VERSION) @@ -79,7 +86,7 @@ else () endif() if ("${CLANG_DIR}" STREQUAL "") - message(FATAL_ERROR "Unable to detect CLANG location by checking LLVM_INSTALL_DIR, CLANG_INSTALL_DIR or running llvm-config.") + message(FATAL_ERROR "${clang_not_found_message}") elseif (NOT IS_DIRECTORY ${CLANG_DIR}) message(FATAL_ERROR "${CLANG_DIR} detected by ${CLANG_DIR_SOURCE} does not exist.") endif() diff --git a/sources/shiboken2/doc/README.md b/sources/shiboken2/doc/README.md new file mode 100644 index 000000000..2575eafd2 --- /dev/null +++ b/sources/shiboken2/doc/README.md @@ -0,0 +1,12 @@ +# Shiboken Documentation + +The documentation was written and needs to be generated +with [python-sphinx](http://www.sphinx-doc.org/en/master/) + +### Images + +The SVG diagrams use the Qt color scheme. +The font also follows Qt styling, and it is called `Titillium`. +It can be download from: +* https://fonts.google.com/specimen/Titillium+Web +* https://www.fontsquirrel.com/fonts/Titillium diff --git a/sources/shiboken2/doc/codeinjectionsemantics.rst b/sources/shiboken2/doc/codeinjectionsemantics.rst index d748a3aae..bf3ddbe5e 100644 --- a/sources/shiboken2/doc/codeinjectionsemantics.rst +++ b/sources/shiboken2/doc/codeinjectionsemantics.rst @@ -2,11 +2,12 @@ Code Injection Semantics ************************ -API Extractor provides the `inject-code -<http://www.pyside.org/docs/apiextractor/typesystem_manipulating_objects.html#inject-code>`_ tag -allowing the user to put custom written code to on specific locations of the generated code. -Yet this is only part of what is needed to generate proper binding code, where the custom code -should be written to depends upon the technology used on the generated binding code. +API Extractor provides the `inject-code`_ tag allowing the user to put custom +written code to on specific locations of the generated code. +Yet this is only part of what is needed to generate proper binding code, where +the custom code should be written to depends upon the technology used on the +generated binding code. + This is the ``inject-code`` tag options that matters to |project|. @@ -16,6 +17,7 @@ This is the ``inject-code`` tag options that matters to |project|. // custom code </inject-code> + Conventions =========== @@ -86,7 +88,7 @@ The following table describes the semantics of ``inject-code`` tag as used on | | | |signature. | | +------+---------+--------------------------------------------------------------+ | |shell |beginning|Used only for virtual functions. The code is injected when the| - | | | |function does not has a pyhton implementation, then the code | + | | | |function does not has a Python implementation, then the code | | | | |is inserted before c++ call | | | +---------+--------------------------------------------------------------+ | | |end |Same as above, but the code is inserted after c++ call | @@ -158,7 +160,7 @@ If the argument is removed and no default value is provided, the generator will not write any call to the method and expect the ``modify-function - target/beginning`` code injection to call the original C++ method on its own terms. If even this custom code is not provided the generator will put an ``#error`` clause to -prevent compilation of erroneus binding code. +prevent compilation of erroneous binding code. Calling the method with your own hands always! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -352,7 +354,7 @@ Code injections to the class Python initialization function. Code Injection for Modules ========================== -The C++ libraries are wapped as Python modules, a collection of classes, +The C++ libraries are wrapped as Python modules, a collection of classes, functions, enums and namespaces. |project| creates wrapper files for all of them and also one extra ``MODULENAME_module_wrapper.cpp`` to register the whole module. Code injection xml tags who have the ``typesystem`` tag as parent will @@ -395,3 +397,5 @@ to prevent bad custom code to pass unnoticed. // Start of ``MODULENAME_module_wrapper.cpp`` + +.. _`inject-code`: http://www.pyside.org/docs/apiextractor/typesystem_manipulating_objects.html#inject-code diff --git a/sources/shiboken2/doc/dependency-pyqtb.svg b/sources/shiboken2/doc/dependency-pyqtb.svg deleted file mode 100644 index a458bf6fb..000000000 --- a/sources/shiboken2/doc/dependency-pyqtb.svg +++ /dev/null @@ -1,600 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="800" - height="340" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.46" - version="1.0" - sodipodi:docname="dependency-pyqtb.svg" - inkscape:output_extension="org.inkscape.output.svg.inkscape" - inkscape:export-filename="/var/www/lauro/dependency-pyqtb.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90"> - <defs - id="defs4"> - <marker - inkscape:stockid="Arrow1Lstart" - orient="auto" - refY="0" - refX="0" - id="Arrow1Lstart" - style="overflow:visible"> - <path - id="path3270" - d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z" - style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" - transform="matrix(0.8,0,0,0.8,10,0)" /> - </marker> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0" - refX="0" - id="Arrow1Lend" - style="overflow:visible"> - <path - id="path3679" - d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z" - style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" - transform="matrix(-0.8,0,0,-0.8,-10,0)" /> - </marker> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - id="perspective10" /> - <inkscape:perspective - id="perspective3480" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_x="0 : 526.18109 : 1" - sodipodi:type="inkscape:persp3d" /> - <inkscape:perspective - id="perspective3498" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_x="0 : 526.18109 : 1" - sodipodi:type="inkscape:persp3d" /> - <inkscape:perspective - id="perspective3541" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_x="0 : 526.18109 : 1" - sodipodi:type="inkscape:persp3d" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - gridtolerance="10000" - guidetolerance="10" - objecttolerance="10" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="1.0425" - inkscape:cx="400" - inkscape:cy="170" - inkscape:document-units="px" - inkscape:current-layer="g3995" - showgrid="false" - showguides="true" - inkscape:guide-bbox="true" - inkscape:window-width="1280" - inkscape:window-height="951" - inkscape:window-x="0" - inkscape:window-y="25" /> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-94.976306,-355.09425)" /> - <g - id="g4087" - transform="translate(2.4157429e-6,1.9999951)"> - <g - id="g3995" - transform="translate(6,-3.2661035e-8)"> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.66823119px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow1Lstart);marker-end:none;stroke-opacity:1" - d="M 281.95594,47.06539 L 314.12853,47.06538" - id="path2877" - inkscape:connector-type="polyline" /> - <g - id="g3801" - transform="translate(-9.3125054,-154.20033)"> - <rect - y="286.49988" - x="322.2547" - height="73.367416" - width="194.85175" - id="rect3595" - style="fill:#9ac5ff;fill-opacity:1;fill-rule:evenodd;stroke:#003378;stroke-width:0.8142156;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - ry="10.318988" - rx="8.598484" /> - <g - transform="translate(1.7229236,-30.915768)" - id="g3599"> - <text - xml:space="preserve" - style="font-size:16.27989578px;font-style:normal;font-weight:normal;fill:#00183c;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="336.95081" - id="text2443"><tspan - sodipodi:role="line" - id="tspan2445" - x="329.46826" - y="336.95081">API Extractor</tspan></text> - <text - xml:space="preserve" - style="font-size:8.40044498px;font-style:normal;font-weight:normal;fill:#00183c;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="352.61548" - id="text2447"><tspan - sodipodi:role="line" - id="tspan2449" - x="329.46826" - y="352.61548">0.2</tspan></text> - <text - xml:space="preserve" - style="font-size:9.33067703px;font-style:normal;font-weight:normal;fill:#00183c;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="368.15546" - id="text2451"><tspan - sodipodi:role="line" - x="329.46826" - y="368.15546" - id="tspan2453">Headers and libraries - compile-time</tspan></text> - <text - xml:space="preserve" - style="font-size:8.26250458px;font-style:normal;font-weight:normal;fill:#00183c;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="383.47839" - id="text2455"><tspan - sodipodi:role="line" - id="tspan2457" - x="329.46826" - y="383.47839">LGPL version 2.1</tspan></text> - </g> - </g> - <g - id="g3729" - transform="translate(-9.3125054,-153.6367)"> - <rect - y="164.01837" - x="322.2547" - height="73.367416" - width="194.85175" - id="rect2459" - style="fill:#9ac5ff;fill-opacity:1;fill-rule:evenodd;stroke:#003378;stroke-width:0.8142156;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - ry="10.318988" - rx="8.598484" /> - <g - transform="translate(3.673984,2.3276517)" - id="g3585"> - <text - xml:space="preserve" - style="font-size:16.27989578px;font-style:normal;font-weight:normal;fill:#00183c;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="181.23659" - id="text2461"><tspan - sodipodi:role="line" - id="tspan2463" - x="329.46826" - y="181.23659">Shiboken (generator)</tspan></text> - <text - xml:space="preserve" - style="font-size:8.40044498px;font-style:normal;font-weight:normal;fill:#00183c;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="196.90126" - id="text2465"><tspan - sodipodi:role="line" - id="tspan2467" - x="329.46826" - y="196.90126">0.1</tspan></text> - <text - xml:space="preserve" - style="font-size:9.33067703px;font-style:normal;font-weight:normal;fill:#00183c;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="212.44124" - id="text2469"><tspan - sodipodi:role="line" - x="329.46826" - y="212.44124" - id="tspan2471">Binary executable - compile-time</tspan></text> - <text - xml:space="preserve" - style="font-size:8.26250458px;font-style:normal;font-weight:normal;fill:#00183c;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="227.76418" - id="text2473"><tspan - sodipodi:role="line" - id="tspan2475" - x="329.46826" - y="227.76418">GPL version 2</tspan></text> - </g> - </g> - <g - id="g3789" - transform="translate(-9.3125054,-154.20033)"> - <rect - y="406.48441" - x="322.2547" - height="73.367416" - width="194.85175" - id="rect3597" - style="fill:#f3a6a6;fill-opacity:1;fill-rule:evenodd;stroke:#6a0e0e;stroke-width:0.8142156;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - ry="10.318988" - rx="8.598484" /> - <g - transform="translate(-0.7447933,-64)" - id="g3633"> - <text - xml:space="preserve" - style="font-size:16.27989578px;font-style:normal;font-weight:normal;fill:#350707;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="489.09369" - id="text2565"><tspan - sodipodi:role="line" - id="tspan2567" - x="329.46826" - y="489.09369">boost::graph</tspan></text> - <text - xml:space="preserve" - style="font-size:8.40044498px;font-style:normal;font-weight:normal;fill:#350707;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="504.75836" - id="text2569"><tspan - sodipodi:role="line" - id="tspan2571" - x="329.46826" - y="504.75836">1.38.0</tspan></text> - <text - xml:space="preserve" - style="font-size:9.33067703px;font-style:normal;font-weight:normal;fill:#350707;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="520.29834" - id="text2573"><tspan - sodipodi:role="line" - x="329.46826" - y="520.29834" - id="tspan2575">headers and libraries - compile-time</tspan></text> - <text - xml:space="preserve" - style="font-size:8.26250458px;font-style:normal;font-weight:normal;fill:#350707;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="535.62128" - id="text2577"><tspan - sodipodi:role="line" - id="tspan2579" - x="329.46826" - y="535.62128">Boost Software License 1.0</tspan></text> - </g> - </g> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.77180147px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow1Lstart);marker-end:none;stroke-opacity:1" - d="M 410.36806,130.70564 L 410.36806,83.52386" - id="path2879" - inkscape:connector-type="polyline" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.77360356px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow1Lstart);marker-mid:none;marker-end:none;stroke-opacity:1" - d="M 410.36806,252.57322 L 410.36806,207.23899" - id="path2881" - inkscape:connector-type="polyline" /> - <g - id="g3565" - transform="translate(1.4608973,-106.88798)"> - <rect - ry="22.567146" - y="268.8403" - x="6.7667637" - height="163.45378" - width="273.78238" - id="rect7541" - style="fill:#e3e2db;stroke:#000000;stroke-width:1.30499184;stroke-opacity:1" - rx="22.567146" /> - <g - transform="translate(0.2849671,3.2991583)" - id="g3547"> - <g - id="g3516" - transform="translate(0,63.999998)"> - <text - id="text7543" - y="339.74512" - x="76.614265" - style="font-size:20.61732101px;font-style:normal;font-weight:normal;fill:#350707;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - xml:space="preserve"><tspan - y="339.74512" - x="76.614265" - id="tspan7545" - sodipodi:role="line">Boost</tspan></text> - <rect - ry="6.4285707" - y="321.55374" - x="21.614267" - height="22.5" - width="43.163269" - id="rect7555" - style="fill:#f3a6a6;fill-opacity:1;stroke:#6a0e0e;stroke-width:0.64285713;stroke-opacity:1" - rx="6.4285707" /> - </g> - <g - id="g3521" - transform="translate(0,-2.9523642)"> - <text - id="text7547" - y="372.67505" - x="76.614265" - style="font-size:20.61732101px;font-style:normal;font-weight:normal;fill:#1c2d0f;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - xml:space="preserve"><tspan - y="372.67505" - x="76.614265" - id="tspan7549" - sodipodi:role="line">Qt Software</tspan></text> - <rect - ry="6.4285707" - y="355.4823" - x="21.614267" - height="22.5" - width="43.163269" - id="rect7561" - style="fill:#97ce6c;fill-opacity:1;stroke:#385a1e;stroke-width:0.64285713;stroke-opacity:1" - rx="6.4285707" /> - </g> - <g - id="g3486" - transform="translate(0,2.8342009e-5)"> - <text - id="text7551" - y="304.38055" - x="76.614265" - style="font-size:20.61732101px;font-style:normal;font-weight:normal;fill:#00193c;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - xml:space="preserve"><tspan - y="304.38055" - x="76.614265" - id="tspan7553" - sodipodi:role="line">INdT/Nokia</tspan></text> - <rect - ry="6.4285707" - y="286.4823" - x="21.614267" - height="22.5" - width="43.163269" - id="rect7563" - style="fill:#9ac5ff;fill-opacity:1;stroke:#003378;stroke-width:0.64285713;stroke-opacity:1" - rx="6.4285707" /> - </g> - <g - id="g3526" - transform="translate(-1.3182277,-35.976168)" - style="fill:#ffe052;fill-opacity:1"> - <text - id="text3528" - y="372.67505" - x="76.614265" - style="font-size:20.61732101px;font-style:normal;font-weight:normal;fill:#3c3100;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - xml:space="preserve"><tspan - y="372.67505" - x="76.614265" - id="tspan3530" - sodipodi:role="line">Python Foundation</tspan></text> - <rect - ry="6.4285707" - y="355.4823" - x="21.614267" - height="22.5" - width="43.163269" - id="rect3532" - style="fill:#ffe052;fill-opacity:1;stroke:#786200;stroke-width:0.64285713;stroke-opacity:1" - rx="6.4285707" /> - </g> - </g> - </g> - <g - id="g3717" - transform="translate(232.28126,-66.767457)"> - <rect - y="77.149132" - x="322.2547" - height="73.367416" - width="194.85175" - id="rect3657" - style="fill:#9ac5ff;fill-opacity:1;fill-rule:evenodd;stroke:#003378;stroke-width:0.8142156;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - ry="10.318988" - rx="8.598484" /> - <g - transform="translate(4.8773009,-84.541588)" - id="g3659"> - <text - xml:space="preserve" - style="font-size:16.27989578px;font-style:normal;font-weight:normal;fill:#00183c;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="181.23659" - id="text3661"><tspan - sodipodi:role="line" - id="tspan3663" - x="329.46826" - y="181.23659">libshiboken</tspan></text> - <text - xml:space="preserve" - style="font-size:8.40044498px;font-style:normal;font-weight:normal;fill:#00183c;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="196.90126" - id="text3665"><tspan - sodipodi:role="line" - id="tspan3667" - x="329.46826" - y="196.90126">0.1</tspan></text> - <text - xml:space="preserve" - style="font-size:9.33067703px;font-style:normal;font-weight:normal;fill:#00183c;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="212.44124" - id="text3669"><tspan - sodipodi:role="line" - x="329.46826" - y="212.44124" - id="tspan3671">Headers and libraries - compile-time</tspan></text> - <text - xml:space="preserve" - style="font-size:8.26250458px;font-style:normal;font-weight:normal;fill:#00183c;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="227.76418" - id="text3673"><tspan - sodipodi:role="line" - id="tspan3675" - x="329.46826" - y="227.76418">LGPL version 2.1</tspan></text> - </g> - </g> - <g - id="g3752" - transform="translate(-10.802055,-155.79173)"> - <rect - rx="8.3239012" - y="166.21593" - x="18.860012" - height="73.282379" - width="274.18781" - id="rect2417" - style="fill:#97ce6c;fill-opacity:1;fill-rule:evenodd;stroke:#385a1e;stroke-width:0.96558368px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - ry="9.2689295" /> - <g - id="g3741"> - <text - xml:space="preserve" - style="font-size:16.27989578px;font-style:normal;font-weight:normal;fill:#1c2d0f;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="29.111408" - y="183.02223" - id="text2419"><tspan - sodipodi:role="line" - id="tspan2421" - x="29.111408" - y="183.02223">Qt 4.5</tspan></text> - <text - xml:space="preserve" - style="font-size:8.40044498px;font-style:normal;font-weight:normal;fill:#1c2d0f;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="29.111408" - y="198.68694" - id="text2423"><tspan - sodipodi:role="line" - id="tspan2425" - x="29.111408" - y="198.68694">4.5</tspan></text> - <text - xml:space="preserve" - style="font-size:9.33067703px;font-style:normal;font-weight:normal;fill:#1c2d0f;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="29.111408" - y="214.22688" - id="text2427"><tspan - sodipodi:role="line" - id="tspan2429" - x="29.111408" - y="214.22688">headers and libraries - compile-time and run-time</tspan></text> - <text - xml:space="preserve" - style="font-size:8.26250458px;font-style:normal;font-weight:normal;fill:#1c2d0f;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="29.111408" - y="224.19267" - id="text2431"><tspan - sodipodi:role="line" - id="tspan2433" - x="29.111408" - y="224.19267">GNU General Public License v3 /</tspan><tspan - id="tspan2472" - sodipodi:role="line" - x="29.111408" - y="234.5208">GNU Lesser General Public Licence v2.1</tspan></text> - </g> - </g> - <g - id="g3765" - transform="translate(201.65125,55.15042)"> - <rect - y="77.208275" - x="322.31384" - height="73.24913" - width="255.99348" - id="rect3767" - style="fill:#ffe052;fill-opacity:1;fill-rule:evenodd;stroke:#786200;stroke-width:0.93250537;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - ry="10.318988" - rx="8.598484" /> - <g - transform="translate(4.8773009,-84.541588)" - id="g3769"> - <text - xml:space="preserve" - style="font-size:16.27989578px;font-style:normal;font-weight:normal;fill:#3c3100;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="181.23659" - id="text3771"><tspan - sodipodi:role="line" - id="tspan3773" - x="329.46826" - y="181.23659">Python</tspan></text> - <text - xml:space="preserve" - style="font-size:8.40044498px;font-style:normal;font-weight:normal;fill:#3c3100;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="196.90126" - id="text3775"><tspan - sodipodi:role="line" - id="tspan3777" - x="329.46826" - y="196.90126">2.6</tspan></text> - <text - xml:space="preserve" - style="font-size:9.33067703px;font-style:normal;font-weight:normal;fill:#3c3100;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="212.44124" - id="text3779"><tspan - sodipodi:role="line" - x="329.46826" - y="212.44124" - id="tspan3781">Headers and libraries - compile-time and run-time</tspan></text> - <text - xml:space="preserve" - style="font-size:8.26250458px;font-style:normal;font-weight:normal;fill:#3c3100;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="329.46826" - y="227.76418" - id="text3783"><tspan - sodipodi:role="line" - id="tspan3785" - x="329.46826" - y="227.76418">Python license</tspan></text> - </g> - </g> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.77180147px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow1Lstart);marker-end:none;stroke-opacity:1" - d="M 651.96184,131.80908 L 651.96184,84.6273" - id="path3787" - inkscape:connector-type="polyline" /> - </g> - </g> -</svg> diff --git a/sources/shiboken2/doc/faq.rst b/sources/shiboken2/doc/faq.rst index 77e0fbdfc..4b2bf9eea 100644 --- a/sources/shiboken2/doc/faq.rst +++ b/sources/shiboken2/doc/faq.rst @@ -2,8 +2,8 @@ Frequently Asked Questions ************************** -This is a list of Frequently Asked Questions about |project|. Feel free to -suggest new entries! +This is a list of Frequently Asked Questions about |project|. +Feel free to suggest new entries using our `Mailing list`_ or our IRC channel! General ======= @@ -11,17 +11,20 @@ General What is Shiboken? ----------------- -Shiboken is a `GeneratorRunner <http://www.pyside.org/home-binding/binding-generator>`_ -plugin that outputs C++ code for CPython extensions. The first version of PySide -had source code based on Boost templates. It was easier to produce code but a -paradigm change was needed, as the next question explains. +Shiboken is a `GeneratorRunner`_ that outputs C++ code for CPython +extensions. +The first version of PySide had source code based on Boost templates. +It was easier to produce code but a paradigm change was needed, as the next +question explains. + Why did you switch from Boost.Python to Shiboken? ------------------------------------------------- -The main reason was the size reduction. Boost.Python makes excessive use of templates -resulting in a significant increase of the binaries size. On the other hand, as Shiboken -generates CPython code, the resulting binaries are smaller. +The main reason was the size reduction. Boost.Python makes excessive use of +templates resulting in a significant increase of the binaries size. +On the other hand, as Shiboken generates CPython code, the resulting binaries +are smaller. Creating bindings ================= @@ -41,13 +44,12 @@ and the C++ library that is being wrapped. What do I have to do to create my bindings? ------------------------------------------- -.. todo: put link to typesystem documentation +Most of the work is already done by the API Extractor. +The developer creates a `typesystem`_ file with any customization wanted in +the generated code, like removing classes or changing method signatures. +The generator will output the *.h* and *.cpp* files with the CPython code that +will wrap the target library for python. -Most of the work is already done by the API Extractor. The developer creates -a `typesystem <http://www.pyside.org/docs/apiextractor/typesystem.html>`_ file -with any customization wanted in the generated code, like removing classes or -changing method signatures. The generator will output the .h and .cpp files -with the CPython code that will wrap the target library for python. Is there any recommended build system? -------------------------------------- @@ -63,5 +65,8 @@ What is 'inject code'? ---------------------- That's how we call customized code that will be *injected* into the -generated at specific locations. They are specified inside the typesytem. +generated at specific locations. They are specified inside the typesystem. +.. _`Mailing list`: http://lists.qt-project.org/mailman/listinfo/pyside +.. _`GeneratorRunner`: http://www.pyside.org/home-binding/binding-generator +.. _`typesystem`: http://www.pyside.org/docs/apiextractor/typesystem.html diff --git a/sources/shiboken2/doc/images/bindinggen-development.png b/sources/shiboken2/doc/images/bindinggen-development.png Binary files differindex 2dd64ba1d..5931b126a 100644 --- a/sources/shiboken2/doc/images/bindinggen-development.png +++ b/sources/shiboken2/doc/images/bindinggen-development.png diff --git a/sources/shiboken2/doc/images/bindinggen-development.svg b/sources/shiboken2/doc/images/bindinggen-development.svg index 3b6b3a26e..591e1f2d1 100644 --- a/sources/shiboken2/doc/images/bindinggen-development.svg +++ b/sources/shiboken2/doc/images/bindinggen-development.svg @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> + <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" @@ -12,9 +13,9 @@ height="200" id="svg2" sodipodi:version="0.32" - inkscape:version="0.46" + inkscape:version="0.92.2 2405546, 2018-03-11" version="1.0" - sodipodi:docname="bindgen-development.svg" + sodipodi:docname="bindinggen-development.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" inkscape:export-filename="bindinggen-development.png" inkscape:export-xdpi="90" @@ -140,22 +141,24 @@ objecttolerance="10" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="1.0859375" - inkscape:cx="320" - inkscape:cy="136.17463" + inkscape:zoom="0.76787377" + inkscape:cx="286.61779" + inkscape:cy="101.18182" inkscape:document-units="px" - inkscape:current-layer="g5658" + inkscape:current-layer="g5440" showgrid="false" - inkscape:window-width="1156" - inkscape:window-height="883" - inkscape:window-x="1396" - inkscape:window-y="35" + inkscape:window-width="1116" + inkscape:window-height="1042" + inkscape:window-x="10" + inkscape:window-y="28" showguides="true" - inkscape:guide-bbox="true"> + inkscape:guide-bbox="true" + inkscape:window-maximized="0"> <sodipodi:guide orientation="1,0" position="-557.55608,678.10875" - id="guide7299" /> + id="guide7299" + inkscape:locked="false" /> </sodipodi:namedview> <metadata id="metadata7"> @@ -176,7 +179,7 @@ <flowRoot xml:space="preserve" id="flowRoot3229" - style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + style="font-style:normal;font-weight:normal;line-height:0.01%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" transform="translate(4.1137413,-2.3429609)"><flowRegion id="flowRegion3231"><rect id="rect3233" @@ -184,166 +187,269 @@ height="40.5849" x="388.45547" y="279.5423" /></flowRegion><flowPara - id="flowPara3235" /></flowRoot> <g + id="flowPara3235" + style="font-size:40px;line-height:1.25">Â </flowPara></flowRoot> <g id="g5658" transform="translate(6.5767925,7.0112479)"> <g - id="g5634"> + transform="matrix(0,-1,1,0,697.50638,3244.256)" + id="g5624" + style=""> + <g + id="g5626" + transform="matrix(0,-1,1,0,-294.81158,2953.0504)" + style=""> + <path + sodipodi:nodetypes="cc" + inkscape:connector-type="polyline" + id="path5628" + d="m 1586.5317,1348.2858 0.091,41.5266" + style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:none" + inkscape:connector-curvature="0" /> + <path + style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:none" + d="m 1586.7489,1389.4756 7.9979,-9.1068" + id="path5630" + inkscape:connector-type="polyline" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <path + style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:none" + d="m 1586.6031,1389.5063 -7.9979,-9.1069" + id="path5632" + inkscape:connector-type="polyline" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + </g> + </g> + <g + transform="matrix(0,-1,1,0,908.50929,3242.9612)" + id="g5648" + style=""> + <g + id="g5650" + transform="matrix(0,-1,1,0,-294.81158,2953.0504)" + style=""> + <path + sodipodi:nodetypes="cc" + inkscape:connector-type="polyline" + id="path5652" + d="m 1586.5317,1348.2858 0.091,41.5266" + style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:none" + inkscape:connector-curvature="0" /> + <path + style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:none" + d="m 1586.7489,1389.4756 7.9979,-9.1068" + id="path5654" + inkscape:connector-type="polyline" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <path + style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:none" + d="m 1586.6031,1389.5063 -7.9979,-9.1069" + id="path5656" + inkscape:connector-type="polyline" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + </g> + </g> + <g + id="g5634" + style=""> <g id="g6271" - transform="translate(1086.3689,746.93837)"> + transform="translate(1086.3689,746.93837)" + style=""> <g transform="matrix(0,-1,1,0,-294.81158,2953.0504)" - id="g6252"> + id="g6252" + style=""> <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" - d="M 1586.5317,1300.2858 L 1586.6222,1389.8124" + style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:none" + d="m 1586.5317,1300.2858 0.091,89.5266" id="path11089" inkscape:connector-type="polyline" - sodipodi:nodetypes="cc" /> + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> <path sodipodi:nodetypes="cc" inkscape:connector-type="polyline" id="path2758" - d="M 1586.7489,1389.4756 L 1594.7468,1380.3688" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" /> + d="m 1586.7489,1389.4756 7.9979,-9.1068" + style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:none" + inkscape:connector-curvature="0" /> <path sodipodi:nodetypes="cc" inkscape:connector-type="polyline" id="path2760" - d="M 1586.6031,1389.5063 L 1578.6052,1380.3994" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" /> + d="m 1586.6031,1389.5063 -7.9979,-9.1069" + style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:none" + inkscape:connector-curvature="0" /> </g> </g> </g> <g - transform="translate(134.35978,44.472131)" - id="g2777"> - <rect - style="fill:#addc52;fill-opacity:1;stroke:#6ca400;stroke-width:0.82399696;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect5172" - width="185.49777" - height="75.08918" - x="2047.775" - y="2029.4594" - ry="3.0323718" - rx="2.6724329" /> - <text - xml:space="preserve" - style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#035800;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="2140.5562" - y="2062.9375" - id="text5174"><tspan - sodipodi:role="line" - x="2140.5562" - y="2062.9375" - style="font-size:22px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#050800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold" - id="tspan5176">Qt bindings</tspan><tspan - id="tspan6109" - sodipodi:role="line" - x="2140.5562" - y="2084.457" - style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#050800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">(generated code)</tspan></text> - </g> - <g - transform="translate(141.86951,-31.391207)" - id="g3216"> - <rect - style="fill:#bff3bc;fill-opacity:1;stroke:#0af400;stroke-width:0.64492828;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect3625" - width="185.67708" - height="75.268074" - x="1829.1727" - y="2105.2332" - ry="2.3353095" - rx="2.1257713" /> - <text - xml:space="preserve" - style="font-size:38.71272278px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#035800;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="1921.9705" - y="2136.9409" - id="text3627" - transform="scale(1.0000266,0.9999734)"><tspan - id="tspan3697" - sodipodi:role="line" - x="1921.9705" - y="2136.9409" - style="font-size:21.29199791px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#035800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold">generator</tspan><tspan - sodipodi:role="line" - x="1921.9705" - y="2163.5559" - style="font-size:21.29199791px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#035800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold" - id="tspan2464">front-end</tspan></text> - </g> - <g - id="g5641"> + id="g5641" + style=""> <g id="g5465" - transform="translate(874.42628,746.93837)"> + transform="translate(874.42628,746.93837)" + style=""> <g transform="matrix(0,-1,1,0,-294.81158,2953.0504)" - id="g5467"> + id="g5467" + style=""> <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" - d="M 1586.5317,1300.2858 L 1586.6222,1389.8124" + style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:none" + d="m 1586.5317,1300.2858 0.091,89.5266" id="path5469" inkscape:connector-type="polyline" - sodipodi:nodetypes="cc" /> + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> <path sodipodi:nodetypes="cc" inkscape:connector-type="polyline" id="path5471" - d="M 1586.7489,1389.4756 L 1594.7468,1380.3688" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" /> + d="m 1586.7489,1389.4756 7.9979,-9.1068" + style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:none" + inkscape:connector-curvature="0" /> <path sodipodi:nodetypes="cc" inkscape:connector-type="polyline" id="path5473" - d="M 1586.6031,1389.5063 L 1578.6052,1380.3994" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" /> + d="m 1586.6031,1389.5063 -7.9979,-9.1069" + style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:none" + inkscape:connector-curvature="0" /> </g> </g> </g> <g transform="translate(-194.79968,-212.08495)" id="g5440"> - <rect - rx="1.2158648" - ry="2.9911308" - y="2285.8806" - x="1953.809" - height="75.360634" - width="185.76964" - id="rect3166" - style="fill:#dfe994;fill-opacity:1;stroke:#d5f400;stroke-width:0.55236381;stroke-opacity:1" /> + <path + style="fill:#41cd52;fill-opacity:1;stroke:none;stroke-width:2.18747473;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 2378.6251,2292.247 v 66.9548 h 171.1068 l 14.8788,-14.8788 v -66.9549 h -171.1068 z" + id="path3715-5-6-7-9-8-7" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;line-height:0%;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.29069424px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;" + x="2471.614" + y="2309.093" + id="text5174"><tspan + sodipodi:role="line" + x="2471.614" + y="2309.093" + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:24px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Semi-Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:1.29069424px;" + id="tspan953">Qt for Python</tspan><tspan + id="tspan6109" + sodipodi:role="line" + x="2471.614" + y="2339.093" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:1.29069424px;">(generated code)</tspan></text> + <path + style="fill:#6b7080;fill-opacity:1;stroke:none;stroke-width:2.18747473;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 2166.5963,2292.247 v 66.9548 h 171.1068 l 14.8788,-14.8788 v -66.9549 h -171.1068 z" + id="path3715-5-6-7-9-8-7-9-94" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;line-height:0%;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.50930572px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;" + x="2259.1294" + y="2311.0505" + id="text3627" + transform="scale(1.0000266,0.9999734)"><tspan + id="tspan3697" + sodipodi:role="line" + x="2259.1294" + y="2311.0505" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:1.50930572px;">generator</tspan><tspan + sodipodi:role="line" + x="2259.1294" + y="2341.0505" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:1.50930572px;" + id="tspan2464">front-end</tspan></text> + <path + style="fill:#6b7080;fill-opacity:1;stroke:none;stroke-width:2.18747473;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 1959.8625,2292.2469 v 66.9548 h 171.1068 l 14.8788,-14.8788 v -66.9549 h -171.1068 z" + id="path3715-5-6-7-9-8-7-9-1" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> <text id="text3168" - y="2328.8809" - x="2046.646" - style="font-size:27.94354057px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#4c5800;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + y="2326.4568" + x="2052.7678" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;line-height:0%;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.65129721px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;" xml:space="preserve"><tspan - style="font-size:19.56047821px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#4c5800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" - y="2328.8809" - x="2046.646" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:1.65129721px;" + y="2326.4568" + x="2052.7678" sodipodi:role="line" id="tspan5424">API Extractor</tspan></text> + <path + style="fill:#9d9faa;fill-opacity:1;stroke:none;stroke-width:2.18747473;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 2378.6251,2393.0867 v 66.9548 h 171.1068 l 14.8788,-14.8788 v -66.9549 h -171.1068 z" + id="path3715-5-6-7-9-8-7-9-9" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <text + id="text3487" + y="2410.3647" + x="2471.614" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;line-height:0%;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.44197154px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;" + xml:space="preserve"><tspan + id="tspan2509" + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:24px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Semi-Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:1.44197154px;" + y="2410.3647" + x="2471.614" + sodipodi:role="line">typesystem</tspan><tspan + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:1.44197154px;" + y="2440.3647" + x="2471.614" + sodipodi:role="line" + id="tspan5432">(handwritten)</tspan></text> + <path + style="fill:#9d9faa;fill-opacity:1;stroke:none;stroke-width:2.18747473;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 2166.5963,2394.0075 v 66.9548 h 171.1068 l 14.8788,-14.8788 v -66.9549 h -171.1068 z" + id="path3715-5-6-7-9-8-7-9" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;line-height:0%;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.58586931px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;" + x="2259.5852" + y="2412.0415" + id="text2735"><tspan + sodipodi:role="line" + x="2259.5852" + y="2412.0415" + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:24px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Semi-Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:1.58586931px;" + id="tspan2737">injected code</tspan><tspan + id="tspan2743" + sodipodi:role="line" + x="2259.5852" + y="2442.0415" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:1.58586931px;">(handwritten)</tspan></text> </g> <g transform="translate(-102.30216,-279.71223)" - id="g5541"> + id="g5541" + style="stroke:none"> <path sodipodi:type="arc" - style="fill:#f28888;fill-opacity:1;stroke:#d5f400;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1" + style="fill:#f28888;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1" id="path5535" sodipodi:cx="255.10791" sodipodi:cy="326.69064" sodipodi:rx="38.848923" sodipodi:ry="38.848923" - d="M 293.95683,326.69064 A 38.848923,38.848923 0 1 1 216.25899,326.69064 A 38.848923,38.848923 0 1 1 293.95683,326.69064 z" + d="m 293.95683,326.69064 a 38.848923,38.848923 0 0 1 -38.84892,38.84893 38.848923,38.848923 0 0 1 -38.84892,-38.84893 38.848923,38.848923 0 0 1 38.84892,-38.84892 38.848923,38.848923 0 0 1 38.84892,38.84892 z" transform="matrix(0.4405339,0,0,0.4405339,1842.2283,2282.9708)" /> <text xml:space="preserve" - style="font-size:27.62000275px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:Titillium;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;-inkscape-font-specification:'Titillium, Normal';font-stretch:normal;font-variant:normal;font-size:26.66666667px;text-anchor:start;text-align:start;writing-mode:lr;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal" x="1946.3259" y="2435.7" id="text5537"><tspan @@ -351,24 +457,25 @@ id="tspan5539" x="1946.3259" y="2435.7" - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono Bold">1</tspan></text> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666667px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';text-anchor:start;text-align:start;writing-mode:lr;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;stroke:none">1</tspan></text> </g> <g transform="translate(52.589867,-352.69787)" - id="g5546"> + id="g5546" + style="stroke:none"> <path sodipodi:type="arc" - style="fill:#f28888;fill-opacity:1;stroke:#d5f400;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1" + style="fill:#f28888;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1" id="path5548" sodipodi:cx="255.10791" sodipodi:cy="326.69064" sodipodi:rx="38.848923" sodipodi:ry="38.848923" - d="M 293.95683,326.69064 A 38.848923,38.848923 0 1 1 216.25899,326.69064 A 38.848923,38.848923 0 1 1 293.95683,326.69064 z" + d="m 293.95683,326.69064 a 38.848923,38.848923 0 0 1 -38.84892,38.84893 38.848923,38.848923 0 0 1 -38.84892,-38.84893 38.848923,38.848923 0 0 1 38.84892,-38.84892 38.848923,38.848923 0 0 1 38.84892,38.84892 z" transform="matrix(0.4405339,0,0,0.4405339,1842.2283,2282.9708)" /> <text xml:space="preserve" - style="font-size:27.62000275px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:Titillium;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;-inkscape-font-specification:'Titillium, Normal';font-stretch:normal;font-variant:normal;font-size:26.66666667px;text-anchor:start;text-align:start;writing-mode:lr;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal" x="1946.3259" y="2435.7" id="text5550"><tspan @@ -376,134 +483,25 @@ id="tspan5552" x="1946.3259" y="2435.7" - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono Bold">2</tspan></text> - </g> - <g - transform="matrix(0,-1,1,0,697.50638,3244.256)" - id="g5624"> - <g - id="g5626" - transform="matrix(0,-1,1,0,-294.81158,2953.0504)"> - <path - sodipodi:nodetypes="cc" - inkscape:connector-type="polyline" - id="path5628" - d="M 1586.5317,1348.2858 L 1586.6222,1389.8124" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" - d="M 1586.7489,1389.4756 L 1594.7468,1380.3688" - id="path5630" - inkscape:connector-type="polyline" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" - d="M 1586.6031,1389.5063 L 1578.6052,1380.3994" - id="path5632" - inkscape:connector-type="polyline" - sodipodi:nodetypes="cc" /> - </g> - </g> - <g - transform="translate(5.3442137,15.993306)" - id="g5459"> - <rect - rx="2.4652832" - ry="2.9818845" - y="2151.3206" - x="1965.7682" - height="75.127686" - width="185.53668" - id="rect3485" - style="fill:#b2e994;fill-opacity:1;stroke:#56f400;stroke-width:0.78531456;stroke-opacity:1" /> - <text - id="text3487" - y="2184.2461" - x="2059.1909" - style="font-size:27.94354057px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#1f5800;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - xml:space="preserve"><tspan - id="tspan2509" - style="font-size:19.56047821px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#1f5800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" - y="2184.2461" - x="2059.1909" - sodipodi:role="line">typesystem</tspan><tspan - style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#1f5800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" - y="2205.1477" - x="2059.1909" - sodipodi:role="line" - id="tspan5432">(handwritten)</tspan></text> - </g> - <g - transform="matrix(0,-1,1,0,908.50929,3242.9612)" - id="g5648"> - <g - id="g5650" - transform="matrix(0,-1,1,0,-294.81158,2953.0504)"> - <path - sodipodi:nodetypes="cc" - inkscape:connector-type="polyline" - id="path5652" - d="M 1586.5317,1348.2858 L 1586.6222,1389.8124" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" - d="M 1586.7489,1389.4756 L 1594.7468,1380.3688" - id="path5654" - inkscape:connector-type="polyline" - sodipodi:nodetypes="cc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" - d="M 1586.6031,1389.5063 L 1578.6052,1380.3994" - id="path5656" - inkscape:connector-type="polyline" - sodipodi:nodetypes="cc" /> - </g> - </g> - <g - transform="translate(299.78191,21.148391)" - id="g2771"> - <rect - style="fill:#cce994;fill-opacity:1;stroke:#a1f400;stroke-width:0.62429351;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect2733" - width="185.69771" - height="75.288704" - x="1882.2529" - y="2146.085" - ry="2.2607138" - rx="2.0576432" /> - <text - xml:space="preserve" - style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#3a5800;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="1975.134" - y="2180.2722" - id="text2735"><tspan - sodipodi:role="line" - x="1975.134" - y="2180.2722" - style="font-size:22px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#3a5800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold" - id="tspan2737">injected code</tspan><tspan - id="tspan2743" - sodipodi:role="line" - x="1975.134" - y="2201.7917" - style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#3a5800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">(handwritten)</tspan></text> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666667px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';text-anchor:start;text-align:start;writing-mode:lr;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;stroke:none">2</tspan></text> </g> <g transform="translate(200.4676,-222.96766)" - id="g5554"> + id="g5554" + style="stroke:none"> <path sodipodi:type="arc" - style="fill:#f28888;fill-opacity:1;stroke:#d5f400;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1" + style="fill:#f28888;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1" id="path5556" sodipodi:cx="255.10791" sodipodi:cy="326.69064" sodipodi:rx="38.848923" sodipodi:ry="38.848923" - d="M 293.95683,326.69064 A 38.848923,38.848923 0 1 1 216.25899,326.69064 A 38.848923,38.848923 0 1 1 293.95683,326.69064 z" + d="m 293.95683,326.69064 a 38.848923,38.848923 0 0 1 -38.84892,38.84893 38.848923,38.848923 0 0 1 -38.84892,-38.84893 38.848923,38.848923 0 0 1 38.84892,-38.84892 38.848923,38.848923 0 0 1 38.84892,38.84892 z" transform="matrix(0.4405339,0,0,0.4405339,1842.2283,2282.9708)" /> <text xml:space="preserve" - style="font-size:27.62000275px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:Titillium;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;-inkscape-font-specification:'Titillium, Normal';font-stretch:normal;font-variant:normal;font-size:26.66666667px;text-anchor:start;text-align:start;writing-mode:lr;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal" x="1946.3259" y="2435.7" id="text5558"><tspan @@ -511,24 +509,25 @@ id="tspan5560" x="1946.3259" y="2435.7" - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono Bold">3</tspan></text> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666667px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';text-anchor:start;text-align:start;writing-mode:lr;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;stroke:none">3</tspan></text> </g> <g transform="translate(413.633,-206.84535)" - id="g5562"> + id="g5562" + style="stroke:none"> <path sodipodi:type="arc" - style="fill:#f28888;fill-opacity:1;stroke:#d5f400;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1" + style="fill:#f28888;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1" id="path5564" sodipodi:cx="255.10791" sodipodi:cy="326.69064" sodipodi:rx="38.848923" sodipodi:ry="38.848923" - d="M 293.95683,326.69064 A 38.848923,38.848923 0 1 1 216.25899,326.69064 A 38.848923,38.848923 0 1 1 293.95683,326.69064 z" + d="m 293.95683,326.69064 a 38.848923,38.848923 0 0 1 -38.84892,38.84893 38.848923,38.848923 0 0 1 -38.84892,-38.84893 38.848923,38.848923 0 0 1 38.84892,-38.84892 38.848923,38.848923 0 0 1 38.84892,38.84892 z" transform="matrix(0.4405339,0,0,0.4405339,1842.2283,2282.9708)" /> <text xml:space="preserve" - style="font-size:27.62000275px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:Titillium;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;-inkscape-font-specification:'Titillium, Normal';font-stretch:normal;font-variant:normal;font-size:26.66666667px;text-anchor:start;text-align:start;writing-mode:lr;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal" x="1946.3259" y="2435.7" id="text5566"><tspan @@ -536,7 +535,7 @@ id="tspan5568" x="1946.3259" y="2435.7" - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono Bold">4</tspan></text> + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666667px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';text-anchor:start;text-align:start;writing-mode:lr;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;stroke:none">4</tspan></text> </g> </g> </g> diff --git a/sources/shiboken2/doc/images/boostqtarch.png b/sources/shiboken2/doc/images/boostqtarch.png Binary files differdeleted file mode 100644 index f1b145e9c..000000000 --- a/sources/shiboken2/doc/images/boostqtarch.png +++ /dev/null diff --git a/sources/shiboken2/doc/images/boostqtarch.svg b/sources/shiboken2/doc/images/boostqtarch.svg deleted file mode 100644 index 9fbb38271..000000000 --- a/sources/shiboken2/doc/images/boostqtarch.svg +++ /dev/null @@ -1,226 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="350" - height="220" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.46" - version="1.0" - sodipodi:docname="boostqtarch.svg" - inkscape:output_extension="org.inkscape.output.svg.inkscape" - inkscape:export-filename="boostqtarch.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90"> - <defs - id="defs4"> - <marker - inkscape:stockid="Arrow2Lend" - orient="auto" - refY="0" - refX="0" - id="Arrow2Lend" - style="overflow:visible"> - <path - id="path3636" - style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" - d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z" - transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> - </marker> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - id="perspective10" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - gridtolerance="10000" - guidetolerance="10" - objecttolerance="10" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="1.4812981" - inkscape:cx="145.70936" - inkscape:cy="94.089827" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - inkscape:window-width="1278" - inkscape:window-height="951" - inkscape:window-x="1592" - inkscape:window-y="29" - showguides="true" - inkscape:guide-bbox="true" /> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-61.076804,-301.50489)"> - <flowRoot - xml:space="preserve" - id="flowRoot3229" - style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - transform="translate(2.0918751e-6,-6.0000008)"><flowRegion - id="flowRegion3231"><rect - id="rect3233" - width="125.74072" - height="40.5849" - x="388.45547" - y="279.5423" /></flowRegion><flowPara - id="flowPara3235" /></flowRoot> <g - id="g3010" - transform="matrix(0.9508755,0,0,0.9508755,11.317746,20.273572)"> - <g - transform="translate(0,-9.7919846e-6)" - id="g2952"> - <rect - style="fill:#dfe994;fill-opacity:1;stroke:#d5f400;stroke-width:0.7162478;stroke-opacity:1" - id="rect3166" - width="349.23203" - height="67.403336" - x="61.417336" - y="377.74161" - ry="2.6752985" - rx="2.285728" /> - <text - xml:space="preserve" - style="font-size:29.38717079px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#4c5800;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="236.08904" - y="397.98755" - id="text3168"><tspan - sodipodi:role="line" - x="236.08904" - y="397.98755" - style="font-size:20.57102013px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#4c5800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" - id="tspan3176">Boost::Python</tspan><tspan - sodipodi:role="line" - x="236.08904" - y="418.35535" - style="font-size:15.20761585px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#4c5800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" - id="tspan2880">helper library to interface with CPython API</tspan><tspan - id="tspan2922" - sodipodi:role="line" - x="236.08904" - y="437.36487" - style="font-size:15.20761585px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#4c5800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">and expose C++ entities to Python</tspan></text> - </g> - <g - transform="translate(0,-9.7025776e-6)" - id="g2959"> - <rect - style="fill:#addc52;fill-opacity:1;stroke:#6ca400;stroke-width:0.71624762;stroke-opacity:1" - id="rect3542" - width="349.23203" - height="67.403351" - x="61.417336" - y="301.84543" - ry="2.675298" - rx="2.285728" /> - <text - xml:space="preserve" - style="font-size:29.38717079px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#050800;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - x="236.5123" - y="322.09137" - id="text3544"><tspan - id="tspan3596" - sodipodi:role="line" - x="236.5123" - y="322.09137" - style="font-size:20.57102013px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#050800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">Qt-Python Bindings</tspan><tspan - sodipodi:role="line" - x="236.5123" - y="342.45917" - style="font-size:15.20761585px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#050800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" - id="tspan12937">Qt classes and functions</tspan><tspan - sodipodi:role="line" - x="236.5123" - y="361.46869" - style="font-size:15.20761585px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#050800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" - id="tspan2411">exported to Python</tspan></text> - </g> - <g - id="g2998"> - <g - id="g2986"> - <rect - rx="2.285728" - ry="2.675298" - y="453.63776" - x="61.417336" - height="67.403336" - width="172.02341" - id="rect3485" - style="fill:#b2e994;fill-opacity:1;stroke:#56f400;stroke-width:0.71624762;stroke-opacity:1" /> - <text - id="text3487" - y="482.29712" - x="147.73038" - style="font-size:29.38717079px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#1f5800;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - xml:space="preserve"><tspan - style="font-size:20.57102013px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#1f5800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" - y="482.29712" - x="147.73038" - sodipodi:role="line" - id="tspan3499">CPython</tspan><tspan - id="tspan2509" - style="font-size:20.57102013px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#1f5800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" - y="508.01089" - x="147.73038" - sodipodi:role="line">API</tspan></text> - </g> - <g - id="g2992"> - <rect - rx="2.285728" - ry="2.675298" - y="453.63776" - x="239.30101" - height="67.403351" - width="172.02295" - id="rect2459" - style="fill:#cce994;fill-opacity:1;stroke:#a1f400;stroke-width:0.71624762;stroke-opacity:1" /> - <text - id="text2461" - y="481.97067" - x="324.86047" - style="font-size:29.38717079px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#3a5800;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" - xml:space="preserve"><tspan - style="font-size:20.57102013px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#3a5800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" - y="481.97067" - x="324.86047" - sodipodi:role="line" - id="tspan2467">Qt4</tspan><tspan - id="tspan2490" - style="font-size:20.57102013px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#3a5800;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" - y="507.68445" - x="324.86047" - sodipodi:role="line">Libraries</tspan></text> - </g> - </g> - </g> - </g> -</svg> diff --git a/sources/shiboken2/doc/images/converter.dot b/sources/shiboken2/doc/images/converter.dot deleted file mode 100644 index 412341df9..000000000 --- a/sources/shiboken2/doc/images/converter.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph Conversions { - rankdir=LR - CppType1 [ label="C++\nType" ] - Converter1 [ label="Converter\nPython -> C++", shape=hexagon ] - PythonType1 -> Converter1 - PythonType2 -> Converter1 - PythonType3 -> Converter1 - Converter1 -> CppType1 - - CppType2 [ label="C++\nType" ] - PythonType4 [ label="PythonType" ] - Converter2 [ label="Converter\nPython -> C++", shape=hexagon ] - CppType2 -> Converter2 -> PythonType4 -}
\ No newline at end of file diff --git a/sources/shiboken2/doc/images/converter.png b/sources/shiboken2/doc/images/converter.png Binary files differindex 51cd2af71..cd52e2769 100644 --- a/sources/shiboken2/doc/images/converter.png +++ b/sources/shiboken2/doc/images/converter.png diff --git a/sources/shiboken2/doc/images/converter.svg b/sources/shiboken2/doc/images/converter.svg new file mode 100644 index 000000000..4305eb720 --- /dev/null +++ b/sources/shiboken2/doc/images/converter.svg @@ -0,0 +1,349 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="206.375mm" + height="100.54167mm" + viewBox="0 0 206.375 100.54167" + version="1.1" + id="svg8" + inkscape:version="0.92.2 2405546, 2018-03-11" + sodipodi:docname="converter.svg"> + <defs + id="defs2"> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker1623" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1621" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker1569" + style="overflow:visible" + inkscape:isstock="true" + inkscape:collect="always"> + <path + id="path1567" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker1521" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1519" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="marker1479" + style="overflow:visible" + inkscape:isstock="true" + inkscape:collect="always"> + <path + id="path1477" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker1443" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1441" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible" + inkscape:isstock="true" + inkscape:collect="always"> + <path + id="path1154" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.35" + inkscape:cx="382.16184" + inkscape:cy="-28.417621" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="true" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:window-width="1002" + inkscape:window-height="1042" + inkscape:window-x="10" + inkscape:window-y="28" + inkscape:window-maximized="0"> + <inkscape:grid + type="xygrid" + id="grid971" + originx="-58.208333" + originy="-68.791657" /> + </sodipodi:namedview> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-58.208333,-127.66667)"> + <path + style="fill:#17a81a;fill-opacity:1;stroke:none;stroke-width:0.82824755;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 127,132.95834 0.0687,26.45833 h 63.43127 l 5.29167,-5.29167 v -26.45833 h -63.5 z" + id="path3715-5-6-7-9-8-7" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <path + style="fill:#3a4055;fill-opacity:1;stroke:none;stroke-width:0.67261654;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 68.791667,132.95834 v 26.45833 H 105.83333 L 111.125,154.125 V 127.66667 H 74.083333 Z" + id="path3715-5-6-7-9-8-7-6-3" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <path + style="fill:#848895;fill-opacity:1;stroke:none;stroke-width:0.52087492;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 58.208333,173.96875 V 185.875 h 48.947917 l 3.96875,-3.96875 V 170 H 62.177083 Z" + id="path3715-5-6-7-9-8-7-6-56" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <path + style="fill:#17a81a;fill-opacity:1;stroke:none;stroke-width:0.82824755;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 127.00003,175.29167 0.0687,26.45833 H 190.5 l 5.29167,-5.29167 V 170 h -63.5 z" + id="path3715-5-6-7-9-8-7-2" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <path + style="fill:#848895;fill-opacity:1;stroke:none;stroke-width:0.52087492;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 58.208333,195.13542 v 11.90625 h 48.947917 l 3.96875,-3.96875 V 191.16667 H 62.177083 Z" + id="path3715-5-6-7-9-8-7-6-56-7" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <path + style="fill:#848895;fill-opacity:1;stroke:none;stroke-width:0.52087492;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 58.208343,216.30209 v 11.90625 h 48.947907 l 3.96875,-3.96875 V 212.33334 H 62.177093 Z" + id="path3715-5-6-7-9-8-7-6-56-0" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05555534px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="65.68634" + y="179.68727" + id="text1032"><tspan + sodipodi:role="line" + id="tspan1030" + x="65.68634" + y="179.68727" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05555534px;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332">PythonType1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05555534px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="65.326508" + y="200.85394" + id="text1032-1"><tspan + sodipodi:role="line" + id="tspan1030-1" + x="65.326508" + y="200.85394" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05555534px;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332">PythonType2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05555534px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="65.319458" + y="222.02061" + id="text1032-4"><tspan + sodipodi:role="line" + id="tspan1030-6" + x="65.319458" + y="222.02061" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05555534px;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332">PythonType3</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:Titillium;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="90.120621" + y="139.29776" + id="text1062"><tspan + sodipodi:role="line" + id="tspan1060" + x="90.120621" + y="139.29776" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.87777805px;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332">C++</tspan><tspan + sodipodi:role="line" + x="90.120621" + y="152.52693" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.87777805px;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + id="tspan1064">Type</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:Titillium;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="135.41069" + y="138.95909" + id="text1068"><tspan + sodipodi:role="line" + id="tspan1066" + x="135.41069" + y="138.95909" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332">Converter</tspan><tspan + sodipodi:role="line" + x="135.41069" + y="152.18826" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + id="tspan1070">C++ -> Python</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:Titillium;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="135.41072" + y="181.29242" + id="text1068-9"><tspan + sodipodi:role="line" + id="tspan1066-7" + x="135.41072" + y="181.29242" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332">Converter</tspan><tspan + sodipodi:role="line" + x="135.41072" + y="194.52159" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + id="tspan1070-5">Python -> C++</tspan></text> + <path + style="fill:#3a4055;fill-opacity:1;stroke:none;stroke-width:0.67261654;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 211.66667,175.29167 V 201.75 h 37.04166 L 254,196.45833 V 170 h -37.04167 z" + id="path3715-5-6-7-9-8-7-6-3-9" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:Titillium;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="232.99562" + y="181.63109" + id="text1062-7"><tspan + sodipodi:role="line" + id="tspan1060-4" + x="232.99562" + y="181.63109" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.87777805px;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332">C++</tspan><tspan + sodipodi:role="line" + x="232.99562" + y="194.86026" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.87777805px;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332" + id="tspan1064-9">Type</tspan></text> + <path + style="fill:#848895;fill-opacity:1;stroke:none;stroke-width:0.52087492;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 211.66667,131.63542 v 11.90625 h 48.94791 l 3.96875,-3.96875 v -11.90625 h -48.94791 z" + id="path3715-5-6-7-9-8-7-6-56-0-1" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05555534px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="220.67876" + y="137.35394" + id="text1032-4-7"><tspan + sodipodi:role="line" + id="tspan1030-6-0" + x="220.67876" + y="137.35394" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05555534px;font-family:Titillium;-inkscape-font-specification:'Titillium, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332">PythonType</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend)" + d="M 111.125,143.54167 H 127" + id="path1149" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1443)" + d="M 111.125,175.29167 H 127" + id="path1433" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1479)" + d="M 111.125,196.45834 127,185.875" + id="path1469" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1521)" + d="M 111.125,217.625 127,201.75" + id="path1511" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1569)" + d="m 195.79166,185.875 h 15.875" + id="path1559" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1623)" + d="m 195.79166,138.25001 h 15.875" + id="path1613" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/sources/shiboken2/doc/images/shibokenqtarch.png b/sources/shiboken2/doc/images/shibokenqtarch.png Binary files differnew file mode 100644 index 000000000..359413373 --- /dev/null +++ b/sources/shiboken2/doc/images/shibokenqtarch.png diff --git a/sources/shiboken2/doc/images/shibokenqtarch.svg b/sources/shiboken2/doc/images/shibokenqtarch.svg new file mode 100644 index 000000000..d9212f18c --- /dev/null +++ b/sources/shiboken2/doc/images/shibokenqtarch.svg @@ -0,0 +1,188 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="275" + height="197.55103" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.92.2 2405546, 2018-03-11" + version="1.0" + sodipodi:docname="shibokenqtarch.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="shibokenqtarch.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend" + style="overflow:visible"> + <path + id="path3636" + style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective10" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.0474359" + inkscape:cx="110.19617" + inkscape:cy="69.09871" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:window-width="1002" + inkscape:window-height="1042" + inkscape:window-x="10" + inkscape:window-y="28" + showguides="true" + inkscape:guide-bbox="true" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:window-maximized="0"> + <inkscape:grid + type="xygrid" + id="grid44" + originx="-44.999996" + originy="-12.44898" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-106.0768,-311.50489)"> + <path + style="fill:#21be2b;fill-opacity:1;stroke:none;stroke-width:2.20567369;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 106.0768,322.72938 v 44.89796 h 262.2093 l 12.7907,-11.22449 V 311.50489 H 117.53514 Z" + id="path3715-5-6-7-9-8-7" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <path + style="fill:#17a81a;fill-opacity:1;stroke:none;stroke-width:1.57079244;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 251.99517,457.61034 v 51.44557 H 369.85231 L 381.0768,498.76679 V 447.32122 H 263.21966 Z" + id="path3715-5-6-7-9-6-7" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <path + style="fill:#53586b;fill-opacity:1;stroke:none;stroke-width:1.57079256;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 106.0768,457.61034 v 51.44557 h 117.85714 l 11.22449,-10.28912 V 447.32122 H 117.30129 Z" + id="path3715-5-6-7-9-6-7-5" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:16.68707466px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Semi-Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.12244904;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + x="120.87232" + y="334.88406" + id="text153"><tspan + sodipodi:role="line" + id="tspan151" + x="120.87232" + y="334.88406" + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:16.68707466px;font-family:Titillium;-inkscape-font-specification:'Titillium, Semi-Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.12244904;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Qt for Python</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.74510956px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:Titillium;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.31862774" + x="121.09701" + y="354.01886" + id="text157"><tspan + sodipodi:role="line" + x="121.09701" + y="354.01886" + id="tspan159" + style="fill:#ffffff;fill-opacity:1;stroke-width:0.31862774">Qt classes and functions exported to Python</tspan></text> + <path + style="fill:#53586b;fill-opacity:1;stroke:none;stroke-width:2.20567369;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 106.0768,391.19877 v 44.89796 h 262.2093 l 12.7907,-11.22449 V 379.97428 H 117.53514 Z" + id="path3715-5-6-7-9-8-7-6" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccc" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:16.68707466px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Semi-Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.41717955" + x="121.0225" + y="403.38095" + id="text153-2"><tspan + sodipodi:role="line" + id="tspan151-9" + x="121.0225" + y="403.38095" + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:16.68707466px;font-family:Titillium;-inkscape-font-specification:'Titillium, Semi-Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.41717955">Shiboken</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.74510956px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:Titillium;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.31862774" + x="121.09701" + y="421.95245" + id="text157-1"><tspan + sodipodi:role="line" + x="121.09701" + y="421.95245" + id="tspan159-2" + style="fill:#ffffff;fill-opacity:1;stroke-width:0.31862774">Generator that exposes C++ classes to Python</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:17.95918465px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Semi-Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.31862774" + x="123.35368" + y="482.61551" + id="text157-1-7"><tspan + sodipodi:role="line" + x="123.35368" + y="482.61551" + id="tspan159-2-0" + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:17.95918465px;font-family:Titillium;-inkscape-font-specification:'Titillium, Semi-Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.31862774">CPython API</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:17.95918465px;line-height:1.25;font-family:Titillium;-inkscape-font-specification:'Titillium, Semi-Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.4132798" + x="265.1445" + y="483.19019" + id="text157-1-9"><tspan + sodipodi:role="line" + x="265.1445" + y="483.19019" + id="tspan159-2-3" + style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:17.95918465px;font-family:Titillium;-inkscape-font-specification:'Titillium, Semi-Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke-width:0.4132798">Qt 5 Libraries</tspan></text> + </g> +</svg> diff --git a/sources/shiboken2/doc/overview.rst b/sources/shiboken2/doc/overview.rst index 5f50610ff..97ef2c13c 100644 --- a/sources/shiboken2/doc/overview.rst +++ b/sources/shiboken2/doc/overview.rst @@ -23,13 +23,13 @@ Each module of the generator system has an specific role. 3. Modify the API to expose the objects in a way that fits you target language best. 4. Insert customizations where handwritten code is needed. -.. figure:: images/boostqtarch.png +.. figure:: images/shibokenqtarch.png :scale: 80 :align: center Runtime architecture -The newly created binding will run on top of Boost.Python library which takes +The newly created binding will run on top of Shiboken which takes care of interfacing Python and the underlying C++ library. Handwritten inputs diff --git a/sources/shiboken2/doc/ownership.rst b/sources/shiboken2/doc/ownership.rst index 69791f855..f3744a537 100644 --- a/sources/shiboken2/doc/ownership.rst +++ b/sources/shiboken2/doc/ownership.rst @@ -35,7 +35,7 @@ Invalidating objects ==================== To prevent segfaults and double frees, the wrapper objects are invalidated. -An invalidated can't be passed as argument or have an attributte or method accessed. +An invalidated can't be passed as argument or have an attribute or method accessed. Trying to do this will raise RuntimeError. The following situations can invalidate an object: @@ -48,7 +48,7 @@ C++ taking ownership :ref:`virtual destructor <ownership-virt-method>` or the transfer is due to the special case of :ref:`parent ownership <ownership-parent>`. - Besides being passed as argument, the callee object can have its ownership changed, like + Besides being passed as argument, the called object can have its ownership changed, like the `setParent` method in Qt's `QObject`. Invalidate after use @@ -69,7 +69,7 @@ Objects with virtual methods any derived class in Python also override it. If the class has a virtual destructor (and C++ classes with virtual methods should have), this - C++ instance invalidates the wrapper only when the overriden destructor is called. + C++ instance invalidates the wrapper only when the overridden destructor is called. One exception to this rule is when the object is created in C++, like in a factory method. This way the wrapped object is a C++ instance of the native @@ -128,7 +128,7 @@ Not saving unowned objects references ------------------------------------- Sometimes when you pass an instance as argument to a method and the receiving - instance will need that object to live indifinitely, but will not take ownership + instance will need that object to live indefinitely, but will not take ownership of the argument instance. In this case, you should hold a reference to the argument instance. diff --git a/sources/shiboken2/doc/projectfile.rst b/sources/shiboken2/doc/projectfile.rst index 6c9808da4..aa703d941 100644 --- a/sources/shiboken2/doc/projectfile.rst +++ b/sources/shiboken2/doc/projectfile.rst @@ -4,9 +4,9 @@ Binding Project File ******************** -Instead of directing the Generator behaviour via command line, the binding developer -can write a text project file describing the same information, and avoid the hassle -of a long stream of command line arguments. +Instead of directing the Generator behavior via command line, the binding +developer can write a text project file describing the same information, and +avoid the hassle of a long stream of command line arguments. .. _project-file-structure: @@ -34,11 +34,13 @@ Project file tags The generator project file tags are in direct relation to the :ref:`command line arguments <command-line>`. All of the current command line -options provided by |project| were already seen on the :ref:`project-file-structure`, -for new command line options provided by additional generator modules (e.g.: qtdoc, -Shiboken) could also be used in the generator project file following simple conversion rules. +options provided by |project| were already seen on the +:ref:`project-file-structure`, for new command line options provided by +additional generator modules (e.g.: qtdoc, Shiboken) could also be used in the +generator project file following simple conversion rules. -For tags without options, just write as an empty tag without any attributes. Example: +For tags without options, just write as an empty tag without any attributes. +Example: .. code-block:: bash diff --git a/sources/shiboken2/doc/sequenceprotocol.rst b/sources/shiboken2/doc/sequenceprotocol.rst index 587c0f95b..26ae3b220 100644 --- a/sources/shiboken2/doc/sequenceprotocol.rst +++ b/sources/shiboken2/doc/sequenceprotocol.rst @@ -1,7 +1,8 @@ Sequence Protocol ----------------- -Support for the sequence protocol is achieved adding functions with special names, this is done using the add-function tag. +Support for the sequence protocol is achieved adding functions with special +names, this is done using the add-function tag. The special function names are: @@ -15,9 +16,14 @@ The special function names are: __concat__ PyObject* self, PyObject* _other PyObject* PySequence_Concat ============= =============================================== ==================== =================== -You just need to inform the function name to the add-function tag, without any parameter or return type information, when you do it, |project| will create a C function with parameters and return type definied by the table above. +You just need to inform the function name to the add-function tag, without any +parameter or return type information, when you do it, |project| will create a C +function with parameters and return type defined by the table above. -The function needs to follow the same semantics of the *CPython equivalent* function, the only way to do it is using the :doc:`inject-code <codeinjectionsemantics>` tag. - -A concrete exemple how to add sequence protocol support to a class can be found on shiboken tests, more precisely in the definition of the Str class in ``tests/samplebinding/typesystem_sample.xml``. +The function needs to follow the same semantics of the *CPython equivalent* +function, the only way to do it is using the +:doc:`inject-code <codeinjectionsemantics>` tag. +A concrete example how to add sequence protocol support to a class can be found +on shiboken tests, more precisely in the definition of the Str class in +``tests/samplebinding/typesystem_sample.xml``. diff --git a/sources/shiboken2/doc/typeconverters.rst b/sources/shiboken2/doc/typeconverters.rst index 3779b26d7..ea32c7f0c 100644 --- a/sources/shiboken2/doc/typeconverters.rst +++ b/sources/shiboken2/doc/typeconverters.rst @@ -2,7 +2,13 @@ User Defined Type Conversion **************************** -In the process of creating Python bindings of a C++ library, most of the C++ classes will have wrappers representing them in Python land. But there may be other classes that are very simple and/or have a Python type as a direct counter part. (Example: a "Complex" class, that represents complex numbers, has a Python equivalent in the "complex" type.) Such classes, instead of getting a Python wrapper, normally have conversions rules, from Python to C++ and vice-versa. +In the process of creating Python bindings of a C++ library, most of the C++ +classes will have wrappers representing them in Python land. +But there may be other classes that are very simple and/or have a Python type +as a direct counter part. (Example: a "Complex" class, that represents complex +numbers, has a Python equivalent in the "complex" type.) Such classes, instead +of getting a Python wrapper, normally have conversions rules, from Python to +C++ and vice-versa. .. code-block:: c++ @@ -22,7 +28,8 @@ In the process of creating Python bindings of a C++ library, most of the C++ cla Complex cpx(real, imag); -For the user defined conversion code to be inserted in the proper places, the "<conversion-rule>" tag must be used. +For the user defined conversion code to be inserted in the proper places, +the "<conversion-rule>" tag must be used. .. code-block:: xml @@ -51,25 +58,23 @@ For the user defined conversion code to be inserted in the proper places, the "< The details will be given later, but the gist of it are the tags -`<native-to-target> <http://www.pyside.org/docs/apiextractor/typesystem_conversionrule.html#native-to-target>`_, -which has only one conversion from C++ to Python, and -`<target-to-native> <http://www.pyside.org/docs/apiextractor/typesystem_conversionrule.html#target-to-native>`_, -that may define the conversion of multiple Python types to C++'s "Complex" type. +`<native-to-target>`_, which has only one conversion from C++ to Python, and +`<target-to-native>`_, that may define the conversion of multiple Python types +to C++'s "Complex" type. .. image:: images/converter.png :height: 240px :align: center -|project| expects the code for `<native-to-target> <http://www.pyside.org/docs/apiextractor/typesystem_conversionrule.html#native-to-target>`_, -to directly return the Python result of the conversion, and the added conversions inside the -`<target-to-native> <http://www.pyside.org/docs/apiextractor/typesystem_conversionrule.html#target-to-native>`_ -must attribute the Python to C++ conversion result to the :ref:`%out <out>` variable. +|project| expects the code for `<native-to-target>`_, to directly return the +Python result of the conversion, and the added conversions inside the +`<target-to-native>`_ must attribute the Python to C++ conversion result to +the :ref:`%out <out>` variable. - -Expanding on the last example, if the binding developer want a Python 2-tuple of numbers to be accepted -by wrapped C++ functions with "Complex" arguments, an -`<add-conversion> <http://www.pyside.org/docs/apiextractor/typesystem_conversionrule.html#add-conversion>`_ -tag and a custom check must be added. Here's how to do it: +Expanding on the last example, if the binding developer want a Python 2-tuple +of numbers to be accepted by wrapped C++ functions with "Complex" arguments, +an `<add-conversion>`_ tag and a custom check must be added. +Here's how to do it: .. code-block:: xml @@ -120,18 +125,18 @@ tag and a custom check must be added. Here's how to do it: </primitive-type> - .. _container_conversions: Container Conversions ===================== -Converters for -`<container-type> <http://www.pyside.org/docs/apiextractor/typesystem_specifying_types.html#container-type>`_ -are pretty much the same as for other type, except that they make use of the type system variables -:ref:`%INTYPE_# <intype_n>` and :ref:`%OUTTYPE_# <outtype_n>`. |project| combines the conversion code for -containers with the conversion defined (or automatically generated) for the containees. +Converters for `<container-type>`_ are pretty much the same as for other type, +except that they make use of the type system variables +:ref:`%INTYPE_# <intype_n>` and :ref:`%OUTTYPE_# <outtype_n>`. +|project| combines the conversion code for containers with the conversion +defined (or automatically generated) for the containers. +.. _`container-type`: http://www.pyside.org/docs/apiextractor/typesystem_specifying_types.html#container-type .. code-block:: xml @@ -279,10 +284,14 @@ And implemented in a separate C++ file, like this: } -In this case, the parts of the implementation that will be used in the new conversion-rule -are the ones in the two last method ``static inline PyObject* toPython(const Complex& cpx)`` -and ``static inline Complex toCpp(PyObject* pyobj)``. The ``isConvertible`` method is gone, -and the ``checkType`` is now an attribute of the -`<add-conversion> <http://www.pyside.org/docs/apiextractor/typesystem_conversionrule.html#add-conversion>`_ -tag. Refer back to the first example in this page and you will be able to correlate the above template -with the new scheme of conversion rule definition. +In this case, the parts of the implementation that will be used in the new +conversion-rule are the ones in the two last method +``static inline PyObject* toPython(const Complex& cpx)`` and +``static inline Complex toCpp(PyObject* pyobj)``. The ``isConvertible`` method +is gone, and the ``checkType`` is now an attribute of the `<add-conversion>`_ +tag. Refer back to the first example in this page and you will be able to +correlate the above template with the new scheme of conversion rule definition. + +.. _`<native-to-target>`: http://www.pyside.org/docs/apiextractor/typesystem_conversionrule.html#native-to-target +.. _`<target-to-native>`: http://www.pyside.org/docs/apiextractor/typesystem_conversionrule.html#target-to-native +.. _`<add-conversion>`: http://www.pyside.org/docs/apiextractor/typesystem_conversionrule.html#add-conversion diff --git a/sources/shiboken2/doc/typesystemvariables.rst b/sources/shiboken2/doc/typesystemvariables.rst index 205430550..9de2b02f5 100644 --- a/sources/shiboken2/doc/typesystemvariables.rst +++ b/sources/shiboken2/doc/typesystemvariables.rst @@ -59,9 +59,8 @@ Variables system), this value will be inserted in the argument list. If you want to remove the argument so completely that it doesn't appear in any form on the ``%ARGUMENT_NAMES`` replacement, don't forget to remove also its default value - with the `<remove-default-expression/> - <http://www.pyside.org/docs/apiextractor/typesystem_arguments.html#remove-default-expression>`_ - type system tag. + with the `<remove-default-expression/>`_ type system tag. + Take the following method and related type system description as an example: @@ -334,3 +333,5 @@ that expects a Python sequence instead. </inject-code> </modify-function> + +.. _`<remove-default-expression/>`: http://www.pyside.org/docs/apiextractor/typesystem_arguments.html#remove-default-expression diff --git a/sources/shiboken2/doc/wordsofadvice.rst b/sources/shiboken2/doc/wordsofadvice.rst index b66799338..9aebf1f03 100644 --- a/sources/shiboken2/doc/wordsofadvice.rst +++ b/sources/shiboken2/doc/wordsofadvice.rst @@ -75,7 +75,8 @@ C++ object. In summary: don't do it! Python old style classes and PySide =================================== -Because of some architectural decisions and deprecated Python types. Since PySide 1.1 old style classes are not supported with multiple inheritance. +Because of some architectural decisions and deprecated Python types. +Since PySide 1.1 old style classes are not supported with multiple inheritance. Below you can check the examples: @@ -92,7 +93,8 @@ Example with old style class: pass -this example will raise a 'TypeError' due to the limitation on PySide, to fix this you will need use the new style class: +this example will raise a 'TypeError' due to the limitation on PySide, to fix +this you will need use the new style class: .. code-block:: python @@ -106,4 +108,5 @@ this example will raise a 'TypeError' due to the limitation on PySide, to fix th pass -All classes used for multiple inheritance with other PySide types need to have 'object' as base class. +All classes used for multiple inheritance with other PySide types need to have +'object' as base class. diff --git a/sources/shiboken2/generator/main.cpp b/sources/shiboken2/generator/main.cpp index 774775fb0..b787d9f7e 100644 --- a/sources/shiboken2/generator/main.cpp +++ b/sources/shiboken2/generator/main.cpp @@ -146,13 +146,18 @@ static void printOptions(QTextStream& s, const OptionDescriptions& options) { s.setFieldAlignment(QTextStream::AlignLeft); for (const auto &od : options) { - s << ' '; if (!od.first.startsWith(QLatin1Char('-'))) s << "--"; - s.setFieldWidth(38); - s << od.first << od.second; - s.setFieldWidth(0); - s << endl; + s << od.first; + if (od.second.isEmpty()) { + s << ", "; + } else { + s << endl; + const auto lines = od.second.splitRef(QLatin1Char('\n')); + for (const auto &line : lines) + s << " " << line << endl; + s << endl; + } } } @@ -348,7 +353,8 @@ void printUsage() << qMakePair(QLatin1String("documentation-only"), QLatin1String("Do not generates any code, just the documentation")) << qMakePair(QLatin1String("drop-type-entries=\"<TypeEntry0>[;TypeEntry1;...]\""), - QLatin1String("Semicolon separated list of type system entries (classes, namespaces, global functions and enums) to be dropped from generation.")) + QLatin1String("Semicolon separated list of type system entries (classes, namespaces,\n" + "global functions and enums) to be dropped from generation.")) << qMakePair(QLatin1String("-F") + pathSyntax, QString()) << qMakePair(QLatin1String("framework-include-paths=") + pathSyntax, QLatin1String("Framework include paths used by the C++ parser")) @@ -367,7 +373,8 @@ void printUsage() << qMakePair(QLatin1String("output-directory=<path>"), QLatin1String("The directory where the generated files will be written")) << qMakePair(QLatin1String("project-file=<file>"), - QLatin1String("text file containing a description of the binding project. Replaces and overrides command line arguments")) + QLatin1String("text file containing a description of the binding project.\n" + "Replaces and overrides command line arguments")) << qMakePair(QLatin1String("silent"), QLatin1String("Avoid printing any message")) << qMakePair(QLatin1String("-T") + pathSyntax, QString()) @@ -381,7 +388,7 @@ void printUsage() for (const GeneratorPtr &generator : generators) { const OptionDescriptions options = generator->options(); if (!options.isEmpty()) { - s << endl << generator->name() << " options:\n"; + s << endl << generator->name() << " options:\n\n"; printOptions(s, generator->options()); } } diff --git a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp index 842c68b90..114ba401d 100644 --- a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp +++ b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp @@ -772,14 +772,25 @@ void QtXmlToSphinx::handleRowTag(QXmlStreamReader& reader) } } +enum ListType { BulletList, OrderedList, EnumeratedList }; + +static inline ListType webXmlListType(const QStringRef &t) +{ + if (t == QLatin1String("enum")) + return EnumeratedList; + if (t == QLatin1String("ordered")) + return OrderedList; + return BulletList; +} + void QtXmlToSphinx::handleListTag(QXmlStreamReader& reader) { // BUG We do not support a list inside a table cell - static QString listType; + static ListType listType = BulletList; QXmlStreamReader::TokenType token = reader.tokenType(); if (token == QXmlStreamReader::StartElement) { - listType = reader.attributes().value(QLatin1String("type")).toString(); - if (listType == QLatin1String("enum")) { + listType = webXmlListType(reader.attributes().value(QLatin1String("type"))); + if (listType == EnumeratedList) { m_currentTable << (TableRow() << "Constant" << "Description"); m_tableHasHeader = true; } @@ -787,19 +798,26 @@ void QtXmlToSphinx::handleListTag(QXmlStreamReader& reader) } else if (token == QXmlStreamReader::EndElement) { INDENT.indent++; if (!m_currentTable.isEmpty()) { - if (listType == QLatin1String("bullet")) { + switch (listType) { + case BulletList: + case OrderedList: { m_output << endl; + const char *separator = listType == BulletList ? "* " : "#. "; + const char *indent = listType == BulletList ? " " : " "; for (const TableCell &cell : m_currentTable.constFirst()) { const QVector<QStringRef> itemLines = cell.data.splitRef(QLatin1Char('\n')); - m_output << INDENT << "* " << itemLines.constFirst() << endl; + m_output << INDENT << separator << itemLines.constFirst() << endl; for (int i = 1, max = itemLines.count(); i < max; ++i) - m_output << INDENT << " " << itemLines[i] << endl; + m_output << INDENT << indent << itemLines[i] << endl; } m_output << endl; - } else if (listType == QLatin1String("enum")) { + } + break; + case EnumeratedList: m_currentTable.enableHeader(m_tableHasHeader); m_currentTable.normalize(); m_output << ensureEndl << m_currentTable; + break; } } m_currentTable.clear(); @@ -1289,6 +1307,12 @@ QString QtDocGenerator::fileNameSuffix() const return QLatin1String(".rst"); } +bool QtDocGenerator::shouldGenerate(const AbstractMetaClass *cls) const +{ + return Generator::shouldGenerate(cls) + && cls->typeEntry()->type() != TypeEntry::SmartPointerType; +} + QString QtDocGenerator::fileNameForContext(GeneratorContext &context) const { const AbstractMetaClass *metaClass = context.metaClass(); @@ -1996,11 +2020,12 @@ Generator::OptionDescriptions QtDocGenerator::options() const { return OptionDescriptions() << qMakePair(QLatin1String("doc-parser"), - QLatin1String("The documentation parser used to interpret the documentation input files (qdoc3|doxygen)")) + QLatin1String("The documentation parser used to interpret the documentation\n" + "input files (qdoc|doxygen)")) << qMakePair(QLatin1String("documentation-code-snippets-dir"), QLatin1String("Directory used to search code snippets used by the documentation")) << qMakePair(QLatin1String("documentation-data-dir"), - QLatin1String("Directory with XML files generated by documentation tool (qdoc3 or Doxygen)")) + QLatin1String("Directory with XML files generated by documentation tool")) << qMakePair(QLatin1String("documentation-extra-sections-dir"), QLatin1String("Directory used to search for extra documentation sections")) << qMakePair(QLatin1String("library-source-dir"), diff --git a/sources/shiboken2/generator/qtdoc/qtdocgenerator.h b/sources/shiboken2/generator/qtdoc/qtdocgenerator.h index 9f08a4e8d..c8318b862 100644 --- a/sources/shiboken2/generator/qtdoc/qtdocgenerator.h +++ b/sources/shiboken2/generator/qtdoc/qtdocgenerator.h @@ -224,6 +224,8 @@ public: return m_codeSnippetDirs; } + bool shouldGenerate(const AbstractMetaClass *) const override; + protected: QString fileNameSuffix() const override; QString fileNameForContext(GeneratorContext &context) const override; diff --git a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp index 18670eae6..8d4c146c1 100644 --- a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp +++ b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp @@ -4529,11 +4529,11 @@ void CppGenerator::writeEnumInitialization(QTextStream& s, const AbstractMetaEnu enumValueText += cppEnum->name() + QLatin1String("::"); enumValueText += enumValue->name(); } else { - enumValueText += QString::number(enumValue->value()); + enumValueText += enumValue->value().toString(); } - switch (enumTypeEntry->enumKind()) { - case EnumTypeEntry::AnonymousEnum: + switch (cppEnum->enumKind()) { + case AnonymousEnum: if (enclosingClass || hasUpperEnclosingClass) { s << INDENT << '{' << endl; { @@ -4557,7 +4557,7 @@ void CppGenerator::writeEnumInitialization(QTextStream& s, const AbstractMetaEnu } } break; - case EnumTypeEntry::CEnum: { + case CEnum: { s << INDENT << "if (!Shiboken::Enum::"; s << ((enclosingClass || hasUpperEnclosingClass) ? "createScopedEnumItem" : "createGlobalEnumItem"); s << '(' << enumVarTypeObj << ',' << endl; @@ -4567,7 +4567,7 @@ void CppGenerator::writeEnumInitialization(QTextStream& s, const AbstractMetaEnu s << INDENT << "return " << m_currentErrorCode << ';' << endl; } break; - case EnumTypeEntry::EnumClass: { + case EnumClass: { s << INDENT << "if (!Shiboken::Enum::createScopedEnumItem(" << enumVarTypeObj << ',' << endl; Indentation indent(INDENT); diff --git a/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp b/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp index d64719bb8..c3bb4cbc8 100644 --- a/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp +++ b/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp @@ -2240,7 +2240,13 @@ AbstractMetaClassList ShibokenGenerator::getBaseClasses(const AbstractMetaClass* { AbstractMetaClassList baseClasses; if (metaClass) { - const QStringList &baseClassNames = metaClass->baseClassNames(); + QStringList baseClassNames(metaClass->baseClassNames()); + const QString defaultSuperclass = metaClass->typeEntry()->defaultSuperclass(); + if (!defaultSuperclass.isEmpty()) { + int index = baseClassNames.indexOf(defaultSuperclass); + if (index >= 0) + baseClassNames.move(index, 0); + } for (const QString &parent : baseClassNames) { AbstractMetaClass *clazz = AbstractMetaClass::findClass(classes(), parent); if (clazz) @@ -2513,15 +2519,19 @@ Generator::OptionDescriptions ShibokenGenerator::options() const << qMakePair(QLatin1String(AVOID_PROTECTED_HACK), QLatin1String("Avoid the use of the '#define protected public' hack.")) << qMakePair(QLatin1String(DISABLE_VERBOSE_ERROR_MESSAGES), - QLatin1String("Disable verbose error messages. Turn the python code hard to debug but safe few kB on the generated bindings.")) + QLatin1String("Disable verbose error messages. Turn the python code hard to debug\n" + "but safe few kB on the generated bindings.")) << qMakePair(QLatin1String(PARENT_CTOR_HEURISTIC), QLatin1String("Enable heuristics to detect parent relationship on constructors.")) << qMakePair(QLatin1String(ENABLE_PYSIDE_EXTENSIONS), - QLatin1String("Enable PySide extensions, such as support for signal/slots, use this if you are creating a binding for a Qt-based library.")) + QLatin1String("Enable PySide extensions, such as support for signal/slots,\n" + "use this if you are creating a binding for a Qt-based library.")) << qMakePair(QLatin1String(RETURN_VALUE_HEURISTIC), - QLatin1String("Enable heuristics to detect parent relationship on return values (USE WITH CAUTION!)")) + QLatin1String("Enable heuristics to detect parent relationship on return values\n" + "(USE WITH CAUTION!)")) << qMakePair(QLatin1String(USE_ISNULL_AS_NB_NONZERO), - QLatin1String("If a class have an isNull()const method, it will be used to compute the value of boolean casts")); + QLatin1String("If a class have an isNull() const method, it will be used to compute\n" + "the value of boolean casts")); } static void getCode(QStringList& code, const CodeSnipList& codeSnips) diff --git a/sources/shiboken2/libshiboken/qapp_macro.cpp b/sources/shiboken2/libshiboken/qapp_macro.cpp index 9b940aaaa..e3f23de4f 100644 --- a/sources/shiboken2/libshiboken/qapp_macro.cpp +++ b/sources/shiboken2/libshiboken/qapp_macro.cpp @@ -105,7 +105,14 @@ reset_qApp_var() return 0; } - +/* + * Note: + * The PYSIDE-585 problem was that shutdown is called one more often + * than Q*Application is created. We could special-case that last + * shutdown or add a refcount, initially, but actually it was easier + * and more intuitive in that context to make the refcount of + * qApp_content equal to the refcount of Py_None. + */ PyObject * MakeSingletonQAppWrapper(PyTypeObject *type) { @@ -132,15 +139,16 @@ MakeSingletonQAppWrapper(PyTypeObject *type) // Debug mode showed that we need to do more than just remove the // reference. To keep everything in the right order, it is easiest // to do a full shutdown, using QtCore.__moduleShutdown(). + // restore the "None-state" PyObject *__moduleShutdown = PyDict_GetItemString(qApp_moduledicts[1], "__moduleShutdown"); - if (__moduleShutdown != NULL) { - Py_DECREF(PyObject_CallFunction(__moduleShutdown, (char *)"()")); - } - // restore the "None-state" + // PYSIDE-585: It was crucial to update the refcounts *before* + // calling the shutdown. Py_TYPE(qApp_content) = Py_NONE_TYPE; Py_REFCNT(qApp_var) = qApp_var_ref; - Py_REFCNT(qApp_content) = qApp_content_ref; + Py_REFCNT(qApp_content) = Py_REFCNT(Py_None); + if (__moduleShutdown != NULL) + Py_DECREF(PyObject_CallFunction(__moduleShutdown, (char *)"()")); } else (void)PyObject_INIT(qApp_content, type); @@ -160,7 +168,7 @@ setup_qApp_var(PyObject *module) return -1; // This is a borrowed reference qApp_moduledicts[0] = PyEval_GetBuiltins(); - Py_INCREF(qApp_content); + Py_INCREF(qApp_moduledicts[0]); init_done = 1; } @@ -170,7 +178,7 @@ setup_qApp_var(PyObject *module) if (module_index) { // This line gets a borrowed reference qApp_moduledicts[module_index] = PyModule_GetDict(module); - Py_INCREF(qApp_content); + Py_INCREF(qApp_moduledicts[module_index]); if (reset_qApp_var() < 0) return -1; } diff --git a/sources/shiboken2/libshiboken/sbkconverter.cpp b/sources/shiboken2/libshiboken/sbkconverter.cpp index 0e154da39..c81a1612b 100644 --- a/sources/shiboken2/libshiboken/sbkconverter.cpp +++ b/sources/shiboken2/libshiboken/sbkconverter.cpp @@ -523,7 +523,10 @@ PyTypeObject* getPythonTypeObject(const char* typeName) bool pythonTypeIsValueType(const SbkConverter *converter) { - assert(converter); + // Unlikely to happen but for multi-inheritance SbkObjs + // the converter is not defined, hence we need a default return. + if (!converter) + return false; return converter->pointerToPython && converter->copyToPython; } diff --git a/sources/shiboken2/tests/samplebinding/typesystem_sample.xml b/sources/shiboken2/tests/samplebinding/typesystem_sample.xml index 5a12eeccd..3cc80860d 100644 --- a/sources/shiboken2/tests/samplebinding/typesystem_sample.xml +++ b/sources/shiboken2/tests/samplebinding/typesystem_sample.xml @@ -798,7 +798,7 @@ <value-type name="Event"> <enum-type name="EventType"/> - <enum-type name="EventTypeClass" class="yes"/> + <enum-type name="EventTypeClass"/> </value-type> <value-type name="BlackBox"> |