diff options
Diffstat (limited to 'sources/shiboken6/generator/shiboken/overloaddata.h')
-rw-r--r-- | sources/shiboken6/generator/shiboken/overloaddata.h | 208 |
1 files changed, 112 insertions, 96 deletions
diff --git a/sources/shiboken6/generator/shiboken/overloaddata.h b/sources/shiboken6/generator/shiboken/overloaddata.h index 89e56caa4..875a5a8b5 100644 --- a/sources/shiboken6/generator/shiboken/overloaddata.h +++ b/sources/shiboken6/generator/shiboken/overloaddata.h @@ -1,59 +1,123 @@ -/**************************************************************************** -** -** Copyright (C) 2016 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) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #ifndef OVERLOADDATA_H #define OVERLOADDATA_H #include <apiextractorresult.h> +#include <abstractmetaargument.h> #include <QtCore/QBitArray> #include <QtCore/QList> +#include <memory> + QT_FORWARD_DECLARE_CLASS(QDebug) +QT_FORWARD_DECLARE_CLASS(QTextStream) + +class OverloadDataNode; +using OverloadDataNodePtr = std::shared_ptr<OverloadDataNode>; +using OverloadDataList = QList<OverloadDataNodePtr>; + +/// The root node of OverloadData. It contains all functions +class OverloadDataRootNode +{ +public: + virtual ~OverloadDataRootNode(); + + OverloadDataRootNode(const OverloadDataRootNode &) = delete; + OverloadDataRootNode &operator=(const OverloadDataRootNode &) = delete; + OverloadDataRootNode(OverloadDataRootNode &&) = delete; + OverloadDataRootNode &operator=(OverloadDataRootNode &&) = delete; + + virtual int argPos() const { return -1; } + virtual const OverloadDataRootNode *parent() const { return nullptr; } + + bool isRoot() const { return parent() == nullptr; } + + AbstractMetaFunctionCPtr referenceFunction() const; + + const AbstractMetaFunctionCList &overloads() const { return m_overloads; } + const OverloadDataList &children() const { return m_children; } + + bool nextArgumentHasDefaultValue() const; + + /// Returns the function that has a default value at the current OverloadData argument position, otherwise returns null. + AbstractMetaFunctionCPtr getFunctionWithDefaultValue() const; + + /// Returns the nearest occurrence, including this instance, of an argument with a default value. + const OverloadDataRootNode *findNextArgWithDefault() const; + bool isFinalOccurrence(const AbstractMetaFunctionCPtr &func) const; + + int functionNumber(const AbstractMetaFunctionCPtr &func) const; + +#ifndef QT_NO_DEBUG_STREAM + virtual void formatDebug(QDebug &d) const; +#endif + + OverloadDataNode *addOverloadDataNode(const AbstractMetaFunctionCPtr &func, + const AbstractMetaArgument &arg); + +protected: + OverloadDataRootNode(const AbstractMetaFunctionCList &o= {}); -class OverloadData; -using OverloadDataList = QList<OverloadData *>; + void dumpRootGraph(QTextStream &s, int minArgs, int maxArgs) const; + void sortNextOverloads(const ApiExtractorResult &api); -class OverloadData + +#ifndef QT_NO_DEBUG_STREAM + void formatReferenceFunction(QDebug &d) const; + void formatOverloads(QDebug &d) const; + void formatNextOverloadData(QDebug &d) const; +#endif + + AbstractMetaFunctionCList m_overloads; + OverloadDataList m_children; +}; + +/// OverloadDataNode references an argument/type combination. +class OverloadDataNode : public OverloadDataRootNode { public: - OverloadData(const AbstractMetaFunctionCList &overloads, - const ApiExtractorResult &api); - ~OverloadData(); + explicit OverloadDataNode(const AbstractMetaFunctionCPtr &func, + OverloadDataRootNode *parent, + const AbstractMetaArgument &arg, int argPos, + const QString argTypeReplaced = {}); + void addOverload(const AbstractMetaFunctionCPtr &func); + + int argPos() const override { return m_argPos; } + const OverloadDataRootNode *parent() const override; + void dumpNodeGraph(QTextStream &s) const; - int minArgs() const { return m_headOverloadData->m_minArgs; } - int maxArgs() const { return m_headOverloadData->m_maxArgs; } - int argPos() const { return m_argPos; } + const AbstractMetaArgument &argument() const + { return m_argument; } + const AbstractMetaType &argType() const { return m_argument.type(); } + const AbstractMetaType &modifiedArgType() const { return m_argument.modifiedType(); } - const AbstractMetaType &argType() const { return m_argType; } + bool isTypeModified() const { return m_argument.isTypeModified(); } - /// Returns a string list containing all the possible return types (including void) for the current OverloadData. - QStringList returnTypes() const; + const AbstractMetaArgument *overloadArgument(const AbstractMetaFunctionCPtr &func) const; + +#ifndef QT_NO_DEBUG_STREAM + void formatDebug(QDebug &d) const override; +#endif + +private: + AbstractMetaArgument m_argument; + QString m_argTypeReplaced; + OverloadDataRootNode *m_parent = nullptr; + + int m_argPos = -1; // Position excluding modified/removed arguments. +}; + +class OverloadData : public OverloadDataRootNode +{ +public: + explicit OverloadData(const AbstractMetaFunctionCList &overloads, + const ApiExtractorResult &api); + + int minArgs() const { return m_minArgs; } + int maxArgs() const { return m_maxArgs; } /// Returns true if any of the overloads for the current OverloadData has a return type different from void. bool hasNonVoidReturnType() const; @@ -61,9 +125,6 @@ public: /// Returns true if any of the overloads for the current OverloadData has a varargs argument. bool hasVarargs() const; - /// Returns true if any of the overloads for the current OverloadData allows threads when called. - bool hasAllowThread() const; - /// Returns true if any of the overloads for the current OverloadData is static. bool hasStaticFunction() const; @@ -88,40 +149,17 @@ public: /// Returns true if among the overloads passed as argument there are static and non-static methods altogether. static bool hasStaticAndInstanceFunctions(const AbstractMetaFunctionCList &overloads); - AbstractMetaFunctionCPtr referenceFunction() const; - const AbstractMetaArgument *argument(const AbstractMetaFunctionCPtr &func) const; - OverloadDataList overloadDataOnPosition(int argPos) const; - - bool isHeadOverloadData() const { return this == m_headOverloadData; } - - /// Returns the root OverloadData object that represents all the overloads. - OverloadData *headOverloadData() const { return m_headOverloadData; } - - /// Returns the function that has a default value at the current OverloadData argument position, otherwise returns null. - AbstractMetaFunctionCPtr getFunctionWithDefaultValue() const; - - bool nextArgumentHasDefaultValue() const; - /// Returns the nearest occurrence, including this instance, of an argument with a default value. - OverloadData *findNextArgWithDefault(); - bool isFinalOccurrence(const AbstractMetaFunctionCPtr &func) const; - - /// Returns the list of overloads removing repeated constant functions (ex.: "foo()" and "foo()const", the second is removed). - AbstractMetaFunctionCList overloadsWithoutRepetition() const; - const AbstractMetaFunctionCList &overloads() const { return m_overloads; } - OverloadDataList nextOverloadData() const { return m_nextOverloadData; } - OverloadData *previousOverloadData() const { return m_previousOverloadData; } - QList<int> invalidArgumentLengths() const; - static int numberOfRemovedArguments(const AbstractMetaFunctionCPtr &func, int finalArgPos = -1); - /// Returns true if all overloads have no more than one argument. - static bool isSingleArgument(const AbstractMetaFunctionCList &overloads); + static int numberOfRemovedArguments(const AbstractMetaFunctionCPtr &func); + static int numberOfRemovedArguments(const AbstractMetaFunctionCPtr &func, int finalArgPos); void dumpGraph(const QString &filename) const; QString dumpGraph() const; + bool showGraph() const; - bool hasArgumentTypeReplace() const; - QString argumentTypeReplaced() const; + /// Returns true if a list of arguments is used (METH_VARARGS) + bool pythonFunctionWrapperUsesListOfArguments() const; bool hasArgumentWithDefaultValue() const; static bool hasArgumentWithDefaultValue(const AbstractMetaFunctionCPtr &func); @@ -130,38 +168,16 @@ public: static AbstractMetaArgumentList getArgumentsWithDefaultValues(const AbstractMetaFunctionCPtr &func); #ifndef QT_NO_DEBUG_STREAM - void formatDebug(QDebug &) const; + void formatDebug(QDebug &) const override; #endif private: - OverloadData(OverloadData *headOverloadData, const AbstractMetaFunctionCPtr &func, - const AbstractMetaType &argType, int argPos, - const ApiExtractorResult &api); - - void addOverload(const AbstractMetaFunctionCPtr &func); - OverloadData *addOverloadData(const AbstractMetaFunctionCPtr &func, const AbstractMetaArgument &arg); - - void sortNextOverloads(); - bool sortByOverloadNumberModification(); - - int functionNumber(const AbstractMetaFunctionCPtr &func) const; - OverloadDataList overloadDataOnPosition(OverloadData *overloadData, int argPos) const; - - int m_minArgs; - int m_maxArgs; - int m_argPos; - AbstractMetaType m_argType; - QString m_argTypeReplaced; - AbstractMetaFunctionCList m_overloads; - - OverloadData *m_headOverloadData; - OverloadDataList m_nextOverloadData; - OverloadData *m_previousOverloadData; - const ApiExtractorResult m_api; + int m_minArgs = 256; + int m_maxArgs = 0; }; #ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug, const OverloadData *); +QDebug operator<<(QDebug, const OverloadData &); #endif #endif // OVERLOADDATA_H |