diff options
author | Maximilian Goldstein <max.goldstein@qt.io> | 2020-11-20 13:20:52 +0100 |
---|---|---|
committer | Maximilian Goldstein <max.goldstein@qt.io> | 2020-11-23 10:06:41 +0100 |
commit | 588d624837ae0174139f8db930ad20612463b1dd (patch) | |
tree | 13ef2dba7f6cc9ec4f22fe517c2c16f01db3ad06 /src/qmlcompiler | |
parent | 87533900738d65ad278722b292852c998e987c10 (diff) |
qmltyperegistrar: Expose interface information
Change-Id: Ica3f5c6696542921bc8d399cd46d901ba06f6d83
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/qmlcompiler')
-rw-r--r-- | src/qmlcompiler/qqmljsscope_p.h | 4 | ||||
-rw-r--r-- | src/qmlcompiler/qqmljstypedescriptionreader.cpp | 47 | ||||
-rw-r--r-- | src/qmlcompiler/qqmljstypedescriptionreader_p.h | 3 |
3 files changed, 49 insertions, 5 deletions
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<Export> 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<Export> 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<ExpressionStatement *>(ast->statement); if (!expStmt) { addError(ast->statement->firstSourceLocation(), tr("Expected array of strings after colon.")); - return; + return nullptr; } auto *arrayLit = cast<ArrayPattern *>(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<StringLiteral *>(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<StringLiteral *>(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; |