diff options
Diffstat (limited to 'sources/shiboken6/ApiExtractor/modifications.cpp')
-rw-r--r-- | sources/shiboken6/ApiExtractor/modifications.cpp | 640 |
1 files changed, 169 insertions, 471 deletions
diff --git a/sources/shiboken6/ApiExtractor/modifications.cpp b/sources/shiboken6/ApiExtractor/modifications.cpp index 9e5071a33..d876e8035 100644 --- a/sources/shiboken6/ApiExtractor/modifications.cpp +++ b/sources/shiboken6/ApiExtractor/modifications.cpp @@ -1,167 +1,18 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt for Python. -** -** $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$ -** -****************************************************************************/ +// Copyright (C) 2020 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "modifications.h" -#include "modifications_p.h" -#include "typedatabase.h" -#include "typeparser.h" -#include "typesystem.h" +#include "codesnip.h" + +#include "qtcompat.h" #include <QtCore/QDebug> +#include <QtCore/QRegularExpression> #include <algorithm> #include <limits> -static inline QString callOperator() { return QStringLiteral("operator()"); } - -QString TemplateInstance::expandCode() const -{ - TemplateEntry *templateEntry = TypeDatabase::instance()->findTemplate(m_name); - if (!templateEntry) - qFatal("<insert-template> referring to non-existing template '%s'.", qPrintable(m_name)); - - QString code = templateEntry->code(); - for (auto it = replaceRules.cbegin(), end = replaceRules.cend(); it != end; ++it) - code.replace(it.key(), it.value()); - while (!code.isEmpty() && code.at(code.size() - 1).isSpace()) - code.chop(1); - QString result = QLatin1String("// TEMPLATE - ") + m_name + QLatin1String(" - START"); - if (!code.startsWith(QLatin1Char('\n'))) - result += QLatin1Char('\n'); - result += code; - result += QLatin1String("\n// TEMPLATE - ") + m_name + QLatin1String(" - END\n"); - return result; -} - -// ---------------------- CodeSnipFragment -QString CodeSnipFragment::code() const -{ - return m_instance ? m_instance->expandCode() : m_code; -} - -// ---------------------- CodeSnipAbstract -QString CodeSnipAbstract::code() const -{ - QString res; - for (const CodeSnipFragment &codeFrag : codeList) - res.append(codeFrag.code()); - - return res; -} - -void CodeSnipAbstract::addCode(const QString &code) -{ - codeList.append(CodeSnipFragment(fixSpaces(code))); -} - -static inline int firstNonBlank(QStringView s) -{ - const auto it = std::find_if(s.cbegin(), s.cend(), - [] (QChar c) { return !c.isSpace(); }); - return int(it - s.cbegin()); -} - -static inline bool isEmpty(QStringView s) -{ - return s.isEmpty() - || std::all_of(s.cbegin(), s.cend(), - [] (QChar c) { return c.isSpace(); }); -} - -QString CodeSnipAbstract::dedent(const QString &code) -{ - if (code.isEmpty()) - return code; - // Right trim if indent=0, or trim if single line - if (!code.at(0).isSpace() || !code.contains(QLatin1Char('\n'))) - return code.trimmed(); - const auto lines = QStringView{code}.split(QLatin1Char('\n')); - int spacesToRemove = std::numeric_limits<int>::max(); - for (const auto &line : lines) { - if (!isEmpty(line)) { - const int nonSpacePos = firstNonBlank(line); - if (nonSpacePos < spacesToRemove) - spacesToRemove = nonSpacePos; - if (spacesToRemove == 0) - return code; - } - } - QString result; - for (const auto &line : lines) { - if (!isEmpty(line) && spacesToRemove < line.size()) - result += line.mid(spacesToRemove).toString(); - result += QLatin1Char('\n'); - } - return result; -} - -QString CodeSnipAbstract::fixSpaces(QString code) -{ - code.remove(QLatin1Char('\r')); - // Check for XML <tag>\n<space>bla... - if (code.startsWith(QLatin1String("\n "))) - code.remove(0, 1); - while (!code.isEmpty() && code.back().isSpace()) - code.chop(1); - code = dedent(code); - if (!code.isEmpty() && !code.endsWith(QLatin1Char('\n'))) - code.append(QLatin1Char('\n')); - return code; -} - -// Prepend a line to the code, observing indentation -void CodeSnipAbstract::prependCode(QString *code, QString firstLine) -{ - while (!code->isEmpty() && code->front() == QLatin1Char('\n')) - code->remove(0, 1); - if (!code->isEmpty() && code->front().isSpace()) { - const int indent = firstNonBlank(*code); - firstLine.prepend(QString(indent, QLatin1Char(' '))); - } - if (!firstLine.endsWith(QLatin1Char('\n'))) - firstLine += QLatin1Char('\n'); - code->prepend(firstLine); -} - -QRegularExpression CodeSnipAbstract::placeHolderRegex(int index) -{ - return QRegularExpression(QLatin1Char('%') + QString::number(index) + QStringLiteral("\\b")); -} - -// ---------------------- Modification -QString Modification::accessModifierString() const -{ - if (isPrivate()) return QLatin1String("private"); - if (isProtected()) return QLatin1String("protected"); - if (isPublic()) return QLatin1String("public"); - if (isFriendly()) return QLatin1String("friendly"); - return QString(); -} +using namespace Qt::StringLiterals; // ---------------------- FieldModification @@ -173,6 +24,7 @@ public: bool m_readable = true; bool m_writable = true; bool m_removed = false; + bool m_opaqueContainer = false; TypeSystem::SnakeCase snakeCase = TypeSystem::SnakeCase::Unspecified; }; @@ -182,8 +34,8 @@ FieldModification::FieldModification() : d(new FieldModificationData) FieldModification::FieldModification(const FieldModification &) = default; FieldModification &FieldModification::operator=(const FieldModification &) = default; -FieldModification::FieldModification(FieldModification &&) = default; -FieldModification &FieldModification::operator=(FieldModification &&) = default; +FieldModification::FieldModification(FieldModification &&) noexcept = default; +FieldModification &FieldModification::operator=(FieldModification &&) noexcept = default; FieldModification::~FieldModification() = default; QString FieldModification::name() const @@ -246,192 +98,54 @@ void FieldModification::setRemoved(bool r) d->m_removed = r; } -TypeSystem::SnakeCase FieldModification::snakeCase() const +bool FieldModification::isOpaqueContainer() const { - return d->snakeCase; + return d->m_opaqueContainer; } -void FieldModification::setSnakeCase(TypeSystem::SnakeCase s) +void FieldModification::setOpaqueContainer(bool r) { - if (d->snakeCase != s) - d->snakeCase = s; + if (d->m_opaqueContainer != r) + d->m_opaqueContainer = r; } -// Helpers to split a parameter list of <add-function>, <declare-function> -// (@ denoting names), like -// "void foo(QList<X,Y> &@list@ = QList<X,Y>{1,2}, int @b@=5, ...)" -namespace AddedFunctionParser { - -bool Argument::equals(const Argument &rhs) const +TypeSystem::SnakeCase FieldModification::snakeCase() const { - return type == rhs.type && name == rhs.name && defaultValue == rhs.defaultValue; + return d->snakeCase; } -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug d, const Argument &a) +void FieldModification::setSnakeCase(TypeSystem::SnakeCase s) { - QDebugStateSaver saver(d); - d.noquote(); - d.nospace(); - d << "Argument(type=\"" << a.type << '"'; - if (!a.name.isEmpty()) - d << ", name=\"" << a.name << '"'; - if (!a.defaultValue.isEmpty()) - d << ", defaultValue=\"" << a.defaultValue << '"'; - d << ')'; - return d; + if (d->snakeCase != s) + d->snakeCase = s; } -#endif // QT_NO_DEBUG_STREAM -// Helper for finding the end of a function parameter, observing -// nested template parameters or lists. -static int parameterTokenEnd(int startPos, QStringView paramString) +// Remove the parameter names enclosed in '@' from an added function signature +// so that it matches the C++ type signature. +static QString removeParameterNames(QString signature) { - const int end = paramString.size(); - int nestingLevel = 0; - for (int p = startPos; p < end; ++p) { - switch (paramString.at(p).toLatin1()) { - case ',': - if (nestingLevel == 0) - return p; + while (true) { + const auto ampPos = signature.indexOf(u'@'); + if (ampPos == -1) break; - case '<': // templates - case '{': // initializer lists of default values - case '(': // initialization, function pointers - case '[': // array dimensions - ++nestingLevel; + const auto closingAmpPos = signature.indexOf(u'@', ampPos + 1); + if (closingAmpPos == -1) break; - case '>': - case '}': - case ')': - case ']': - --nestingLevel; - break; - } - } - return end; -} - -// Split a function parameter list into string tokens containing one -// parameters (including default value, etc). -static QList<QStringView> splitParameterTokens(QStringView paramString) -{ - QList<QStringView> result; - int startPos = 0; - for ( ; startPos < paramString.size(); ) { - int end = parameterTokenEnd(startPos, paramString); - result.append(paramString.mid(startPos, end - startPos).trimmed()); - startPos = end + 1; + signature.remove(ampPos, closingAmpPos - ampPos + 1); } - return result; + return signature; } -// Split a function parameter list -Arguments splitParameters(QStringView paramString, QString *errorMessage) +DocModification::DocModification(const QString &xpath, const QString &signature) : + m_xpath(xpath), m_signature(removeParameterNames(signature)) { - Arguments result; - const QList<QStringView> tokens = splitParameterTokens(paramString); - - for (const auto &t : tokens) { - Argument argument; - // Check defaultValue, "int @b@=5" - const int equalPos = t.lastIndexOf(QLatin1Char('=')); - if (equalPos != -1) { - const int defaultValuePos = equalPos + 1; - argument.defaultValue = - t.mid(defaultValuePos, t.size() - defaultValuePos).trimmed().toString(); - } - QString typeString = (equalPos != -1 ? t.left(equalPos) : t).trimmed().toString(); - // Check @name@ - const int atPos = typeString.indexOf(QLatin1Char('@')); - if (atPos != -1) { - const int namePos = atPos + 1; - const int nameEndPos = typeString.indexOf(QLatin1Char('@'), namePos); - if (nameEndPos == -1) { - if (errorMessage != nullptr) { - *errorMessage = QLatin1String("Mismatched @ in \"") - + paramString.toString() + QLatin1Char('"'); - } - return {}; - } - argument.name = typeString.mid(namePos, nameEndPos - namePos).trimmed(); - typeString.remove(atPos, nameEndPos - atPos + 1); - } - argument.type = typeString.trimmed(); - result.append(argument); - } - - return result; } -} // namespace AddedFunctionParser - -AddedFunction::AddedFunction(const QString &name, const QList<Argument> &arguments, - const TypeInfo &returnType) : - m_name(name), - m_arguments(arguments), - m_returnType(returnType) +DocModification::DocModification(TypeSystem::DocModificationMode mode, const QString &signature) : + m_signature(removeParameterNames(signature)), m_mode(mode) { } -AddedFunction::AddedFunctionPtr - AddedFunction::createAddedFunction(const QString &signatureIn, const QString &returnTypeIn, - QString *errorMessage) - -{ - errorMessage->clear(); - - QList<Argument> arguments; - const TypeInfo returnType = returnTypeIn.isEmpty() - ? TypeInfo::voidType() - : TypeParser::parse(returnTypeIn, errorMessage); - if (!errorMessage->isEmpty()) - return {}; - - QStringView signature = QStringView{signatureIn}.trimmed(); - - // Skip past "operator()(...)" - const int parenSearchStartPos = signature.startsWith(callOperator()) - ? callOperator().size() : 0; - const int openParenPos = signature.indexOf(QLatin1Char('('), parenSearchStartPos); - if (openParenPos < 0) { - return AddedFunctionPtr(new AddedFunction(signature.toString(), - arguments, returnType)); - } - - const QString name = signature.left(openParenPos).trimmed().toString(); - const int closingParenPos = signature.lastIndexOf(QLatin1Char(')')); - if (closingParenPos < 0) { - *errorMessage = QLatin1String("Missing closing parenthesis"); - return {}; - } - - // Check for "foo() const" - bool isConst = false; - const int signatureLength = signature.length(); - const int qualifierLength = signatureLength - closingParenPos - 1; - if (qualifierLength >= 5 - && signature.right(qualifierLength).contains(QLatin1String("const"))) { - isConst = true; - } - - const auto paramString = signature.mid(openParenPos + 1, closingParenPos - openParenPos - 1); - const auto params = AddedFunctionParser::splitParameters(paramString, errorMessage); - if (params.isEmpty() && !errorMessage->isEmpty()) - return {}; - for (const auto &p : params) { - TypeInfo type = p.type == QLatin1String("...") - ? TypeInfo::varArgsType() : TypeParser::parse(p.type, errorMessage); - if (!errorMessage->isEmpty()) - return {}; - arguments.append({type, p.name, p.defaultValue}); - } - - AddedFunctionPtr result(new AddedFunction(name, arguments, returnType)); - result->setConstant(isConst); - return result; -} - void DocModification::setCode(const QString &code) { m_code = CodeSnipAbstract::fixSpaces(code); @@ -452,17 +166,29 @@ QDebug operator<<(QDebug d, const CodeSnip &s) QDebugStateSaver saver(d); d.noquote(); d.nospace(); - d << "CodeSnip(language=" << s.language << ", position=" << s.position << ", \""; - for (const auto &f : s.codeList) { - const QString &code = f.code(); - const auto lines = QStringView{code}.split(QLatin1Char('\n')); - for (int i = 0, size = lines.size(); i < size; ++i) { - if (i) - d << "\\n"; - d << lines.at(i).trimmed(); + const auto size = s.codeList.size(); + d << "CodeSnip(language=" << s.language << ", position=" << s.position + << ", fragments[" << size << "]="; + for (qsizetype i = 0; i < size; ++i) { + const auto &f = s.codeList.at(i); + if (i) + d << ", "; + d << '#' << i << ' '; + if (!f.instance()) { + d << '"'; + const QString &code = f.code(); + const auto lines = QStringView{code}.split(u'\n'); + for (qsizetype i = 0, size = lines.size(); i < size; ++i) { + if (i) + d << "\\n"; + d << lines.at(i).trimmed(); + } + d << '"'; + } else { + d << "template=\"" << f.instance()->name() << '"'; } } - d << "\")"; + d << ')'; return d; } @@ -476,8 +202,10 @@ public: QList<ReferenceCount> referenceCounts; QString modified_type; + QString pyiType; QString replacedDefaultExpression; - QHash<TypeSystem::Language, TypeSystem::Ownership> ownerships; + TypeSystem::Ownership m_targetOwnerShip = TypeSystem::UnspecifiedOwnership; + TypeSystem::Ownership m_nativeOwnerShip = TypeSystem::UnspecifiedOwnership; CodeSnipList conversion_rules; ArgumentOwner owner; QString renamed_to; @@ -499,11 +227,11 @@ ArgumentModification::ArgumentModification(int idx) : d(new ArgumentModification ArgumentModification::ArgumentModification(const ArgumentModification &) = default; ArgumentModification &ArgumentModification::operator=(const ArgumentModification &) = default; -ArgumentModification::ArgumentModification(ArgumentModification &&) = default; -ArgumentModification &ArgumentModification::operator=(ArgumentModification &&) = default; +ArgumentModification::ArgumentModification(ArgumentModification &&) noexcept = default; +ArgumentModification &ArgumentModification::operator=(ArgumentModification &&) noexcept = default; ArgumentModification::~ArgumentModification() = default; -QString ArgumentModification::modifiedType() const +const QString &ArgumentModification::modifiedType() const { return d->modified_type; } @@ -514,6 +242,22 @@ void ArgumentModification::setModifiedType(const QString &value) d->modified_type = value; } +bool ArgumentModification::isTypeModified() const +{ + return !d->modified_type.isEmpty(); +} + +QString ArgumentModification::pyiType() const +{ + return d->pyiType; +} + +void ArgumentModification::setPyiType(const QString &value) +{ + if (d->pyiType != value) + d->pyiType = value; +} + QString ArgumentModification::replacedDefaultExpression() const { return d->replacedDefaultExpression; @@ -525,14 +269,26 @@ void ArgumentModification::setReplacedDefaultExpression(const QString &value) d->replacedDefaultExpression = value; } -const QHash<TypeSystem::Language, TypeSystem::Ownership> &ArgumentModification::ownerships() const +TypeSystem::Ownership ArgumentModification::targetOwnerShip() const +{ + return d->m_targetOwnerShip; +} + +void ArgumentModification::setTargetOwnerShip(TypeSystem::Ownership o) +{ + if (o != d->m_targetOwnerShip) + d->m_targetOwnerShip = o; +} + +TypeSystem::Ownership ArgumentModification::nativeOwnership() const { - return d->ownerships; + return d->m_nativeOwnerShip; } -void ArgumentModification::insertOwnership(TypeSystem::Language l, TypeSystem::Ownership o) +void ArgumentModification::setNativeOwnership(TypeSystem::Ownership o) { - d->ownerships.insert(l, o); + if (o != d->m_nativeOwnerShip) + d->m_nativeOwnerShip = o; } const CodeSnipList &ArgumentModification::conversionRules() const @@ -642,90 +398,18 @@ void ArgumentModification::addReferenceCount(const ReferenceCount &value) d->referenceCounts.append(value); } -class ModificationData : public QSharedData -{ -public: - QString renamedToName; - Modification::Modifiers modifiers; - bool removed = false; -}; - -Modification::Modification() : md(new ModificationData) -{ -} - -Modification::Modification(const Modification &) = default; -Modification &Modification::operator=(const Modification &) = default; -Modification::Modification(Modification &&) = default; -Modification &Modification::operator=(Modification &&) = default; -Modification::~Modification() = default; - -void Modification::formatDebug(QDebug &debug) const -{ - debug << "modifiers=" << md->modifiers; - if (md->removed) - debug << ", removed"; - if (!md->renamedToName.isEmpty()) - debug << ", renamedToName=\"" << md->renamedToName << '"'; -} - -QString Modification::renamedToName() const -{ - return md->renamedToName; -} - -void Modification::setRenamedToName(const QString &value) -{ - if (md->renamedToName != value) - md->renamedToName = value; -} - -Modification::Modifiers Modification::modifiers() const -{ - return md->modifiers; -} - -void Modification::setModifiers(Modifiers m) -{ - if (md->modifiers != m) - md->modifiers = m; -} - -void Modification::setModifierFlag(Modification::ModifierFlag f) -{ - auto newMods = md->modifiers | f; - if (md->modifiers != newMods) - md->modifiers = newMods; -} - -void Modification::clearModifierFlag(ModifierFlag f) -{ - auto newMods = md->modifiers & ~f; - if (md->modifiers != newMods) - md->modifiers = newMods; -} - -bool Modification::isRemoved() const -{ - return md->removed; -} - -void Modification::setRemoved(bool r) -{ - if (md->removed != r) - md->removed = r; -} - class FunctionModificationData : public QSharedData { public: + QString renamedToName; + FunctionModification::Modifiers modifiers; CodeSnipList m_snips; QList<ArgumentModification> m_argument_mods; QString m_signature; QString m_originalSignature; QRegularExpression m_signaturePattern; int m_overloadNumber = TypeSystem::OverloadNumberUnset; - bool m_thread = false; + bool removed = false; TypeSystem::AllowThread m_allowThread = TypeSystem::AllowThread::Unspecified; TypeSystem::ExceptionHandling m_exceptionHandling = TypeSystem::ExceptionHandling::Unspecified; TypeSystem::SnakeCase snakeCase = TypeSystem::SnakeCase::Unspecified; @@ -737,8 +421,8 @@ FunctionModification::FunctionModification() : d(new FunctionModificationData) FunctionModification::FunctionModification(const FunctionModification &) = default; FunctionModification &FunctionModification::operator=(const FunctionModification &) = default; -FunctionModification::FunctionModification(FunctionModification &&) = default; -FunctionModification &FunctionModification::operator=(FunctionModification &&) = default; +FunctionModification::FunctionModification(FunctionModification &&) noexcept = default; +FunctionModification &FunctionModification::operator=(FunctionModification &&) noexcept = default; FunctionModification::~FunctionModification() = default; void FunctionModification::formatDebug(QDebug &debug) const @@ -747,12 +431,13 @@ void FunctionModification::formatDebug(QDebug &debug) const debug << "pattern=\"" << d->m_signaturePattern.pattern(); else debug << "signature=\"" << d->m_signature; - debug << "\", "; - Modification::formatDebug(debug); + debug << "\", modifiers=" << d->modifiers; + if (d->removed) + debug << ", removed"; + if (!d->renamedToName.isEmpty()) + debug << ", renamedToName=\"" << d->renamedToName << '"'; if (d->m_allowThread != TypeSystem::AllowThread::Unspecified) debug << ", allowThread=" << int(d->m_allowThread); - if (d->m_thread) - debug << ", thread"; if (d->m_exceptionHandling != TypeSystem::ExceptionHandling::Unspecified) debug << ", exceptionHandling=" << int(d->m_exceptionHandling); if (!d->m_snips.isEmpty()) @@ -761,6 +446,53 @@ void FunctionModification::formatDebug(QDebug &debug) const debug << ", argument_mods=(" << d->m_argument_mods << ')'; } +QString FunctionModification::renamedToName() const +{ + return d->renamedToName; +} + +void FunctionModification::setRenamedToName(const QString &value) +{ + if (d->renamedToName != value) + d->renamedToName = value; +} + +FunctionModification::Modifiers FunctionModification::modifiers() const +{ + return d->modifiers; +} + +void FunctionModification::setModifiers(Modifiers m) +{ + if (d->modifiers != m) + d->modifiers = m; +} + +void FunctionModification::setModifierFlag(FunctionModification::ModifierFlag f) +{ + auto newMods = d->modifiers | f; + if (d->modifiers != newMods) + d->modifiers = newMods; +} + +void FunctionModification::clearModifierFlag(ModifierFlag f) +{ + auto newMods = d->modifiers & ~f; + if (d->modifiers != newMods) + d->modifiers = newMods; +} + +bool FunctionModification::isRemoved() const +{ + return d->removed; +} + +void FunctionModification::setRemoved(bool r) +{ + if (d->removed != r) + d->removed = r; +} + const QList<ArgumentModification> &FunctionModification::argument_mods() const { return d->m_argument_mods; @@ -808,17 +540,6 @@ void FunctionModification::setSnips(const CodeSnipList &snips) } // ---------------------- FunctionModification -void FunctionModification::setIsThread(bool flag) -{ - if (d->m_thread != flag) - d->m_thread = flag; -} - -bool FunctionModification::isThread() const -{ - return d->m_thread; -} - FunctionModification::AllowThread FunctionModification::allowThread() const { return d->m_allowThread; @@ -830,21 +551,26 @@ void FunctionModification::setAllowThread(FunctionModification::AllowThread allo d->m_allowThread = allow; } -bool FunctionModification::matches(const QString &functionSignature) const +bool FunctionModification::matches(const QStringList &functionSignatures) const { - return d->m_signature.isEmpty() - ? d->m_signaturePattern.match(functionSignature).hasMatch() - : d->m_signature == functionSignature; + if (!d->m_signature.isEmpty()) + return functionSignatures.contains(d->m_signature); + + for (const auto &s : functionSignatures) { + if (d->m_signaturePattern.match(s).hasMatch()) + return true; + } + return false; } bool FunctionModification::setSignature(const QString &s, QString *errorMessage) { - if (s.startsWith(QLatin1Char('^'))) { + if (s.startsWith(u'^')) { d->m_signaturePattern.setPattern(s); if (!d->m_signaturePattern.isValid()) { if (errorMessage) { - *errorMessage = QLatin1String("Invalid signature pattern: \"") - + s + QLatin1String("\": ") + d->m_signaturePattern.errorString(); + *errorMessage = u"Invalid signature pattern: \""_s + + s + u"\": "_s + d->m_signaturePattern.errorString(); } return false; } @@ -920,10 +646,15 @@ QDebug operator<<(QDebug d, const ArgumentModification &a) d << ", modified_type=\"" << a.modifiedType() << '"'; if (!a.replacedDefaultExpression().isEmpty()) d << ", replacedDefaultExpression=\"" << a.replacedDefaultExpression() << '"'; - if (!a.ownerships().isEmpty()) - d << ", ownerships=" << a.ownerships(); + if (a.targetOwnerShip() != TypeSystem::UnspecifiedOwnership) + d << ", target ownership=" << a.targetOwnerShip(); + if (a.nativeOwnership() != TypeSystem::UnspecifiedOwnership) + d << ", native ownership=" << a.nativeOwnership(); if (!a.renamedToName().isEmpty()) d << ", renamed_to=\"" << a.renamedToName() << '"'; + const auto &rules = a.conversionRules(); + if (!rules.isEmpty()) + d << ", conversionRules[" << rules.size() << "]=" << rules; d << ", owner=" << a.owner() << ')'; return d; } @@ -938,37 +669,4 @@ QDebug operator<<(QDebug d, const FunctionModification &fm) d << ')'; return d; } - -QDebug operator<<(QDebug d, const AddedFunction::Argument &a) -{ - QDebugStateSaver saver(d); - d.noquote(); - d.nospace(); - d << "Argument("; - d << a.typeInfo; - if (!a.name.isEmpty()) - d << ' ' << a.name; - if (!a.defaultValue.isEmpty()) - d << " = " << a.defaultValue; - d << ')'; - return d; -} - -QDebug operator<<(QDebug d, const AddedFunction &af) -{ - QDebugStateSaver saver(d); - d.noquote(); - d.nospace(); - d << "AddedFunction("; - if (af.access() == AddedFunction::Protected) - d << "protected"; - if (af.isStatic()) - d << " static"; - d << af.returnType() << ' ' << af.name() << '(' << af.arguments() << ')'; - if (af.isConstant()) - d << " const"; - if (af.isDeclaration()) - d << " [declaration]"; - return d; -} #endif // !QT_NO_DEBUG_STREAM |