aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-01-12 13:46:34 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-01-19 11:46:14 +0000
commit726fcd72ce564175e2c9aa83916e9a552945e651 (patch)
tree559f2d634106ca4895c0e500ac2ec5a99fa8b1a6
parent1682afa98114dbcf7b64bce67cf72a1690b2fe98 (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.cpp18
-rw-r--r--sources/shiboken6/ApiExtractor/modifications.h9
-rw-r--r--sources/shiboken6/ApiExtractor/typesystemparser.cpp7
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(&centry->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;
}