aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken6/ApiExtractor/modifications.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sources/shiboken6/ApiExtractor/modifications.cpp')
-rw-r--r--sources/shiboken6/ApiExtractor/modifications.cpp640
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