aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken6/ApiExtractor/addedfunction.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <friedemann.kleint@qt.io>2023-05-10 13:50:56 +0200
committerCristián Maureira-Fredes <cristian.maureira-fredes@qt.io>2025-11-24 12:06:06 +0100
commit845630ad239c4b37ff37e49ef5bb969a8946744b (patch)
tree5c65f2e270511459d346c14f0ad8d01f5e6e39a0 /sources/shiboken6/ApiExtractor/addedfunction.cpp
parent3cf2077a1b060bbea3419ccde23c5da6485a2e24 (diff)
Move the shiboken-generator source around
THIS COMMIT WAS GENERATED BY A SCRIPT Task-number: PYSIDE-962 Task-number: PYSIDE-1587 Change-Id: I58b05c3d05606efb6303193f2d7f907a0ab5741b Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'sources/shiboken6/ApiExtractor/addedfunction.cpp')
-rw-r--r--sources/shiboken6/ApiExtractor/addedfunction.cpp220
1 files changed, 0 insertions, 220 deletions
diff --git a/sources/shiboken6/ApiExtractor/addedfunction.cpp b/sources/shiboken6/ApiExtractor/addedfunction.cpp
deleted file mode 100644
index 649296066..000000000
--- a/sources/shiboken6/ApiExtractor/addedfunction.cpp
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright (C) 2022 The Qt Company Ltd.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
-
-#include "addedfunction.h"
-#include "addedfunction_p.h"
-#include "typeparser.h"
-
-#include <QtCore/qdebug.h>
-
-using namespace Qt::StringLiterals;
-
-constexpr auto callOperator = "operator()"_L1;
-
-// 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 {
-
-QDebug operator<<(QDebug d, const Argument &a)
-{
- 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;
-}
-
-// Helper for finding the end of a function parameter, observing
-// nested template parameters or lists.
-static qsizetype parameterTokenEnd(qsizetype startPos, QStringView paramString)
-{
- const auto end = paramString.size();
- int nestingLevel = 0;
- for (qsizetype p = startPos; p < end; ++p) {
- switch (paramString.at(p).toLatin1()) {
- case ',':
- if (nestingLevel == 0)
- return p;
- break;
- case '<': // templates
- case '{': // initializer lists of default values
- case '(': // initialization, function pointers
- case '[': // array dimensions
- ++nestingLevel;
- break;
- case '>':
- case '}':
- case ')':
- case ']':
- --nestingLevel;
- break;
- default:
- 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;
- qsizetype startPos = 0;
- for ( ; startPos < paramString.size(); ) {
- const auto end = parameterTokenEnd(startPos, paramString);
- result.append(paramString.mid(startPos, end - startPos).trimmed());
- startPos = end + 1;
- }
- return result;
-}
-
-// Split a function parameter list
-Arguments splitParameters(QStringView paramString, QString *errorMessage)
-{
- Arguments result;
- const QList<QStringView> tokens = splitParameterTokens(paramString);
-
- for (const auto &t : tokens) {
- Argument argument;
- // Check defaultValue, "int @b@=5"
- const auto equalPos = t.lastIndexOf(u'=');
- if (equalPos != -1) {
- const auto 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 auto atPos = typeString.indexOf(u'@');
- if (atPos != -1) {
- const auto namePos = atPos + 1;
- const auto nameEndPos = typeString.indexOf(u'@', namePos);
- if (nameEndPos == -1) {
- if (errorMessage != nullptr) {
- *errorMessage = u"Mismatched @ in \""_s
- + paramString.toString() + u'"';
- }
- 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)
-{
-}
-
-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 auto parenSearchStartPos = signature.startsWith(callOperator)
- ? callOperator.size() : 0;
- const auto openParenPos = signature.indexOf(u'(', parenSearchStartPos);
- if (openParenPos < 0) {
- return std::make_shared<AddedFunction>(signature.toString(),
- arguments, returnType);
- }
-
- const QString name = signature.left(openParenPos).trimmed().toString();
- const auto closingParenPos = signature.lastIndexOf(u')');
- if (closingParenPos < 0) {
- *errorMessage = u"Missing closing parenthesis"_s;
- return {};
- }
-
- // Check for "foo() const"
- bool isConst = false;
- const auto signatureLength = signature.length();
- const auto qualifierLength = signatureLength - closingParenPos - 1;
- if (qualifierLength >= 5
- && signature.right(qualifierLength).contains(u"const")) {
- isConst = true;
- }
-
- const auto paramString = signature.mid(openParenPos + 1, closingParenPos - openParenPos - 1);
- auto params = AddedFunctionParser::splitParameters(paramString, errorMessage);
- if (params.isEmpty() && !errorMessage->isEmpty())
- return {};
- if (params.size() == 1 && params.constFirst().type == "void"_L1)
- params.clear(); // "void foo(void)" -> ""void foo()"
- for (const auto &p : std::as_const(params)) {
- TypeInfo type = p.type == u"..."
- ? TypeInfo::varArgsType() : TypeParser::parse(p.type, errorMessage);
- if (!errorMessage->isEmpty()) {
- errorMessage->prepend(u"Unable to parse added function "_s + signatureIn
- + u": "_s);
- return {};
- }
- arguments.append({type, p.name, p.defaultValue});
- }
-
- auto result = std::make_shared<AddedFunction>(name, arguments, returnType);
- result->setConstant(isConst);
- return result;
-}
-
-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;
-}