diff options
author | Jarek Kobus <jaroslaw.kobus@theqtcompany.com> | 2016-07-28 11:45:41 +0200 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@qt.io> | 2016-07-29 14:12:20 +0000 |
commit | 9250d8942709bcf115a19dcda11c6696fa9def7c (patch) | |
tree | c33f2d571f9ed4fe2e5e1309eec507985d7947bd | |
parent | a7d8d62f30f3a48e8aef814d23e2653de87e908a (diff) |
Don't generate properties and getters for sub state machines
Now we have a generic API for it.
Change-Id: I5e48f52b9d27ba3913db92ba238d64a732bb1bd8
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
-rw-r--r-- | src/scxml/qscxmlparser.cpp | 41 | ||||
-rw-r--r-- | src/scxml/qscxmlstatemachine.cpp | 10 | ||||
-rw-r--r-- | src/scxml/qscxmlstatemachine_p.h | 1 | ||||
-rw-r--r-- | src/scxml/qscxmltabledata.cpp | 7 | ||||
-rw-r--r-- | src/scxml/qscxmltabledata_p.h | 1 | ||||
-rw-r--r-- | tests/auto/compiled/tst_compiled.cpp | 10 | ||||
-rw-r--r-- | tools/qscxmlc/scxmlcppdumper.cpp | 67 |
7 files changed, 10 insertions, 127 deletions
diff --git a/src/scxml/qscxmlparser.cpp b/src/scxml/qscxmlparser.cpp index e760621..c38e79b 100644 --- a/src/scxml/qscxmlparser.cpp +++ b/src/scxml/qscxmlparser.cpp @@ -830,24 +830,13 @@ private: _t->submitEvent(event, QVariant()); } } else if (_c == QMetaObject::RegisterPropertyMetaType) { - DynamicStateMachine *_t = static_cast<DynamicStateMachine *>(_o); - if (_id < _t->m_firstSubStateMachineProperty) { - *reinterpret_cast<int*>(_a[0]) = qRegisterMetaType<bool>(); - } else { - *reinterpret_cast<int*>(_a[0]) = qRegisterMetaType<QScxmlStateMachine *>(); - } + *reinterpret_cast<int*>(_a[0]) = qRegisterMetaType<bool>(); } else if (_c == QMetaObject::ReadProperty) { DynamicStateMachine *_t = static_cast<DynamicStateMachine *>(_o); void *_v = _a[0]; if (_id >= 0 && _id < _t->m_propertyCount) { - if (_id < _t->m_firstSubStateMachineProperty) { - // getter for the state - *reinterpret_cast<bool*>(_v) = _t->isActive(_id); - } else { - // getter for a child statemachine - int idx = _id - _t->m_firstSubStateMachineProperty; - *reinterpret_cast<QScxmlStateMachine **>(_v) = _t->subStateMachine(idx); - } + // getter for the state + *reinterpret_cast<bool*>(_v) = _t->isActive(_id); } } } @@ -857,10 +846,8 @@ private: DynamicStateMachine() : QScxmlStateMachine(*new DynamicStateMachinePrivate) , m_propertyCount(0) - , m_firstSubStateMachineSignal(0) , m_firstSlot(0) , m_firstSlotWithoutData(0) - , m_firstSubStateMachineProperty(0) { // Temporarily wire up the QMetaObject Q_D(DynamicStateMachine); @@ -897,14 +884,6 @@ private: signalBuilder.setParameterNames(init("active")); } - m_firstSubStateMachineSignal = info.stateNames.size(); - foreach (const QString &machineName, info.subStateMachineNames) { - auto name = machineName.toUtf8(); - const QByteArray signalName = name + "Changed(QScxmlStateMachine *)"; - QMetaMethodBuilder signalBuilder = b.addSignal(signalName); - signalBuilder.setParameterNames(init("statemachine")); - } - foreach (const QString &eventName, info.outgoingEvents) { const QByteArray signalName = eventName.toUtf8() + "(const QVariant &)"; QMetaMethodBuilder signalBuilder = b.addSignal(signalName); @@ -912,8 +891,7 @@ private: } // slots - m_firstSlot = info.stateNames.size() + info.subStateMachineNames.size() - + info.outgoingEvents.size(); + m_firstSlot = info.stateNames.size() + info.outgoingEvents.size(); foreach (const QString &eventName, info.incomingEvents) { const QByteArray slotName = eventName.toUtf8() + "(const QVariant &)"; QMetaMethodBuilder slotBuilder = b.addSlot(slotName); @@ -935,15 +913,6 @@ private: ++notifier; } - m_firstSubStateMachineProperty = m_propertyCount; - foreach (const QString &machineName, info.subStateMachineNames) { - QMetaPropertyBuilder prop = b.addProperty(machineName.toUtf8(), "QScxmlStateMachine *", - notifier); - prop.setWritable(false); - ++m_propertyCount; - ++notifier; - } - // And we're done d->m_metaObject = b.toMetaObject(); } @@ -1022,10 +991,8 @@ private: QStringList m_incomingEvents; QStringList m_outgoingEvents; int m_propertyCount; - int m_firstSubStateMachineSignal; int m_firstSlot; int m_firstSlotWithoutData; - int m_firstSubStateMachineProperty; }; inline QScxmlInvokableService *InvokeDynamicScxmlFactory::invoke(QScxmlStateMachine *parent) diff --git a/src/scxml/qscxmlstatemachine.cpp b/src/scxml/qscxmlstatemachine.cpp index 5a70c40..cd89315 100644 --- a/src/scxml/qscxmlstatemachine.cpp +++ b/src/scxml/qscxmlstatemachine.cpp @@ -335,7 +335,6 @@ void QScxmlStateMachinePrivate::addService(int invokingState) continue; // service failed to start const QString serviceName = service->name(); m_invokedServices[size_t(id)] = { invokingState, service, serviceName }; - emitServiceChanged(id, service); service->start(); } emitRunningSubStateMachinesChanged(); @@ -353,7 +352,6 @@ void QScxmlStateMachinePrivate::removeService(int invokingState) if (it.invokingState == invokingState && service != nullptr) { it.service = nullptr; delete service; - emitServiceChanged(int(i), nullptr); } } emitRunningSubStateMachinesChanged(); @@ -590,14 +588,6 @@ void QScxmlStateMachinePrivate::emitStateActive(int stateIndex, bool active) QMetaObject::activate(q, m_metaObject, stateIndex, args); } -void QScxmlStateMachinePrivate::emitServiceChanged(int machineIndex, - QScxmlInvokableService *service) -{ - Q_Q(QScxmlStateMachine); - void *args[] = { Q_NULLPTR, const_cast<void*>(reinterpret_cast<const void*>(&service)) }; - QMetaObject::activate(q, m_metaObject, machineIndex + m_stateTable->stateCount, args); -} - void QScxmlStateMachinePrivate::emitRunningSubStateMachinesChanged() { Q_Q(QScxmlStateMachine); diff --git a/src/scxml/qscxmlstatemachine_p.h b/src/scxml/qscxmlstatemachine_p.h index 41cf0a0..1e11561 100644 --- a/src/scxml/qscxmlstatemachine_p.h +++ b/src/scxml/qscxmlstatemachine_p.h @@ -259,7 +259,6 @@ public: void resetEvent(); void emitStateActive(int stateIndex, bool active); - void emitServiceChanged(int machineIndex, QScxmlInvokableService *service); void emitRunningSubStateMachinesChanged(); void emitSignalForEvent(int signalIndex, const QVariant &data); diff --git a/src/scxml/qscxmltabledata.cpp b/src/scxml/qscxmltabledata.cpp index 33f3103..d92d64c 100644 --- a/src/scxml/qscxmltabledata.cpp +++ b/src/scxml/qscxmltabledata.cpp @@ -66,7 +66,6 @@ public: , m_dataIds(tableData.theDataNameIds) , m_outgoingEvents(metaDataInfo.outgoingEvents) , m_stateNames(metaDataInfo.stateNames) - , m_subStateMachineNames(metaDataInfo.subStateMachineNames) , m_incomingEvents(metaDataInfo.incomingEvents) { @@ -285,11 +284,6 @@ protected: // visitor Q_ASSERT(factoryId >= 0); factoryIds.append(factoryId); m_stateTable.maxServiceId = std::max(m_stateTable.maxServiceId, factoryId); - if (invoke->content && invoke->content->root) { - QString name = invoke->content->root->name; - if (!name.isEmpty()) - m_subStateMachineNames.add(name); - } } addArray(&newState.serviceFactoryIds, factoryIds); } @@ -900,7 +894,6 @@ private: QVector<DocumentModel::DataElement *> m_dataElements; Table<QStringList, QString, int> m_outgoingEvents; Table<QStringList, QString, int> m_stateNames; - Table<QStringList, QString, int> m_subStateMachineNames; Table<QStringList, QString, int> m_incomingEvents; }; diff --git a/src/scxml/qscxmltabledata_p.h b/src/scxml/qscxmltabledata_p.h index 85d3145..aaf53ba 100644 --- a/src/scxml/qscxmltabledata_p.h +++ b/src/scxml/qscxmltabledata_p.h @@ -85,7 +85,6 @@ public: struct MetaDataInfo { QStringList outgoingEvents; QStringList stateNames; - QStringList subStateMachineNames; QStringList incomingEvents; }; diff --git a/tests/auto/compiled/tst_compiled.cpp b/tests/auto/compiled/tst_compiled.cpp index 117f2d9..0be848c 100644 --- a/tests/auto/compiled/tst_compiled.cpp +++ b/tests/auto/compiled/tst_compiled.cpp @@ -103,10 +103,12 @@ void tst_Compiled::nullDataInit() void tst_Compiled::subMachineUnicodeName() { Directions1 directions; - QVERIFY(directions.init()); - QVariant prop = directions.property("änywhere"); - QVERIFY(!prop.isNull()); - QVERIFY(prop.isValid()); + QSignalSpy stableStateSpy(&directions, SIGNAL(reachedStableState())); + directions.start(); + stableStateSpy.wait(5000); + QScxmlStateMachine *subMachine = directions.runningSubStateMachines().value(0); + QVERIFY(subMachine); + QCOMPARE(subMachine->name(), QString("änywhere")); } void tst_Compiled::unicodeEventName() diff --git a/tools/qscxmlc/scxmlcppdumper.cpp b/tools/qscxmlc/scxmlcppdumper.cpp index 76456cf..4fb8251 100644 --- a/tools/qscxmlc/scxmlcppdumper.cpp +++ b/tools/qscxmlc/scxmlcppdumper.cpp @@ -739,15 +739,6 @@ QString CppDumper::generatePropertyDecls(const GeneratedTableData::MetaDataInfo namespacePrefix = QStringLiteral("::%1").arg(m_translationUnit->namespaceName); } - foreach (const QString &machineName, info.subStateMachineNames) { - if (!machineName.isEmpty()) { - const QString decl = QString::fromLatin1( - qtMode ? " Q_PROPERTY(%1::%2 *%3 READ %2 NOTIFY %2Changed)\n" : - " Q_PROPERTY(%1::%2 *%3 NOTIFY %2Changed)\n"); - decls += decl.arg(namespacePrefix, mangleIdentifier(machineName), machineName); - } - } - return decls; } @@ -760,11 +751,6 @@ QString CppDumper::generateSignalDecls(const GeneratedTableData::MetaDataInfo &i .arg(mangleIdentifier(stateName)); } - foreach (const QString &machineName, info.subStateMachineNames) { - decls += QStringLiteral(" void %1Changed(QScxmlStateMachine *stateMachine);\n") - .arg(mangleIdentifier(machineName)); - } - foreach (const QString &eventName, info.outgoingEvents) { decls += QStringLiteral(" void %1(const QVariant &data);\n") .arg(mangleIdentifier(eventName)); @@ -813,11 +799,6 @@ QString CppDumper::generateGetterDecls(const GeneratedTableData::MetaDataInfo &i decls += QStringLiteral(" bool %1() const;\n").arg(mangleIdentifier(stateName)); } - foreach (const QString &machineName, info.subStateMachineNames) { - decls += QStringLiteral(" QScxmlStateMachine *%1() const;\n") - .arg(mangleIdentifier(machineName)); - } - return decls; } @@ -833,14 +814,6 @@ QString CppDumper::generateGetterDefs(const QString &className, ++stateIndex; } - int machineIndex = 0; - foreach (const QString &machineName, info.subStateMachineNames) { - defs += QStringLiteral("QScxmlStateMachine *%1::%2() const\n") - .arg(className, mangleIdentifier(machineName)); - defs += QStringLiteral("{ return subStateMachine(%1); }\n\n").arg(machineIndex); - ++machineIndex; - } - return defs; } @@ -896,46 +869,6 @@ QString CppDumper::generateMetaObject(const QString &className, // sub-statemachines: QHash<QByteArray, QByteArray> knownQObjectClasses; knownQObjectClasses.insert(QByteArray("QScxmlStateMachine"), QByteArray()); - int machineIdx = 0; - for (const auto &service : info.subStateMachineNames) { - const auto serviceName = service; - const QString fqServiceClass = QStringLiteral("QScxmlStateMachine"); - const QByteArray serviceClass = fqServiceClass.toUtf8(); - knownQObjectClasses.insert(serviceClass, ""); - - const QByteArray mangledServiceName = mangleIdentifier(serviceName).toUtf8(); - - FunctionDef signal; - signal.type.name = "void"; - signal.type.rawName = signal.type.name; - signal.normalizedType = signal.type.name; - signal.name = mangledServiceName + "Changed"; - signal.access = FunctionDef::Private; - signal.isSignal = true; - if (!m_qtMode) { - signal.implementation = "QMetaObject::activate(_o, &staticMetaObject, %d, _a);"; - } - ArgumentDef arg; - arg.type.name = serviceClass + " *"; - arg.type.rawName = arg.type.name; - arg.type.referenceType = Type::Pointer; - arg.normalizedType = serviceClass + "*(*)"; - arg.name = "statemachine"; - arg.typeNameForCast = arg.type.name + "*"; - signal.arguments << arg; - classDef.signalList << signal; - - ++classDef.notifyableProperties; - PropertyDef prop; - prop.name = serviceName.toUtf8(); - prop.type = serviceClass + "*"; - prop.read = "subStateMachine(" + QByteArray::number(machineIdx++) + ")"; - prop.notify = mangledServiceName + "Changed"; - prop.notifyId = classDef.signalList.size() - 1; - prop.gspec = PropertyDef::ValueSpec; - prop.scriptable = "true"; - classDef.propertyList << prop; - } // Event signals: foreach (const QString &signalName, info.outgoingEvents) { |