diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-06-10 13:26:49 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-06-10 20:18:48 +0000 |
commit | 93669bcdaf2fb646e0c2125335cf2e7ae6a5c756 (patch) | |
tree | e8e596cb54f4c9050d18a1788ce4a9078b6a282d | |
parent | 0695cf877bab98bc654bc264538e3a5f876fa48f (diff) |
shiboken6: Use replaced types in functions signatures in generated code
Add AbstractMetaFunction::minimalModifiedSignature() to be used
in the overload decisor comments and split the formatting helpers
accordingly. No caching is required as it is called only once.
Task-number: PYSIDE-1588
Change-Id: I29b7d6ba33bfe3f4348234697ef1ef8112f86ac9
Reviewed-by: Christian Tismer <tismer@stackless.com>
(cherry picked from commit 60132e11037c7645efdc6b4e8a3f9f231ee6133b)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | sources/shiboken6/ApiExtractor/abstractmetafunction.cpp | 50 | ||||
-rw-r--r-- | sources/shiboken6/ApiExtractor/abstractmetafunction.h | 3 | ||||
-rw-r--r-- | sources/shiboken6/generator/shiboken/cppgenerator.cpp | 2 |
3 files changed, 37 insertions, 18 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp b/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp index 21677a3e5..87a5d3edc 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp @@ -67,7 +67,8 @@ public: } QString signature() const; - QString minimalSignature() const; + QString formatMinimalSignature(const AbstractMetaFunction *q, + bool comment) const; QString modifiedName(const AbstractMetaFunction *q) const; int overloadNumber(const AbstractMetaFunction *q) const; @@ -738,31 +739,46 @@ bool AbstractMetaFunction::isModifiedToArray(int argumentIndex) const return false; } -QString AbstractMetaFunctionPrivate::minimalSignature() const +// Parameter 'comment' indicates usage as a code comment of the overload decisor +QString AbstractMetaFunctionPrivate::formatMinimalSignature(const AbstractMetaFunction *q, + bool comment) const { - if (!m_cachedMinimalSignature.isEmpty()) - return m_cachedMinimalSignature; - - QString minimalSignature = m_originalName + QLatin1Char('('); + QString result = m_originalName + QLatin1Char('('); for (int i = 0; i < m_arguments.count(); ++i) { - const AbstractMetaType &t = m_arguments.at(i).type(); if (i > 0) - minimalSignature += QLatin1Char(','); - minimalSignature += t.minimalSignature(); + result += QLatin1Char(','); + + QString typeName; + if (comment) + typeName = q->typeReplaced(i + 1); + if (typeName.isEmpty()) + typeName = m_arguments.at(i).type().minimalSignature(); + result += typeName; } - minimalSignature += QLatin1Char(')'); + result += QLatin1Char(')'); if (m_constant) - minimalSignature += QLatin1String("const"); - - minimalSignature = TypeDatabase::normalizedSignature(minimalSignature); - m_cachedMinimalSignature = minimalSignature; - - return minimalSignature; + result += QLatin1String("const"); + result = TypeDatabase::normalizedSignature(result); + + if (comment && !q->isVoid()) { + QString typeName = q->typeReplaced(0); + if (typeName.isEmpty()) + typeName = q->type().minimalSignature(); + result += QStringLiteral("->") + typeName; + } + return result; } QString AbstractMetaFunction::minimalSignature() const { - return d->minimalSignature(); + if (d->m_cachedMinimalSignature.isEmpty()) + d->m_cachedMinimalSignature = d->formatMinimalSignature(this, false); + return d->m_cachedMinimalSignature; +} + +QString AbstractMetaFunction::signatureComment() const +{ + return d->formatMinimalSignature(this, true); } QString AbstractMetaFunction::debugSignature() const diff --git a/sources/shiboken6/ApiExtractor/abstractmetafunction.h b/sources/shiboken6/ApiExtractor/abstractmetafunction.h index 256a37e7e..b677cf0ea 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetafunction.h +++ b/sources/shiboken6/ApiExtractor/abstractmetafunction.h @@ -226,6 +226,9 @@ public: QString modifiedName() const; QString minimalSignature() const; + // Signature with replaced argument types and return type for overload + // decisor comment. + QString signatureComment() const; QString debugSignature() const; // including virtual/override/final, etc., for debugging only. bool isModifiedRemoved(const AbstractMetaClass *cls = nullptr) const; diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.cpp b/sources/shiboken6/generator/shiboken/cppgenerator.cpp index 91caa51ba..06b421621 100644 --- a/sources/shiboken6/generator/shiboken/cppgenerator.cpp +++ b/sources/shiboken6/generator/shiboken/cppgenerator.cpp @@ -2722,7 +2722,7 @@ void CppGenerator::writeOverloadedFunctionDecisor(TextStream &s, const OverloadD s << "static "; if (const auto *decl = func->declaringClass()) s << decl->name() << "::"; - s << func->minimalSignature() << '\n'; + s << func->signatureComment() << '\n'; } writeOverloadedFunctionDecisorEngine(s, &overloadData); s << '\n'; |