diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-12-02 08:46:33 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-12-02 10:27:42 +0000 |
commit | b69d8899b1c592aa9a6cdfa43da3137af3fa16de (patch) | |
tree | 9d106e9a20a5c31e651e3d3c4c08be5648737024 | |
parent | 844f76cf8e01377fa3de6ac8c61eb8342c0c31f1 (diff) |
shiboken6: Refactor field modifications
Decouple class FieldModification from the base class
Modification since it does not need its attributes
and turn in into a value class using QSharedDataPointer
for consistency with FunctionModification.
Remove some unused code and simplify removed handling.
Change-Id: I9997559acd529bd070df5ff84610fe75c74a71a5
Reviewed-by: Christian Tismer <tismer@stackless.com>
-rw-r--r-- | sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp | 2 | ||||
-rw-r--r-- | sources/shiboken6/ApiExtractor/abstractmetafield.cpp | 7 | ||||
-rw-r--r-- | sources/shiboken6/ApiExtractor/abstractmetafunction.h | 1 | ||||
-rw-r--r-- | sources/shiboken6/ApiExtractor/modifications.cpp | 82 | ||||
-rw-r--r-- | sources/shiboken6/ApiExtractor/modifications.h | 37 | ||||
-rw-r--r-- | sources/shiboken6/ApiExtractor/typesystem.cpp | 13 | ||||
-rw-r--r-- | sources/shiboken6/ApiExtractor/typesystem.h | 1 | ||||
-rw-r--r-- | sources/shiboken6/ApiExtractor/typesystem_typedefs.h | 2 | ||||
-rw-r--r-- | sources/shiboken6/ApiExtractor/typesystemparser.cpp | 16 |
9 files changed, 119 insertions, 42 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp index ac410e920..6704054d1 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp @@ -1179,7 +1179,7 @@ static bool applyFieldModifications(AbstractMetaField *f) { const auto &modifications = f->modifications(); for (const auto &mod : modifications) { - if (mod.isRemoveModifier() && mod.removal() == TypeSystem::All) + if (mod.isRemoved()) return false; if (mod.isRenameModifier()) { f->setOriginalName(f->name()); diff --git a/sources/shiboken6/ApiExtractor/abstractmetafield.cpp b/sources/shiboken6/ApiExtractor/abstractmetafield.cpp index fa7ab64d9..3c294c3c7 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetafield.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetafield.cpp @@ -76,10 +76,7 @@ bool AbstractMetaField::isModifiedRemoved(int types) const { const FieldModificationList &mods = modifications(); for (const FieldModification &mod : mods) { - if (!mod.isRemoveModifier()) - continue; - - if ((mod.removal() & types) == types) + if (mod.isRemoved()) return true; } @@ -175,7 +172,7 @@ FieldModificationList AbstractMetaField::modifications() const FieldModificationList returned; for (const FieldModification &mod : mods) { - if (mod.name == name()) + if (mod.name() == name()) returned += mod; } diff --git a/sources/shiboken6/ApiExtractor/abstractmetafunction.h b/sources/shiboken6/ApiExtractor/abstractmetafunction.h index 9628224af..ff30308c1 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetafunction.h +++ b/sources/shiboken6/ApiExtractor/abstractmetafunction.h @@ -47,7 +47,6 @@ class Documentation; class SourceLocation; struct ArgumentOwner; -struct FieldModification; struct ReferenceCount; class AbstractMetaFunction : public AbstractMetaAttributes diff --git a/sources/shiboken6/ApiExtractor/modifications.cpp b/sources/shiboken6/ApiExtractor/modifications.cpp index fb839b3b1..fe3983ce1 100644 --- a/sources/shiboken6/ApiExtractor/modifications.cpp +++ b/sources/shiboken6/ApiExtractor/modifications.cpp @@ -163,6 +163,88 @@ QString Modification::accessModifierString() const return QString(); } +// ---------------------- FieldModification + +class FieldModificationData : public QSharedData +{ +public: + QString m_name; + QString m_renamedToName; + bool m_readable = true; + bool m_writable = true; + bool m_removed = false; +}; + +FieldModification::FieldModification() : d(new FieldModificationData) +{ +} + +FieldModification::FieldModification(const FieldModification &) = default; +FieldModification &FieldModification::operator=(const FieldModification &) = default; +FieldModification::FieldModification(FieldModification &&) = default; +FieldModification &FieldModification::operator=(FieldModification &&) = default; +FieldModification::~FieldModification() = default; + +QString FieldModification::name() const +{ + return d->m_name; +} + +void FieldModification::setName(const QString &value) +{ + if (d->m_name != value) + d->m_name = value; +} + +bool FieldModification::isRenameModifier() const +{ + return !d->m_renamedToName.isEmpty(); +} + +QString FieldModification::renamedToName() const +{ + return d->m_renamedToName; +} + +void FieldModification::setRenamedToName(const QString &value) +{ + if (d->m_renamedToName != value) + d->m_renamedToName = value; +} + +bool FieldModification::isReadable() const +{ + return d->m_readable; +} + +void FieldModification::setReadable(bool e) +{ + if (d->m_readable != e) + d->m_readable = e; +} + +bool FieldModification::isWritable() const +{ + return d->m_writable; +} + +void FieldModification::setWritable(bool e) +{ + if (d->m_writable != e) + d->m_writable = e; +} + +bool FieldModification::isRemoved() const +{ + return d->m_removed; +} + +void FieldModification::setRemoved(bool r) +{ + if (d->m_removed != r) + d->m_removed = r; +} + // 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, ...)" diff --git a/sources/shiboken6/ApiExtractor/modifications.h b/sources/shiboken6/ApiExtractor/modifications.h index 50895e3e5..51fd46ed8 100644 --- a/sources/shiboken6/ApiExtractor/modifications.h +++ b/sources/shiboken6/ApiExtractor/modifications.h @@ -41,6 +41,7 @@ class FunctionModificationData; class ModificationData; +class FieldModificationData; QT_BEGIN_NAMESPACE class QDebug; @@ -379,18 +380,34 @@ QDebug operator<<(QDebug d, const ArgumentModification &a); QDebug operator<<(QDebug d, const FunctionModification &fm); #endif -struct FieldModification: public Modification +class FieldModification { - bool isReadable() const - { - return modifiers().testFlag(Readable); - } - bool isWritable() const - { - return modifiers().testFlag(Writable); - } +public: + FieldModification(); + FieldModification(const FieldModification &); + FieldModification &operator=(const FieldModification &); + FieldModification(FieldModification &&); + FieldModification &operator=(FieldModification &&); + ~FieldModification(); - QString name; + QString name() const; + void setName(const QString &value); + + bool isRenameModifier() const; + QString renamedToName() const; + void setRenamedToName(const QString &value); + + bool isReadable() const; + void setReadable(bool e); + + bool isWritable() const; + void setWritable(bool e); + + bool isRemoved() const; + void setRemoved(bool r); + +private: + QSharedDataPointer<FieldModificationData> d; }; /** diff --git a/sources/shiboken6/ApiExtractor/typesystem.cpp b/sources/shiboken6/ApiExtractor/typesystem.cpp index 69c2644b0..372d36cfb 100644 --- a/sources/shiboken6/ApiExtractor/typesystem.cpp +++ b/sources/shiboken6/ApiExtractor/typesystem.cpp @@ -1227,19 +1227,6 @@ void ComplexTypeEntry::addNewFunction(const AddedFunctionPtr &addedFunction) d->m_addedFunctions << addedFunction; } -FieldModification ComplexTypeEntry::fieldModification(const QString &name) const -{ - S_D(const ComplexTypeEntry); - for (const auto &fieldMod : d->m_fieldMods) { - if (fieldMod.name == name) - return fieldMod; - } - FieldModification mod; - mod.name = name; - mod.setModifiers(FieldModification::Readable | FieldModification::Writable); - return mod; -} - void ComplexTypeEntry::setFieldModifications(const FieldModificationList &mods) { S_D(ComplexTypeEntry); diff --git a/sources/shiboken6/ApiExtractor/typesystem.h b/sources/shiboken6/ApiExtractor/typesystem.h index 2f9b2c6f7..a2b52bb0d 100644 --- a/sources/shiboken6/ApiExtractor/typesystem.h +++ b/sources/shiboken6/ApiExtractor/typesystem.h @@ -523,7 +523,6 @@ public: void setAddedFunctions(const AddedFunctionList &addedFunctions); void addNewFunction(const AddedFunctionPtr &addedFunction); - FieldModification fieldModification(const QString &name) const; void setFieldModifications(const FieldModificationList &mods); FieldModificationList fieldModifications() const; diff --git a/sources/shiboken6/ApiExtractor/typesystem_typedefs.h b/sources/shiboken6/ApiExtractor/typesystem_typedefs.h index 051d0bed9..e7a72aa46 100644 --- a/sources/shiboken6/ApiExtractor/typesystem_typedefs.h +++ b/sources/shiboken6/ApiExtractor/typesystem_typedefs.h @@ -38,7 +38,7 @@ class CodeSnip; class DocModification; struct AddedFunction; -struct FieldModification; +class FieldModification; class FunctionModification; class TypeEntry; diff --git a/sources/shiboken6/ApiExtractor/typesystemparser.cpp b/sources/shiboken6/ApiExtractor/typesystemparser.cpp index da70ec72a..7501a6eaf 100644 --- a/sources/shiboken6/ApiExtractor/typesystemparser.cpp +++ b/sources/shiboken6/ApiExtractor/typesystemparser.cpp @@ -2089,30 +2089,26 @@ bool TypeSystemParser::parseModifyField(const QXmlStreamReader &reader, QXmlStreamAttributes *attributes) { FieldModification fm; - fm.setModifiers(FieldModification::Readable | FieldModification::Writable); for (int i = attributes->size() - 1; i >= 0; --i) { const auto name = attributes->at(i).qualifiedName(); if (name == nameAttribute()) { - fm.name = attributes->takeAt(i).value().toString(); + fm.setName(attributes->takeAt(i).value().toString()); } else if (name == removeAttribute()) { - if (!convertRemovalAttribute(attributes->takeAt(i).value(), fm, m_error)) - return false; + if (attributes->takeAt(i).value() == u"all") + fm.setRemoved(true); } else if (name == readAttribute()) { qCWarning(lcShiboken, "%s", qPrintable(msgUnimplementedAttributeWarning(reader, name))); - if (!convertBoolean(attributes->takeAt(i).value(), readAttribute(), true)) - fm.clearModifierFlag(FieldModification::Readable); + fm.setReadable(convertBoolean(attributes->takeAt(i).value(), readAttribute(), true)); } else if (name == writeAttribute()) { qCWarning(lcShiboken, "%s", qPrintable(msgUnimplementedAttributeWarning(reader, name))); - if (!convertBoolean(attributes->takeAt(i).value(), writeAttribute(), true)) - fm.clearModifierFlag(FieldModification::Writable); + fm.setWritable(convertBoolean(attributes->takeAt(i).value(), writeAttribute(), true)); } else if (name == renameAttribute()) { fm.setRenamedToName(attributes->takeAt(i).value().toString()); - fm.setModifierFlag(Modification::Rename); } } - if (fm.name.isEmpty()) { + if (fm.name().isEmpty()) { m_error = msgMissingAttribute(nameAttribute()); return false; } |