aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlcompiler
diff options
context:
space:
mode:
authorMaximilian Goldstein <max.goldstein@qt.io>2020-11-20 13:20:52 +0100
committerMaximilian Goldstein <max.goldstein@qt.io>2020-11-23 10:06:41 +0100
commit588d624837ae0174139f8db930ad20612463b1dd (patch)
tree13ef2dba7f6cc9ec4f22fe517c2c16f01db3ad06 /src/qmlcompiler
parent87533900738d65ad278722b292852c998e987c10 (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.h4
-rw-r--r--src/qmlcompiler/qqmljstypedescriptionreader.cpp47
-rw-r--r--src/qmlcompiler/qqmljstypedescriptionreader_p.h3
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;