diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-01-12 13:46:34 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-01-19 11:46:14 +0000 |
commit | 726fcd72ce564175e2c9aa83916e9a552945e651 (patch) | |
tree | 559f2d634106ca4895c0e500ac2ec5a99fa8b1a6 | |
parent | 1682afa98114dbcf7b64bce67cf72a1690b2fe98 (diff) |
shiboken6/Type system parser: Purge empty code snippets
Newline characters in conjunction with <insert-template> cause empty
snippets to be added. Add functions to purge them.
Task-number: PYSIDE-1766
Change-Id: I534de369b45c4e785a643f6539a5c7fb395909f2
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Christian Tismer <tismer@stackless.com>
(cherry picked from commit 26a1b40e4fa878a11995528dcf04158b44477477)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | sources/shiboken6/ApiExtractor/modifications.cpp | 18 | ||||
-rw-r--r-- | sources/shiboken6/ApiExtractor/modifications.h | 9 | ||||
-rw-r--r-- | sources/shiboken6/ApiExtractor/typesystemparser.cpp | 7 |
3 files changed, 34 insertions, 0 deletions
diff --git a/sources/shiboken6/ApiExtractor/modifications.cpp b/sources/shiboken6/ApiExtractor/modifications.cpp index a1c8eabbc..bb1e7505e 100644 --- a/sources/shiboken6/ApiExtractor/modifications.cpp +++ b/sources/shiboken6/ApiExtractor/modifications.cpp @@ -83,11 +83,29 @@ void CodeSnipAbstract::addCode(const QString &code) codeList.append(CodeSnipFragment(fixSpaces(code))); } +void CodeSnipAbstract::purgeEmptyFragments() +{ + auto end = std::remove_if(codeList.begin(), codeList.end(), + [](const CodeSnipFragment &f) { return f.isEmpty(); }); + codeList.erase(end, codeList.end()); +} + QRegularExpression CodeSnipAbstract::placeHolderRegex(int index) { return QRegularExpression(QLatin1Char('%') + QString::number(index) + QStringLiteral("\\b")); } +void purgeEmptyCodeSnips(QList<CodeSnip> *list) +{ + for (auto it = list->begin(); it != list->end(); ) { + it->purgeEmptyFragments(); + if (it->isEmpty()) + it = list->erase(it); + else + ++it; + } +} + // ---------------------- Modification QString FunctionModification::accessModifierString() const { diff --git a/sources/shiboken6/ApiExtractor/modifications.h b/sources/shiboken6/ApiExtractor/modifications.h index 3435c9737..6761671c7 100644 --- a/sources/shiboken6/ApiExtractor/modifications.h +++ b/sources/shiboken6/ApiExtractor/modifications.h @@ -116,6 +116,8 @@ public: explicit CodeSnipFragment(const QString &code) : m_code(code) {} explicit CodeSnipFragment(const TemplateInstancePtr &instance) : m_instance(instance) {} + bool isEmpty() const { return m_code.isEmpty() && m_instance.isNull(); } + QString code() const; TemplateInstancePtr instance() const { return m_instance; } @@ -138,6 +140,9 @@ public: codeList.append(CodeSnipFragment(ti)); } + bool isEmpty() const { return codeList.isEmpty(); } + void purgeEmptyFragments(); + QList<CodeSnipFragment> codeList; static QRegularExpression placeHolderRegex(int index); @@ -167,6 +172,10 @@ public: TypeSystem::CodeSnipPosition position = TypeSystem::CodeSnipPositionAny; }; +/// Purge empty fragments and snippets caused by new line characters in +/// conjunction with <insert-template>. +void purgeEmptyCodeSnips(QList<CodeSnip> *list); + class ArgumentModification { public: diff --git a/sources/shiboken6/ApiExtractor/typesystemparser.cpp b/sources/shiboken6/ApiExtractor/typesystemparser.cpp index 2253b2350..684800719 100644 --- a/sources/shiboken6/ApiExtractor/typesystemparser.cpp +++ b/sources/shiboken6/ApiExtractor/typesystemparser.cpp @@ -846,6 +846,7 @@ bool TypeSystemParser::endElement(StackElement element) toNative->setSourceType(m_database->findType(toNative->sourceTypeName())); } } + purgeEmptyCodeSnips(&top->entry->codeSnips()); break; case StackElement::FunctionTypeEntry: TypeDatabase::instance()->addGlobalUserFunctionModifications(top->functionMods); @@ -858,6 +859,7 @@ bool TypeSystemParser::endElement(StackElement element) Q_ASSERT(top->entry); Q_ASSERT(top->entry->isComplex()); auto *centry = static_cast<ComplexTypeEntry *>(top->entry); + purgeEmptyCodeSnips(¢ry->codeSnips()); centry->setAddedFunctions(top->addedFunctions); centry->setFunctionModifications(top->functionMods); centry->setFieldModifications(top->fieldMods); @@ -939,6 +941,11 @@ bool TypeSystemParser::endElement(StackElement element) snip->addTemplateInstance(m_templateInstance); m_templateInstance.reset(); break; + + case StackElement::ModifyArgument: + purgeEmptyCodeSnips(&top->functionMods.last().argument_mods().last().conversionRules()); + break; + default: break; } |