From 588d624837ae0174139f8db930ad20612463b1dd Mon Sep 17 00:00:00 2001 From: Maximilian Goldstein Date: Fri, 20 Nov 2020 13:20:52 +0100 Subject: qmltyperegistrar: Expose interface information Change-Id: Ica3f5c6696542921bc8d399cd46d901ba06f6d83 Reviewed-by: Ulf Hermann --- src/qmlcompiler/qqmljsscope_p.h | 4 +++ src/qmlcompiler/qqmljstypedescriptionreader.cpp | 47 ++++++++++++++++++++++--- src/qmlcompiler/qqmljstypedescriptionreader_p.h | 3 ++ 3 files changed, 49 insertions(+), 5 deletions(-) (limited to 'src/qmlcompiler') diff --git a/src/qmlcompiler/qqmljsscope_p.h b/src/qmlcompiler/qqmljsscope_p.h index de6ea58906..0801e6eb7e 100644 --- a/src/qmlcompiler/qqmljsscope_p.h +++ b/src/qmlcompiler/qqmljsscope_p.h @@ -185,6 +185,9 @@ public: void addExport(const QString &name, const QString &package, const QTypeRevision &version); QList exports() const { return m_exports; } + void setInterfaceNames(const QStringList& interfaces) { m_interfaceNames = interfaces; } + QStringList interfaceNames() { return m_interfaceNames; } + // If isComposite(), this is the QML/JS name of the prototype. Otherwise it's the // relevant base class (in the hierarchy starting from QObject) of a C++ type. void setBaseTypeName(const QString &baseTypeName) { m_baseTypeName = baseTypeName; } @@ -272,6 +275,7 @@ private: ScopeType m_scopeType = QMLScope; QList m_exports; + QStringList m_interfaceNames; QString m_defaultPropertyName; QString m_attachedTypeName; diff --git a/src/qmlcompiler/qqmljstypedescriptionreader.cpp b/src/qmlcompiler/qqmljstypedescriptionreader.cpp index 8bdfd89370..6f474bbe10 100644 --- a/src/qmlcompiler/qqmljstypedescriptionreader.cpp +++ b/src/qmlcompiler/qqmljstypedescriptionreader.cpp @@ -220,6 +220,8 @@ void QQmlJSTypeDescriptionReader::readComponent(UiObjectDefinition *ast) scope->setDefaultPropertyName(readStringBinding(script)); } else if (name == QLatin1String("exports")) { readExports(script, scope); + } else if (name == QLatin1String("interfaces")) { + readInterfaces(script, scope); } else if (name == QLatin1String("exportMetaObjectRevisions")) { readMetaObjectRevisions(script, scope); } else if (name == QLatin1String("attachedType")) { @@ -249,7 +251,7 @@ void QQmlJSTypeDescriptionReader::readComponent(UiObjectDefinition *ast) } else { addWarning(script->firstSourceLocation(), tr("Expected only name, prototype, defaultProperty, attachedType, " - "valueType, exports, isSingleton, isCreatable, isComposite and " + "valueType, exports, interfaces, isSingleton, isCreatable, isComposite and " "exportMetaObjectRevisions script bindings, not \"%1\".").arg(name)); } } else { @@ -551,35 +553,47 @@ int QQmlJSTypeDescriptionReader::readIntBinding(UiScriptBinding *ast) return i; } -void QQmlJSTypeDescriptionReader::readExports(UiScriptBinding *ast, const QQmlJSScope::Ptr &scope) +ArrayPattern* QQmlJSTypeDescriptionReader::getArray(UiScriptBinding *ast) { Q_ASSERT(ast); if (!ast->statement) { addError(ast->colonToken, tr("Expected array of strings after colon.")); - return; + return nullptr; } auto *expStmt = cast(ast->statement); if (!expStmt) { addError(ast->statement->firstSourceLocation(), tr("Expected array of strings after colon.")); - return; + return nullptr; } auto *arrayLit = cast(expStmt->expression); if (!arrayLit) { addError(expStmt->firstSourceLocation(), tr("Expected array of strings after colon.")); - return; + return nullptr; } + return arrayLit; +} + +void QQmlJSTypeDescriptionReader::readExports(UiScriptBinding *ast, const QQmlJSScope::Ptr &scope) +{ + auto *arrayLit = getArray(ast); + + if (!arrayLit) + return; + for (PatternElementList *it = arrayLit->elements; it; it = it->next) { auto *stringLit = cast(it->element->initializer); + if (!stringLit) { addError(arrayLit->firstSourceLocation(), tr("Expected array literal with only string literal members.")); return; } + QString exp = stringLit->value.toString(); int slashIdx = exp.indexOf(QLatin1Char('/')); int spaceIdx = exp.indexOf(QLatin1Char(' ')); @@ -601,6 +615,29 @@ void QQmlJSTypeDescriptionReader::readExports(UiScriptBinding *ast, const QQmlJS } } +void QQmlJSTypeDescriptionReader::readInterfaces(UiScriptBinding *ast, const QQmlJSScope::Ptr &scope) +{ + auto *arrayLit = getArray(ast); + + if (!arrayLit) + return; + + QStringList list; + + for (PatternElementList *it = arrayLit->elements; it; it = it->next) { + auto *stringLit = cast(it->element->initializer); + if (!stringLit) { + addError(arrayLit->firstSourceLocation(), + tr("Expected array literal with only string literal members.")); + return; + } + + list << stringLit->value.toString(); + } + + scope->setInterfaceNames(list); +} + void QQmlJSTypeDescriptionReader::readMetaObjectRevisions(UiScriptBinding *ast, const QQmlJSScope::Ptr &scope) { diff --git a/src/qmlcompiler/qqmljstypedescriptionreader_p.h b/src/qmlcompiler/qqmljstypedescriptionreader_p.h index 770a53f01d..f99cda0605 100644 --- a/src/qmlcompiler/qqmljstypedescriptionreader_p.h +++ b/src/qmlcompiler/qqmljstypedescriptionreader_p.h @@ -80,12 +80,15 @@ private: QTypeRevision readNumericVersionBinding(QQmlJS::AST::UiScriptBinding *ast); int readIntBinding(QQmlJS::AST::UiScriptBinding *ast); void readExports(QQmlJS::AST::UiScriptBinding *ast, const QQmlJSScope::Ptr &scope); + void readInterfaces(QQmlJS::AST::UiScriptBinding *ast, const QQmlJSScope::Ptr &scope); void readMetaObjectRevisions(QQmlJS::AST::UiScriptBinding *ast, const QQmlJSScope::Ptr &scope); void readEnumValues(QQmlJS::AST::UiScriptBinding *ast, QQmlJSMetaEnum *metaEnum); void addError(const QQmlJS::SourceLocation &loc, const QString &message); void addWarning(const QQmlJS::SourceLocation &loc, const QString &message); + QQmlJS::AST::ArrayPattern *getArray(QQmlJS::AST::UiScriptBinding *ast); + QString m_fileName; QString m_source; QString m_errorMessage; -- cgit v1.2.3