diff options
Diffstat (limited to 'src/tools/ivigenerator/templates_generation_validator/validationstatus.cpp.tpl')
-rw-r--r-- | src/tools/ivigenerator/templates_generation_validator/validationstatus.cpp.tpl | 194 |
1 files changed, 0 insertions, 194 deletions
diff --git a/src/tools/ivigenerator/templates_generation_validator/validationstatus.cpp.tpl b/src/tools/ivigenerator/templates_generation_validator/validationstatus.cpp.tpl deleted file mode 100644 index 0a91693..0000000 --- a/src/tools/ivigenerator/templates_generation_validator/validationstatus.cpp.tpl +++ /dev/null @@ -1,194 +0,0 @@ -{# -# Copyright (C) 2019 Luxoft Sweden AB -# Copyright (C) 2018 Pelagicore AG -# Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). -# Contact: https://www.qt.io/licensing/ -# -# This file is part of the QtIvi module of the Qt Toolkit. -# -# $QT_BEGIN_LICENSE:LGPL-QTAS$ -# Commercial License Usage -# Licensees holding valid commercial Qt Automotive Suite licenses may use -# this file in accordance with the commercial license agreement provided -# with the Software or, alternatively, in accordance with the terms -# contained in a written agreement between you and The Qt Company. For -# licensing terms and conditions see https://www.qt.io/terms-conditions. -# For further information use the contact form at https://www.qt.io/contact-us. -# -# GNU Lesser General Public License Usage -# Alternatively, this file may be used under the terms of the GNU Lesser -# General Public License version 3 as published by the Free Software -# Foundation and appearing in the file LICENSE.LGPL3 included in the -# packaging of this file. Please review the following information to -# ensure the GNU Lesser General Public License version 3 requirements -# will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -# -# GNU General Public License Usage -# Alternatively, this file may be used under the terms of the GNU -# General Public License version 2.0 or (at your option) the GNU General -# Public license version 3 or any later version approved by the KDE Free -# Qt Foundation. The licenses are as published by the Free Software -# Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -# included in the packaging of this file. Please review the following -# information to ensure the GNU General Public License requirements will -# be met: https://www.gnu.org/licenses/gpl-2.0.html and -# https://www.gnu.org/licenses/gpl-3.0.html. -# -# $QT_END_LICENSE$ -# -# SPDX-License-Identifier: LGPL-3.0 -#} -{% include "common/generated_comment.cpp.tpl" %} - -#include "validationstatus.h" - -#include <QJsonDocument> -#include <QJsonObject> -#include <QJsonArray> -#include <QDebug> -#include <QObject> -#include <QMetaProperty> - -QString idlToQtTypeName(const QString& idlTypeName) -{ - QString result = idlTypeName; - if (idlTypeName == QLatin1String("string")) - result = "QString"; - return result; -} - -bool checkProperty(const QMetaProperty& metaProp, const QJsonValue& jValProp, QString& errorMessage) -{ - bool result = true; - QJsonObject jObjProp = jValProp.toObject(); - if (metaProp.name() != jObjProp[QLatin1String("name")].toString()) - return false; - // Anyway it should be readable - if (!metaProp.isReadable()) { - errorMessage += QString("Property %1 is not readable\n").arg(metaProp.name()); - return false; - } - // Writable only if not readonly - if (metaProp.isWritable() && jObjProp[QLatin1String("readonly")].toBool()) { - errorMessage += QString("Property %1 is writable whereas it's defined as read-only\n").arg(metaProp.name()); - return false; - } - // Check the property type as well - QString metaTypeName = metaProp.typeName(); - QString propTypeName = idlToQtTypeName(jObjProp[QLatin1String("type")].toObject()[QLatin1String("name")].toString()); - if (metaTypeName != propTypeName) - return false; - return result; -} - -bool checkMethod(const QMetaMethod& metaOp, const QJsonValue& jValOp, QString& errorMessage) -{ - QJsonObject jObjOp = jValOp.toObject(); - if (metaOp.name() != jObjOp[QLatin1String("name")].toString()) - return false; - - // Check the method parameter types and return type as well - QString metaReturnType = metaOp.typeName(); - QString opReturnType = jObjOp[QLatin1String("type")].toObject()[QLatin1String("name")].toString(); - opReturnType = idlToQtTypeName(opReturnType); - if (metaReturnType != opReturnType) { - return false; - } - QJsonValue jValParams = jObjOp[QLatin1String("parameters")]; - Q_ASSERT(jValParams.isNull() || jValParams.isArray()); - QJsonArray jArrParams = jValParams.toArray(); - if (jArrParams.size() != metaOp.parameterCount()) { - errorMessage += QString("Amount of parameters in method %1 differs from its IDL definition (%2 vs %3)\n") - .arg(metaOp.name().data()) - .arg(metaOp.parameterCount()) - .arg(jArrParams.size()); - return false; - } - - for (int i = 0; i < metaOp.parameterCount(); ++i) { - QString metaParamType = jArrParams[i].toObject()[QLatin1String("type")].toObject()[QLatin1String("name")].toString(); - metaParamType = idlToQtTypeName(metaParamType); - QString genParamType = metaOp.parameterTypes().at(i); - if (genParamType != metaParamType) { - errorMessage += QString("Method %1: %2-th parameter type differs from IDL definition (%3 vs %4)\n") - .arg(metaOp.name().data()) - .arg(i) - .arg(genParamType) - .arg(metaParamType); - return false; - } - } - return true; -} - -bool checkGeneration(QString& errorMessage, QObject& obj) -{ - bool result = true; - auto* metaObj = obj.metaObject(); - int classInfoCount = metaObj->classInfoCount(); - QMetaClassInfo metaClassInfo; - const QString META_INFO_NAME = QLatin1String("IviJson"); - for (int index = 0; index < classInfoCount; ++index) { - metaClassInfo = metaObj->classInfo(index); - if (metaClassInfo.name() == META_INFO_NAME) - break; - } - if (metaClassInfo.name() != META_INFO_NAME) { - return false; - } - QJsonObject metaDoc(QJsonDocument::fromJson(metaClassInfo.value()).object()); - auto jVal = metaDoc[QLatin1String("interfaces")]; - if (jVal.isNull() || !jVal.isArray()) { - errorMessage += QString("Interfaces list is empty in the class meta info"); - return false; - } - - - QJsonArray jArrInterfaces = jVal.toArray(); - QJsonObject jInterface; - for (auto jValInterface : jArrInterfaces) { - Q_ASSERT(jValInterface.isObject()); - if (jValInterface.toObject()[QLatin1String("name")] == QLatin1String(metaObj->className())) { - jInterface = jValInterface.toObject(); - break; - } - } - if (jInterface.empty()) { - errorMessage += QString("Interface %1 is not implemented!\n").arg(metaObj->className()); - return false; - } - - // Check the properties - QJsonValue jValProps = jInterface[QLatin1String("properties")]; - auto jArrProps = jValProps.toArray(); - for (auto jValProp : jArrProps) { - auto propName = jValProp.toObject()[QLatin1String("name")].toString(); - int propIdx = metaObj->indexOfProperty(propName.toLatin1().data()); - if (propIdx == -1) { - errorMessage += QString("Property %1 has been not generated by the generator!\n").arg(propName); - result = false; - } else { - result &= checkProperty(metaObj->property(propIdx), jValProp, errorMessage); - } - } - - // Check the methods - QJsonValue jValOps = jInterface[QLatin1String("operations")]; - auto jArrOps = jValOps.toArray(); - for (auto jValOp : jArrOps) { - bool opFound = false; - QString opName = jValOp.toObject()[QLatin1String("name")].toString(); - for (int i = 0; i < metaObj->methodCount(); ++i) { - if (metaObj->method(i).name() == opName) { - opFound = true; - result &= checkMethod(metaObj->method(i), jValOp, errorMessage); - } - } - if (!opFound) { - errorMessage += QString("Method %1 has been not generated by the generator!").arg(opName); - result = false; - } - } - - return result; -} |