aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2020-11-10 08:33:01 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2020-11-10 10:03:21 +0000
commit1ef022dc40a859390182a2bfaac311ee1843d9a2 (patch)
treead52ddd71ea4ad3fcb81b68dff21476457aa7742 /sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
parent3464f53cb98cbd70a4e46a5c2f4c59a0c8cb16a0 (diff)
shiboken6: Port AbstractMetaField to use QSharedDataPointer
Fold AbstractMetaVariable into AbstractMetaField and use a QSharedDataPointer for it. Change the client code to store it by value. For the find() and traverseField() functions, use a std::optional to replace the pointer. Change-Id: Ibaa301b9aaae8851fcaa077327235cc5aaad7342 Reviewed-by: Christian Tismer <tismer@stackless.com>
Diffstat (limited to 'sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp')
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp58
1 files changed, 28 insertions, 30 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
index 9324ac56f..d84aa0f37 100644
--- a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
+++ b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
@@ -1125,30 +1125,31 @@ static inline QString qualifiedFieldSignatureWithType(const QString &className,
return className + colonColon() + fieldSignatureWithType(field);
}
-AbstractMetaField *AbstractMetaBuilderPrivate::traverseField(const VariableModelItem &field,
- AbstractMetaClass *cls)
+std::optional<AbstractMetaField>
+ AbstractMetaBuilderPrivate::traverseField(const VariableModelItem &field,
+ AbstractMetaClass *cls)
{
QString fieldName = field->name();
QString className = cls->typeEntry()->qualifiedCppName();
// Ignore friend decl.
if (field->isFriend())
- return nullptr;
+ return {};
if (field->accessPolicy() == CodeModel::Private)
- return nullptr;
+ return {};
QString rejectReason;
if (TypeDatabase::instance()->isFieldRejected(className, fieldName, &rejectReason)) {
m_rejectedFields.insert(qualifiedFieldSignatureWithType(className, field) + rejectReason,
AbstractMetaBuilder::GenerationDisabled);
- return nullptr;
+ return {};
}
- auto *metaField = new AbstractMetaField;
- metaField->setName(fieldName);
- metaField->setEnclosingClass(cls);
+ AbstractMetaField metaField;
+ metaField.setName(fieldName);
+ metaField.setEnclosingClass(cls);
TypeInfo fieldType = field->type();
AbstractMetaType metaType = translateType(fieldType, cls);
@@ -1159,11 +1160,10 @@ AbstractMetaField *AbstractMetaBuilderPrivate::traverseField(const VariableModel
qCWarning(lcShiboken, "%s",
qPrintable(msgSkippingField(field, cls->name(), type)));
}
- delete metaField;
- return nullptr;
+ return {};
}
- metaField->setType(metaType);
+ metaField.setType(metaType);
AbstractMetaAttributes::Attributes attr;
if (field->isStatic())
@@ -1176,7 +1176,7 @@ AbstractMetaField *AbstractMetaBuilderPrivate::traverseField(const VariableModel
attr |= AbstractMetaAttributes::Protected;
else
attr |= AbstractMetaAttributes::Private;
- metaField->setAttributes(attr);
+ metaField.setAttributes(attr);
return metaField;
}
@@ -1186,11 +1186,10 @@ void AbstractMetaBuilderPrivate::traverseFields(const ScopeModelItem &scope_item
{
const VariableList &variables = scope_item->variables();
for (const VariableModelItem &field : variables) {
- AbstractMetaField *metaField = traverseField(field, metaClass);
-
- if (metaField && !metaField->isModifiedRemoved()) {
+ auto metaField = traverseField(field, metaClass);
+ if (metaField.has_value() && !metaField->isModifiedRemoved()) {
metaField->setOriginalAttributes(metaField->attributes());
- metaClass->addField(metaField);
+ metaClass->addField(*metaField);
}
}
}
@@ -2412,8 +2411,8 @@ QString AbstractMetaBuilderPrivate::fixDefaultValue(const ArgumentModelItem &ite
// Fix scope if the parameter is a field of the current class
if (implementingClass) {
const AbstractMetaFieldList &fields = implementingClass->fields();
- for (const AbstractMetaField *field : fields) {
- if (defaultMatch.hasMatch() && defaultMatch.captured(2) == field->name()) {
+ for (const AbstractMetaField &field : fields) {
+ if (defaultMatch.hasMatch() && defaultMatch.captured(2) == field.name()) {
expr = defaultMatch.captured(1) + implementingClass->name()
+ colonColon() + defaultMatch.captured(2) + defaultMatch.captured(3);
break;
@@ -2713,22 +2712,22 @@ void AbstractMetaBuilderPrivate::inheritTemplateFunctions(AbstractMetaClass *sub
// Take copy
const AbstractMetaFieldList existingSubclassFields = subclass->fields();
const AbstractMetaFieldList &templateClassFields = templateClass->fields();
- for (const AbstractMetaField *field : templateClassFields) {
+ for (const AbstractMetaField &field : templateClassFields) {
// If the field is modified or the instantiation has a field named
// the same as an existing field we have shadowing, so we need to skip it.
- if (field->isModifiedRemoved(TypeSystem::All)
- || field->attributes().testFlag(AbstractMetaAttributes::Static)
- || AbstractMetaField::find(existingSubclassFields, field->name()) != nullptr) {
+ if (field.isModifiedRemoved(TypeSystem::All)
+ || field.attributes().testFlag(AbstractMetaAttributes::Static)
+ || AbstractMetaField::find(existingSubclassFields, field.name()).has_value()) {
continue;
}
- QScopedPointer<AbstractMetaField> f(field->copy());
- f->setEnclosingClass(subclass);
- AbstractMetaType fieldType = inheritTemplateType(templateTypes, field->type());
+ AbstractMetaField f = field;
+ f.setEnclosingClass(subclass);
+ AbstractMetaType fieldType = inheritTemplateType(templateTypes, field.type());
if (!fieldType)
continue;
- f->setType(fieldType);
- subclass->addField(f.take());
+ f.setType(fieldType);
+ subclass->addField(f);
}
}
@@ -2982,9 +2981,8 @@ AbstractMetaClassList AbstractMetaBuilderPrivate::classesTopologicalSorted(const
}
}
// Member fields need to be initialized
- const AbstractMetaFieldList &fields = clazz->fields();
- for (AbstractMetaField *field : fields) {
- addClassDependency(field->type().typeEntry(), clazz, classIndex,
+ for (const AbstractMetaField &field : clazz->fields()) {
+ addClassDependency(field.type().typeEntry(), clazz, classIndex,
map, &graph);
}
}