diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-12-01 15:23:20 +0100 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-12-02 06:38:03 +0000 |
| commit | bfacabede1f9cb7dc1747879b310c4855b65bccf (patch) | |
| tree | 1c73bf7861437d4515d80a8d0728035754560ffe /sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp | |
| parent | f379fe417a31981cf923930cae8799dc775a9b5f (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.cpp | 28 |
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); } } } |
