aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2020-12-01 15:23:20 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2020-12-02 06:38:03 +0000
commitbfacabede1f9cb7dc1747879b310c4855b65bccf (patch)
tree1c73bf7861437d4515d80a8d0728035754560ffe /sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
parentf379fe417a31981cf923930cae8799dc775a9b5f (diff)
shiboken6: Fix field modifications
The logic was only partially present, neither removal of getter/setter nor renaming had any effect. Rewrite the code to resemble that of AbstractMetaFunction (adding function applyFieldModifications()) Move some check functions from the generators to AbstractMetaField/Type. Add tests in libsample. Change-Id: Ib29d4e37db51f122b46702cb5d96b13da6d0f224 Reviewed-by: Christian Tismer <tismer@stackless.com>
Diffstat (limited to 'sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp')
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp28
1 files changed, 24 insertions, 4 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
index 0d86e028f..ac410e920 100644
--- a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
+++ b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
@@ -1175,15 +1175,35 @@ std::optional<AbstractMetaField>
return metaField;
}
+static bool applyFieldModifications(AbstractMetaField *f)
+{
+ const auto &modifications = f->modifications();
+ for (const auto &mod : modifications) {
+ if (mod.isRemoveModifier() && mod.removal() == TypeSystem::All)
+ return false;
+ if (mod.isRenameModifier()) {
+ f->setOriginalName(f->name());
+ f->setName(mod.renamedToName());
+ } else if (!mod.isReadable()) {
+ f->setGetterEnabled(false);
+ } else if (!mod.isWritable()) {
+ f->setSetterEnabled(false);
+ }
+ }
+ f->setOriginalAttributes(f->attributes());
+ return true;
+}
+
void AbstractMetaBuilderPrivate::traverseFields(const ScopeModelItem &scope_item,
AbstractMetaClass *metaClass)
{
const VariableList &variables = scope_item->variables();
for (const VariableModelItem &field : variables) {
- auto metaField = traverseField(field, metaClass);
- if (metaField.has_value() && !metaField->isModifiedRemoved()) {
- metaField->setOriginalAttributes(metaField->attributes());
- metaClass->addField(*metaField);
+ auto metaFieldO = traverseField(field, metaClass);
+ if (metaFieldO.has_value()) {
+ AbstractMetaField metaField = metaFieldO.value();
+ if (applyFieldModifications(&metaField))
+ metaClass->addField(metaField);
}
}
}