aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2020-12-02 08:46:33 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2020-12-02 10:27:42 +0000
commitb69d8899b1c592aa9a6cdfa43da3137af3fa16de (patch)
tree9d106e9a20a5c31e651e3d3c4c08be5648737024
parent844f76cf8e01377fa3de6ac8c61eb8342c0c31f1 (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.cpp2
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetafield.cpp7
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetafunction.h1
-rw-r--r--sources/shiboken6/ApiExtractor/modifications.cpp82
-rw-r--r--sources/shiboken6/ApiExtractor/modifications.h37
-rw-r--r--sources/shiboken6/ApiExtractor/typesystem.cpp13
-rw-r--r--sources/shiboken6/ApiExtractor/typesystem.h1
-rw-r--r--sources/shiboken6/ApiExtractor/typesystem_typedefs.h2
-rw-r--r--sources/shiboken6/ApiExtractor/typesystemparser.cpp16
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;
}