Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/Lts/Common/CodeGen/GrantleeWrappers.h
T
torstenandCopilot d6b6ffce7c Apply clang-format to Lts/Common and DTC/enum headers
- Formatted all CodeGen module files (9 files)
- Formatted LtsAppDescriptor module files
- Formatted LtsAppManager/AppChooser files
- Applied clang-format to all DTC and enum headers across modules
- Removed coordTransTests from CommonUnitTestsPlaceholder (moved to tests/)

Cosmetic changes only, no functional modifications.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-08-19 14:46:29 +02:00

931 lines
24 KiB
C++

#pragma once
#include "StructBuilder.h"
#include <QObject>
#include <QString>
#include <QVariant>
#include <utility>
#ifdef RTI_HEADER_AVAILABLE
#include <dds/core/xtypes/EnumType.hpp>
#endif
namespace CodeGen
{
class NameWrapper : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name)
Q_PROPERTY(QString nameCc READ nameCc)
Q_PROPERTY(QString nameFlc READ nameFlc)
public:
NameWrapper(const QString& name, QObject* parent) : QObject(parent), m_name(name) {}
QString name() const
{
return m_name;
}
QString nameCc() const
{
return StructBuilder::camelCaseString(name(), true);
}
QString nameFlc() const
{
return StructBuilder::firstCharLowercase(nameCc());
}
private:
const QString m_name;
};
class VariantListWrapper : public NameWrapper
{
Q_OBJECT
Q_PROPERTY(QVariantList member READ member)
public:
using NameWrapper::NameWrapper;
~VariantListWrapper()
{
for (const QVariant& v : std::as_const(m_member))
{
auto ptr = v.value<QObject*>();
delete ptr;
}
}
QVariantList member() const
{
return m_member;
}
protected:
QVariantList m_member;
};
class MemberInformationWrapper final : public QObject
{
Q_OBJECT
Q_PROPERTY(QString cppMemberName READ cppMemberName)
Q_PROPERTY(QString cppMemberNameCc READ cppMemberNameCc)
Q_PROPERTY(QString cppStructName READ cppStructName)
Q_PROPERTY(QString cppType READ cppType)
Q_PROPERTY(QString cppToQvPre READ cppToQvPre)
Q_PROPERTY(QString cppToQvPost READ cppToQvPost)
Q_PROPERTY(QString cppFromQvPre1 READ cppFromQvPre1)
Q_PROPERTY(QString cppFromQvPre2 READ cppFromQvPre2)
Q_PROPERTY(QString cppFromQvPost READ cppFromQvPost)
Q_PROPERTY(QString cppDefault READ cppDefault)
Q_PROPERTY(QString dbTableName READ dbTableName)
Q_PROPERTY(QString dbColumnName READ dbColumnName)
Q_PROPERTY(QString dbColumnNameView READ dbColumnNameView)
Q_PROPERTY(QString ddsToQVariant READ ddsToQVariant)
Q_PROPERTY(QString qVariantToDds READ qVariantToDds)
Q_PROPERTY(QString ddsToJsonElement READ ddsToJsonElement)
Q_PROPERTY(QString jsonElementToDds READ jsonElementToDds)
Q_PROPERTY(QString dbToJsonElement READ dbToJsonElement)
Q_PROPERTY(QString jsonElementToDb READ jsonElementToDb)
Q_PROPERTY(bool dbHasSequence READ dbHasSequence)
Q_PROPERTY(bool isOptional READ isOptional)
Q_PROPERTY(bool isCppStruct READ isCppStruct)
public:
MemberInformationWrapper(const MemberInformation& mi, QObject* parent) : QObject(parent), m_mi(mi) {}
QString cppMemberName() const
{
return m_mi.cpp.memberName;
}
QString cppMemberNameCc() const
{
return StructBuilder::camelCaseString(m_mi.cpp.memberName, true);
}
QString cppStructName() const
{
return m_mi.cpp.structName;
}
QString cppType() const
{
return m_mi.cpp.type;
}
QString cppToQvPre() const
{
return m_mi.cpp.toVariantPre;
}
QString cppToQvPost() const
{
return m_mi.cpp.toVariantPost;
}
QString cppFromQvPre1() const
{
return m_mi.cpp.fromVariantPre1;
}
QString cppFromQvPre2() const
{
return m_mi.cpp.fromVariantPre2;
}
QString cppFromQvPost() const
{
return m_mi.cpp.fromVariantPost;
}
QString cppDefault() const
{
return m_mi.cpp.defaultValue;
}
QString dbTableName() const
{
return m_mi.db.table;
}
QString dbColumnName() const
{
return m_mi.db.columnName;
}
QString dbColumnNameView() const
{
return m_mi.db.getColumnNameView();
}
QString cppDdsType() const
{
return m_mi.cpp.ddsType.isEmpty() ? cppType() : m_mi.cpp.ddsType;
}
QString ddsToQVariant() const;
QString qVariantToDds() const;
QString ddsToJsonElement() const;
QString jsonElementToDds() const;
QString dbToJsonElement() const;
QString jsonElementToDb() const;
bool dbHasSequence() const
{
return m_mi.db.hasSequence;
}
bool isOptional() const
{
return m_mi.cpp.isOptional;
}
bool isCppStruct() const
{
return m_mi.cpp.usedForCppStruct;
}
QString cppToJsonPre() const
{
return m_mi.cpp.toJsonPre.isNull() ? m_mi.cpp.toVariantPre : m_mi.cpp.toJsonPre;
}
QString cppToJsonPost() const
{
return m_mi.cpp.toJsonPost.isNull() ? m_mi.cpp.toVariantPost : m_mi.cpp.toJsonPost;
}
QString cppFromJsonPre2() const
{
return m_mi.cpp.fromJsonPre2.isNull() ? m_mi.cpp.fromVariantPre2 : m_mi.cpp.fromJsonPre2;
}
QString cppFromJsonPost() const
{
return m_mi.cpp.fromJsonPost.isNull() ? m_mi.cpp.fromVariantPost : m_mi.cpp.fromJsonPost;
}
MemberInformation info() const
{
return m_mi;
}
private:
const MemberInformation m_mi;
};
class MemberInformationListWrapper : public VariantListWrapper
{
Q_OBJECT
Q_PROPERTY(QVariantList cppMember READ cppMember)
Q_PROPERTY(QVariantList jsonMember READ jsonMember)
Q_PROPERTY(QVariantList fkMember READ fkMember)
Q_PROPERTY(QVariantList selectRemoveMember READ selectRemoveMember)
Q_PROPERTY(QVariantList viewMember READ viewMember)
Q_PROPERTY(MemberInformationWrapper* ddsKey READ ddsKey)
Q_PROPERTY(MemberInformationWrapper* primaryKey READ primaryKey)
public:
explicit MemberInformationListWrapper(const QString& name, const QVector<MemberInformation>& member,
QObject* parent)
: VariantListWrapper(name, parent)
{
for (const MemberInformation& mi : member)
m_member += QVariant::fromValue(new MemberInformationWrapper(mi, this));
}
QVariantList memberByFilter(const std::function<bool(const MemberInformation& mi)>& acceptFilter) const
{
QVariantList vl;
vl.reserve(m_member.size());
for (const QVariant& v : m_member)
{
MemberInformationWrapper* mi = v.value<MemberInformationWrapper*>();
if (mi && acceptFilter(mi->info()))
vl += v;
}
return vl;
}
QVariantList cppMember() const
{
return memberByFilter([](const MemberInformation& mi) { return mi.cpp.usedForCppStruct; });
}
QVariantList jsonMember() const
{
return memberByFilter([](const MemberInformation& mi) { return mi.cpp.usedForJson; });
}
QVariantList fkMember() const
{
return memberByFilter([](const MemberInformation& mi) { return mi.db.isForeignKey; });
}
QVariantList selectRemoveMember() const
{
return memberByFilter([](const MemberInformation& mi) { return mi.db.generateSelectRemove; });
}
QVariantList viewMember() const
{
return memberByFilter([](const MemberInformation& mi) { return mi.db.usedForView; });
}
MemberInformationWrapper* ddsKey() const
{
for (const QVariant& v : m_member)
{
MemberInformationWrapper* mi = v.value<MemberInformationWrapper*>();
if (mi->info().isDdsKey)
return mi;
}
return nullptr;
}
MemberInformationWrapper* primaryKey() const
{
for (const QVariant& v : m_member)
{
MemberInformationWrapper* mi = v.value<MemberInformationWrapper*>();
if (mi->info().db.isPrimaryKey)
return mi;
}
return nullptr;
}
};
class TableWrapper final : public NameWrapper
{
Q_OBJECT
Q_PROPERTY(QVector<MemberInformationWrapper*> member READ member)
Q_PROPERTY(MemberInformationWrapper* serialMember READ serialMember)
Q_PROPERTY(MemberInformationWrapper* baseId READ baseId)
Q_PROPERTY(MemberInformationWrapper* primaryKey READ primaryKey)
public:
explicit TableWrapper(const QString& name, const QVector<MemberInformationWrapper*>& member,
MemberInformationWrapper* serialMember, MemberInformationWrapper* baseId,
MemberInformationWrapper* primaryKey, QObject* parent)
: NameWrapper(name, parent), m_member(member), m_serialMember(serialMember), m_baseId(baseId),
m_primaryKey(primaryKey)
{
}
QVector<MemberInformationWrapper*> member() const
{
return m_member;
}
MemberInformationWrapper* serialMember() const
{
return m_serialMember;
}
MemberInformationWrapper* baseId() const
{
return m_baseId;
}
MemberInformationWrapper* primaryKey() const
{
return m_primaryKey;
}
private:
QVector<MemberInformationWrapper*> m_member;
MemberInformationWrapper* m_serialMember;
MemberInformationWrapper* m_baseId;
MemberInformationWrapper* m_primaryKey;
};
class DbStructWrapper final : public MemberInformationListWrapper
{
Q_OBJECT
Q_PROPERTY(QVariantList insertStructures READ insertStructures)
Q_PROPERTY(QString viewTableName READ viewTableName)
Q_PROPERTY(bool deleteWithoutPkAllowed READ deleteWithoutPkAllowed)
Q_PROPERTY(MemberInformationWrapper* primaryKey READ primaryKey)
Q_PROPERTY(QVariantList dbNotifications READ dbNotifications)
public:
explicit DbStructWrapper(const CompleteStructInformation& csi, QObject* parent)
: MemberInformationListWrapper(csi.structName, csi.member, parent), m_csi(csi)
{
m_dbNotifications.reserve(m_csi.dbNotifications.size());
for (const auto& notification : std::as_const(m_csi.dbNotifications))
m_dbNotifications += QVariant(notification.methodName);
}
MemberInformationWrapper* primaryKey() const
{
for (const QVariant& v : m_member)
{
MemberInformationWrapper* mi = v.value<MemberInformationWrapper*>();
if (mi->info().db.isPrimaryKey && mi->info().db.table == primaryTableName())
return mi;
}
return nullptr;
}
QVariantList insertStructures();
bool deleteWithoutPkAllowed() const
{
return m_csi.tables.size() == 1;
}
QVariantList dbNotifications() const
{
return m_dbNotifications;
}
QString primaryTableName() const
{
return m_csi.primaryTable->name;
}
QString viewTableName() const
{
return (m_csi.tables.size() == 1) ? primaryTableName() : m_csi.viewName;
}
private:
const CompleteStructInformation m_csi;
QVariantList m_dbNotifications;
};
class CustomFunctionWrapper final : public QObject
{
Q_OBJECT
Q_PROPERTY(QString signature READ signature)
public:
explicit CustomFunctionWrapper(const QString& signature, QObject* parent) : QObject(parent), m_signature(signature)
{
}
QString signature() const
{
return m_signature;
}
private:
const QString m_signature;
};
class IdlEnumKeyValueWrapper final : public QObject
{
Q_OBJECT
Q_PROPERTY(QString key READ key)
Q_PROPERTY(int value READ value)
public:
explicit IdlEnumKeyValueWrapper(const EnumKeyValuePair& ekvp, QObject* parent) : QObject(parent), m_ekvp(ekvp) {}
QString key() const
{
return m_ekvp.key;
}
int value() const
{
return m_ekvp.value;
}
private:
const EnumKeyValuePair m_ekvp;
};
class IdlDataWrapper final : public NameWrapper
{
Q_OBJECT
Q_PROPERTY(QString type READ type)
Q_PROPERTY(QString comment READ comment)
Q_PROPERTY(QString isKey READ isKey)
Q_PROPERTY(QString isOptional READ isOptional)
Q_PROPERTY(QString cppType READ cppType)
Q_PROPERTY(QString cppTypeCr READ cppTypeCr)
Q_PROPERTY(QString nameGetter READ nameGetter)
public:
IdlDataWrapper(const IdlData& data, QObject* parent) : NameWrapper(data.name, parent), m_data(data) {}
QString type() const
{
return m_data.dataTypeInfo->idlType();
}
QString comment() const
{
return m_data.comment;
}
QString isKey() const
{
return m_data.isKey ? QStringLiteral(" \t //@key") : QString();
}
QString isOptional() const
{
return m_data.isOptional ? QStringLiteral(" \t //@Optional") : QString();
}
QString cppType() const
{
return m_data.dataTypeInfo->cppType();
}
QString cppTypeCr() const
{
return m_data.dataTypeInfo->cppTypeConstRef();
}
QString nameGetter() const
{
return m_data.name + (m_data.isOptional ? QStringLiteral("().get") : QString());
}
private:
const IdlData m_data;
};
class IdlEnumWrapper final : public VariantListWrapper
{
Q_OBJECT
public:
explicit IdlEnumWrapper(const EnumInformation& ei, QObject* parent) : VariantListWrapper(ei.enumName, parent)
{
m_member.reserve(ei.values.size());
for (const auto& val : ei.values)
m_member += QVariant::fromValue(new IdlEnumKeyValueWrapper(val, this));
}
};
class IdlStructWrapper final : public VariantListWrapper
{
Q_OBJECT
Q_PROPERTY(QString comment READ comment)
Q_PROPERTY(QString baseValueType READ baseValueType)
Q_PROPERTY(QString extensibility READ extensibility)
public:
explicit IdlStructWrapper(const CompleteTopicTypeInformation& ctti, QObject* parent)
: VariantListWrapper(ctti.name, parent), m_ctti(ctti)
{
m_member.reserve(m_ctti.members.size());
for (const auto& val : std::as_const(m_ctti.members))
m_member += QVariant::fromValue(new IdlDataWrapper(val, this));
}
QString comment() const
{
return m_ctti.comment;
}
QString baseValueType() const
{
return m_ctti.baseValueType;
}
QString extensibility() const
{
return extensibility2String(m_ctti.extensibility);
}
private:
const CompleteTopicTypeInformation m_ctti;
#ifdef RTI_HEADER_AVAILABLE
static QString extensibility2String(dds::core::xtypes::ExtensibilityKind extensiblity);
#else
static QString extensibility2String(int extensiblity);
#endif
};
class IdlServiceWrapper final : public QObject
{
Q_OBJECT
Q_PROPERTY(QString svcName READ svcName)
Q_PROPERTY(QString baseFilePath READ baseFilePath)
public:
IdlServiceWrapper(const QString& svcName, const QString& baseFilePath)
: m_svcName(svcName), m_baseFilePath(baseFilePath)
{
}
QString svcName() const
{
return m_svcName;
}
QString baseFilePath() const
{
return m_baseFilePath;
}
private:
const QString m_svcName;
const QString m_baseFilePath;
};
class FunctionTopicWrapper final : public NameWrapper
{
Q_OBJECT
Q_PROPERTY(QString onReply READ onReply)
Q_PROPERTY(QString onRequest READ onRequest)
Q_PROPERTY(QString onError READ onError)
Q_PROPERTY(bool isCoreFt READ isCoreFt)
Q_PROPERTY(bool routeInReplay READ routeInReplay)
Q_PROPERTY(QString reply READ reply)
Q_PROPERTY(QString replyFlc READ replyFlc)
Q_PROPERTY(QString replyHandler READ replyHandler)
Q_PROPERTY(QString replyHandlerFlc READ replyHandlerFlc)
Q_PROPERTY(QString replyType READ replyType)
Q_PROPERTY(QString replyTypeFro READ replyTypeFro)
Q_PROPERTY(QVariantList replyParams READ replyParams)
Q_PROPERTY(QString replyHandlerHash READ replyHandlerHash WRITE setReplyHandlerHash)
Q_PROPERTY(QString request READ request)
Q_PROPERTY(QString requestFlc READ requestFlc)
Q_PROPERTY(QString requestHandler READ requestHandler)
Q_PROPERTY(QString requestHandlerFlc READ requestHandlerFlc)
Q_PROPERTY(QString requestType READ requestType)
Q_PROPERTY(QVariantList requestParams READ requestParams)
public:
FunctionTopicWrapper(const FunctionTopic& ft, const CompleteTopicTypeInformation& siRequest,
const CompleteTopicTypeInformation& siReply, QObject* parent)
: NameWrapper(ft.name, parent), m_ft(ft), m_request(siRequest), m_reply(siReply)
{
}
QString onReply() const
{
return QLatin1String("on") + m_ft.replyTopicName;
}
QString onRequest() const
{
return QLatin1String("on") + m_ft.requestTopicName;
}
QString onError() const
{
return QLatin1String("on") + m_ft.name + QLatin1String("Error");
}
bool isCoreFt() const
{
return (m_ft.replyTopicType == QStringLiteral("Core::FunctionReply") ||
m_ft.replyTopicType == QStringLiteral("FunctionReply"));
}
bool routeInReplay() const
{
return m_ft.routeInReplay;
}
QString reply() const
{
return m_ft.replyTopicName;
}
QString replyFlc() const
{
return StructBuilder::firstCharLowercase(reply());
}
QString replyHandler() const
{
return m_ft.replyTopicName + QLatin1String("Handler");
}
QString replyHandlerFlc() const
{
return StructBuilder::firstCharLowercase(replyHandler());
}
QString replyType() const
{
return m_reply.name;
}
QString replyTypeFro() const
{
return isCoreFt() ? QStringLiteral("Core::FunctionReplyObject") : m_reply.name;
}
QString request() const
{
return m_ft.requestTopicName;
}
QString requestFlc() const
{
return StructBuilder::firstCharLowercase(request());
}
QString requestHandler() const
{
return m_ft.requestTopicName + QLatin1String("Handler");
}
QString requestHandlerFlc() const
{
return StructBuilder::firstCharLowercase(requestHandler());
}
QString requestType() const
{
return m_request.name;
}
void addRequestParams(const QVector<IdlData>& params)
{
for (const auto& param : params)
m_requestParams.push_back(QVariant::fromValue(new IdlDataWrapper(param, this)));
}
QVariantList requestParams() const
{
return m_requestParams;
}
void addReplyParams(const QVector<IdlData>& params)
{
for (const auto& param : params)
m_replyParams.push_back(QVariant::fromValue(new IdlDataWrapper(param, this)));
}
QVariantList replyParams() const
{
return m_replyParams;
}
QString replyHandlerHash() const
{
return m_replyHandlerHash;
}
void setReplyHandlerHash(const QString& hash)
{
m_replyHandlerHash = hash;
}
private:
const FunctionTopic m_ft;
const CompleteTopicTypeInformation m_request;
const CompleteTopicTypeInformation m_reply;
QVariantList m_requestParams;
QVariantList m_replyParams;
QString m_replyHandlerHash;
};
class FunctionTopicsWrapper final : public VariantListWrapper
{
Q_OBJECT
public:
Q_PROPERTY(QVariantList topicsToRouteInReplay READ topicsToRouteInReplay)
using VariantListWrapper::VariantListWrapper;
FunctionTopicWrapper* addFunctionTopic(const FunctionTopic& ft, const CompleteTopicTypeInformation& siRequest,
const CompleteTopicTypeInformation& siReply)
{
FunctionTopicWrapper* ret = new FunctionTopicWrapper(ft, siRequest, siReply, this);
m_member += QVariant::fromValue(ret);
return ret;
}
QVariantList topicsToRouteInReplay() const
{
QVariantList vl;
vl.reserve(m_member.size());
for (const QVariant& v : m_member)
{
FunctionTopicWrapper* ft = v.value<FunctionTopicWrapper*>();
if (ft->routeInReplay())
vl += v;
}
return vl;
}
};
class DataTopicWrapper final : public NameWrapper
{
Q_OBJECT
Q_PROPERTY(QString serviceName READ serviceName)
Q_PROPERTY(QString type READ type)
Q_PROPERTY(QString typeFq READ typeFq)
Q_PROPERTY(QVariant key READ key)
Q_PROPERTY(bool dtcImpl READ dtcImpl)
Q_PROPERTY(bool dtsImpl READ dtsImpl)
Q_PROPERTY(bool recordTopic READ recordTopic)
Q_PROPERTY(QVariant recTable READ recTable)
Q_PROPERTY(QVariantList trColumns READ trColumns)
Q_PROPERTY(bool hasTrColumns READ hasTrColumns)
Q_PROPERTY(bool routeToClient READ routeToClient)
Q_PROPERTY(bool routeToServer READ routeToServer)
Q_PROPERTY(bool routeInReplay READ routeInReplay)
Q_PROPERTY(bool autosubscribe READ isAutoSubscribe)
public:
DataTopicWrapper(const CompleteTopicTypeInformation& ctti, QObject* parent)
: NameWrapper(ctti.name, parent), m_ctti(ctti), m_keyData(nullptr), m_recordData(nullptr)
{
}
void setKeyColumnData(const IdlData& data)
{
delete m_keyData;
m_keyData = new IdlDataWrapper(data, this);
}
void setTrColumns(const QVector<IdlData>& params)
{
for (const auto& param : params)
m_trColumns.push_back(QVariant::fromValue(new IdlDataWrapper(param, this)));
}
QVariantList trColumns() const
{
return m_trColumns;
}
bool hasTrColumns() const
{
return !m_trColumns.empty();
}
void setRecordTableInformation(const CompleteTableInformation& cti)
{
delete m_recordData;
m_recordData = new MemberInformationListWrapper(cti.name, cti.columns, this);
m_ctti.recordTopic = true;
}
QString serviceName() const
{
return m_ctti.serviceName;
}
QString type() const
{
return m_ctti.name;
}
QString typeFq() const;
QVariant key() const
{
return m_keyData ? QVariant::fromValue(m_keyData) : QVariant();
}
bool dtsImpl() const
{
return m_ctti.dtsAutogen;
}
bool dtcImpl() const
{
return m_ctti.dtcAutogen;
}
bool recordTopic() const
{
return m_ctti.recordTopic && m_recordData;
}
bool routeToClient() const
{
return m_ctti.routeToClient;
}
bool routeToServer() const
{
return m_ctti.routeToServer;
}
bool routeInReplay() const
{
return m_ctti.routeInReplay;
}
bool isAutoSubscribe() const
{
return m_ctti.autosubscribe;
}
QVariant recTable() const
{
return recordTopic() ? QVariant::fromValue(m_recordData) : QVariant();
}
private:
CompleteTopicTypeInformation m_ctti;
IdlDataWrapper* m_keyData;
MemberInformationListWrapper* m_recordData;
QVariantList m_trColumns;
};
class DataTopicsWrapper final : public VariantListWrapper
{
Q_OBJECT
public:
Q_PROPERTY(QVariantList topicsToRouteInReplay READ topicsToRouteInReplay)
Q_PROPERTY(QVariantList topicsToRouteToClient READ topicsToRouteToClient)
Q_PROPERTY(QVariantList topicsToRouteToServer READ topicsToRouteToServer)
using VariantListWrapper::VariantListWrapper;
DataTopicWrapper* addDataTopic(const CompleteTopicTypeInformation& ctti)
{
DataTopicWrapper* ret = new DataTopicWrapper(ctti, this);
m_member += QVariant::fromValue(ret);
return ret;
}
QVariantList memberByFilter(const std::function<bool(const DataTopicWrapper* dtw)>& acceptFilter) const
{
QVariantList vl;
vl.reserve(m_member.size());
for (const QVariant& v : m_member)
{
DataTopicWrapper* dtw = v.value<DataTopicWrapper*>();
if (dtw && acceptFilter(dtw))
vl += v;
}
return vl;
}
QVariantList topicsToRouteInReplay() const
{
return memberByFilter([](const DataTopicWrapper* dtw) { return dtw->routeInReplay(); });
}
QVariantList topicsToRouteToClient() const
{
return memberByFilter([](const DataTopicWrapper* dtw) { return dtw->routeToClient(); });
}
QVariantList topicsToRouteToServer() const
{
return memberByFilter([](const DataTopicWrapper* dtw) { return dtw->routeToServer(); });
}
};
class IdlServicesWrapper final : public VariantListWrapper
{
Q_OBJECT
public:
using VariantListWrapper::VariantListWrapper;
void addService(const QString& svcName, const QString& baseFilePath)
{
m_member += QVariant::fromValue(new IdlServiceWrapper(svcName, baseFilePath));
}
};
} // namespace CodeGen