Clean up pragma singleton handling in the type loader
Get rid of the m_isSingleton boolean by checking the CompiledData::Unit::flags after the type compilation. This is more compact and makes the singleton type checks independent from the IR. Change-Id: I04189d284e6ea275ac8540918836b641914e7588 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
parent
e88500ff25
commit
7c8441fece
|
@ -1284,7 +1284,7 @@ void QQmlTypeLoader::shutdownThread()
|
|||
}
|
||||
|
||||
QQmlTypeLoader::Blob::Blob(const QUrl &url, QQmlDataBlob::Type type, QQmlTypeLoader *loader)
|
||||
: QQmlDataBlob(url, type, loader), m_importCache(loader), m_isSingleton(false)
|
||||
: QQmlDataBlob(url, type, loader), m_importCache(loader)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -1448,51 +1448,6 @@ bool QQmlTypeLoader::Blob::addImport(const QV4::CompiledData::Import *import, QL
|
|||
return true;
|
||||
}
|
||||
|
||||
bool QQmlTypeLoader::Blob::addPragma(const QmlIR::Pragma &pragma, QList<QQmlError> *errors)
|
||||
{
|
||||
Q_ASSERT(errors);
|
||||
|
||||
if (pragma.type == QmlIR::Pragma::PragmaSingleton) {
|
||||
QUrl myUrl = finalUrl();
|
||||
|
||||
QQmlType *ret = QQmlMetaType::qmlType(myUrl, true);
|
||||
if (!ret) {
|
||||
QQmlError error;
|
||||
error.setDescription(QQmlTypeLoader::tr("No matching type found, pragma Singleton files cannot be used by QQmlComponent."));
|
||||
error.setUrl(myUrl);
|
||||
error.setLine(pragma.location.line);
|
||||
error.setColumn(pragma.location.column);
|
||||
errors->prepend(error);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!ret->isCompositeSingleton()) {
|
||||
QQmlError error;
|
||||
error.setDescription(QQmlTypeLoader::tr("pragma Singleton used with a non composite singleton type %1").arg(ret->qmlTypeName()));
|
||||
error.setUrl(myUrl);
|
||||
error.setLine(pragma.location.line);
|
||||
error.setColumn(pragma.location.column);
|
||||
errors->prepend(error);
|
||||
return false;
|
||||
}
|
||||
// This flag is used for error checking when a qmldir file marks a type as
|
||||
// composite singleton, but there is no pragma Singleton defined in QML.
|
||||
m_isSingleton = true;
|
||||
} else {
|
||||
QQmlError error;
|
||||
error.setDescription(QLatin1String("Invalid pragma"));
|
||||
error.setUrl(finalUrl());
|
||||
error.setLine(pragma.location.line);
|
||||
error.setColumn(pragma.location.column);
|
||||
errors->prepend(error);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void QQmlTypeLoader::Blob::dependencyError(QQmlDataBlob *blob)
|
||||
{
|
||||
if (blob->type() == QQmlDataBlob::QmldirFile) {
|
||||
|
@ -2121,18 +2076,36 @@ void QQmlTypeData::done()
|
|||
}
|
||||
}
|
||||
|
||||
// If the type is CompositeSingleton but there was no pragma Singleton in the
|
||||
// QML file, lets report an error.
|
||||
QQmlType *type = QQmlMetaType::qmlType(url(), true);
|
||||
if (!isError() && type && type->isCompositeSingleton() && !m_isSingleton) {
|
||||
QString typeName = type->qmlTypeName();
|
||||
setError(QQmlTypeLoader::tr("qmldir defines type as singleton, but no pragma Singleton found in type %1.").arg(typeName));
|
||||
}
|
||||
|
||||
// Compile component
|
||||
if (!isError())
|
||||
compile();
|
||||
|
||||
if (!isError()) {
|
||||
QQmlType *type = QQmlMetaType::qmlType(finalUrl(), true);
|
||||
if (m_compiledData && m_compiledData->data->flags & QV4::CompiledData::Unit::IsSingleton) {
|
||||
if (!type) {
|
||||
QQmlError error;
|
||||
error.setDescription(QQmlTypeLoader::tr("No matching type found, pragma Singleton files cannot be used by QQmlComponent."));
|
||||
setError(error);
|
||||
} else if (!type->isCompositeSingleton()) {
|
||||
QQmlError error;
|
||||
error.setDescription(QQmlTypeLoader::tr("pragma Singleton used with a non composite singleton type %1").arg(type->qmlTypeName()));
|
||||
setError(error);
|
||||
}
|
||||
} else {
|
||||
// If the type is CompositeSingleton but there was no pragma Singleton in the
|
||||
// QML file, lets report an error.
|
||||
if (type && type->isCompositeSingleton()) {
|
||||
QString typeName = type->qmlTypeName();
|
||||
setError(QQmlTypeLoader::tr("qmldir defines type as singleton, but no pragma Singleton found in type %1.").arg(typeName));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isError()) {
|
||||
m_compiledData = nullptr;
|
||||
}
|
||||
|
||||
m_document.reset();
|
||||
m_typeReferences.clear();
|
||||
m_implicitImport = 0;
|
||||
|
@ -2248,14 +2221,6 @@ void QQmlTypeData::continueLoadFromIR()
|
|||
return;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (QmlIR::Pragma *pragma, m_document->pragmas) {
|
||||
if (!addPragma(*pragma, &errors)) {
|
||||
Q_ASSERT(errors.size());
|
||||
setError(errors);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QQmlTypeData::allDependenciesDone()
|
||||
|
|
|
@ -232,7 +232,6 @@ public:
|
|||
|
||||
protected:
|
||||
bool addImport(const QV4::CompiledData::Import *import, QList<QQmlError> *errors);
|
||||
bool addPragma(const QmlIR::Pragma &pragma, QList<QQmlError> *errors);
|
||||
|
||||
bool fetchQmldir(const QUrl &url, const QV4::CompiledData::Import *import, int priority, QList<QQmlError> *errors);
|
||||
bool updateQmldir(QQmlQmldirData *data, const QV4::CompiledData::Import *import, QList<QQmlError> *errors);
|
||||
|
@ -249,7 +248,6 @@ public:
|
|||
virtual QString stringAt(int) const { return QString(); }
|
||||
|
||||
QQmlImports m_importCache;
|
||||
bool m_isSingleton;
|
||||
QHash<const QV4::CompiledData::Import*, int> m_unresolvedImports;
|
||||
QList<QQmlQmldirData *> m_qmldirs;
|
||||
};
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
5:5:Type RegisteredCompositeType unavailable
|
||||
2:1:pragma Singleton used with a non composite singleton type CompositeSingletonTest/RegisteredCompositeType
|
||||
-1:-1:pragma Singleton used with a non composite singleton type CompositeSingletonTest/RegisteredCompositeType
|
||||
|
|
|
@ -1 +1 @@
|
|||
2:1:No matching type found, pragma Singleton files cannot be used by QQmlComponent.
|
||||
-1:-1:No matching type found, pragma Singleton files cannot be used by QQmlComponent.
|
||||
|
|
Loading…
Reference in New Issue