From 7082d2a89bf94733df7c4913813086a386425117 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 6 Sep 2023 10:28:36 +0200 Subject: [PATCH] QmlJS: Delay loading of default QML type descriptions We definitely do not need to do this during startup of Qt Creator, delay to first use. Change-Id: I5942b5346aedc3d6b677918ad28a6c2924d09493 Reviewed-by: Ulf Hermann --- src/libs/qmljs/qmljsinterpreter.cpp | 28 +++++++++++++++++-- src/libs/qmljs/qmljsinterpreter.h | 6 ++-- src/libs/qmljs/qmljslink.cpp | 4 +-- src/libs/qmljs/qmljsmodelmanagerinterface.cpp | 7 +++-- src/plugins/qmljstools/qmljsmodelmanager.cpp | 2 +- tests/auto/qml/codemodel/check/tst_check.cpp | 3 +- .../qmldesigner/coretests/tst_testcore.cpp | 3 +- 7 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index 7a2cd6fa717..63e009607b9 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -1321,10 +1321,32 @@ const Function *Function::asFunction() const // typing environment //////////////////////////////////////////////////////////////////////////////// -CppQmlTypesLoader::BuiltinObjects CppQmlTypesLoader::defaultLibraryObjects; -CppQmlTypesLoader::BuiltinObjects CppQmlTypesLoader::defaultQtObjects; +CppQmlTypesLoader::BuiltinObjects sDefaultLibraryObjects; +CppQmlTypesLoader::BuiltinObjects sDefaultQtObjects; +std::function CppQmlTypesLoader::defaultObjectsInitializer; -CppQmlTypesLoader::BuiltinObjects CppQmlTypesLoader::loadQmlTypes(const QFileInfoList &qmlTypeFiles, QStringList *errors, QStringList *warnings) +CppQmlTypesLoader::BuiltinObjects &CppQmlTypesLoader::defaultQtObjects() +{ + if (defaultObjectsInitializer) { + const std::function init = defaultObjectsInitializer; + defaultObjectsInitializer = {}; + init(); + } + return sDefaultLibraryObjects; +} +CppQmlTypesLoader::BuiltinObjects &CppQmlTypesLoader::defaultLibraryObjects() +{ + if (defaultObjectsInitializer) { + const std::function init = defaultObjectsInitializer; + defaultObjectsInitializer = {}; + init(); + } + return sDefaultQtObjects; +} + +CppQmlTypesLoader::BuiltinObjects CppQmlTypesLoader::loadQmlTypes(const QFileInfoList &qmlTypeFiles, + QStringList *errors, + QStringList *warnings) { QHash newObjects; QStringList newDependencies; diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index c0a953d7bd8..8574e37febe 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -689,8 +689,8 @@ public: static BuiltinObjects loadQmlTypes(const QFileInfoList &qmltypesFiles, QStringList *errors, QStringList *warnings); - static BuiltinObjects defaultQtObjects; - static BuiltinObjects defaultLibraryObjects; + static BuiltinObjects &defaultQtObjects(); + static BuiltinObjects &defaultLibraryObjects(); // parses the contents of a qmltypes file and fills the newObjects map static void parseQmlTypeDescriptions(const QByteArray &contents, @@ -700,6 +700,8 @@ public: QString *errorMessage, QString *warningMessage, const QString &fileName); + + static std::function defaultObjectsInitializer; }; class QMLJS_EXPORT FakeMetaObjectWithOrigin diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp index 7b99eb65de8..7a34fbaa10d 100644 --- a/src/libs/qmljs/qmljslink.cpp +++ b/src/libs/qmljs/qmljslink.cpp @@ -196,12 +196,12 @@ Context::ImportsPerDocument LinkPrivate::linkImports() m_valueOwner->cppQmlTypes().load(QLatin1String(""), m_builtins.metaObjects()); } else { m_valueOwner->cppQmlTypes().load(QLatin1String(""), - CppQmlTypesLoader::defaultQtObjects); + CppQmlTypesLoader::defaultQtObjects()); } // load library objects shipped with Creator m_valueOwner->cppQmlTypes().load(QLatin1String(""), - CppQmlTypesLoader::defaultLibraryObjects); + CppQmlTypesLoader::defaultLibraryObjects()); if (document) { // do it on document first, to make sure import errors are shown diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp index 8cdcb1e886a..fb0c806fe60 100644 --- a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp +++ b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp @@ -279,8 +279,9 @@ void ModelManagerInterface::loadQmlTypeDescriptionsInternal(const QString &resou if (qmlTypesFiles.at(i).baseName() == QLatin1String("builtins")) { QFileInfoList list; list.append(qmlTypesFiles.at(i)); - CppQmlTypesLoader::defaultQtObjects = - CppQmlTypesLoader::loadQmlTypes(list, &errors, &warnings); + CppQmlTypesLoader::defaultQtObjects() = CppQmlTypesLoader::loadQmlTypes(list, + &errors, + &warnings); qmlTypesFiles.removeAt(i); break; } @@ -290,7 +291,7 @@ void ModelManagerInterface::loadQmlTypeDescriptionsInternal(const QString &resou const CppQmlTypesLoader::BuiltinObjects objs = CppQmlTypesLoader::loadQmlTypes(qmlTypesFiles, &errors, &warnings); for (auto it = objs.cbegin(); it != objs.cend(); ++it) - CppQmlTypesLoader::defaultLibraryObjects.insert(it.key(), it.value()); + CppQmlTypesLoader::defaultLibraryObjects().insert(it.key(), it.value()); for (const QString &error : std::as_const(errors)) writeMessageInternal(error); diff --git a/src/plugins/qmljstools/qmljsmodelmanager.cpp b/src/plugins/qmljstools/qmljsmodelmanager.cpp index 7ee672c99d8..c472fdcf795 100644 --- a/src/plugins/qmljstools/qmljsmodelmanager.cpp +++ b/src/plugins/qmljstools/qmljsmodelmanager.cpp @@ -261,7 +261,7 @@ QHash ModelManager::languageForSuffix() const ModelManager::ModelManager() { qRegisterMetaType("QmlJSTools::SemanticInfo"); - loadDefaultQmlTypeDescriptions(); + CppQmlTypesLoader::defaultObjectsInitializer = [this] { loadDefaultQmlTypeDescriptions(); }; } ModelManager::~ModelManager() = default; diff --git a/tests/auto/qml/codemodel/check/tst_check.cpp b/tests/auto/qml/codemodel/check/tst_check.cpp index befb363ae4c..611f2cefd94 100644 --- a/tests/auto/qml/codemodel/check/tst_check.cpp +++ b/tests/auto/qml/codemodel/check/tst_check.cpp @@ -64,7 +64,8 @@ void tst_Check::initTestCase() // the resource path is wrong, have to load things manually QFileInfo builtins(resourcePath() + "/qml-type-descriptions/builtins.qmltypes"); QStringList errors, warnings; - CppQmlTypesLoader::defaultQtObjects = CppQmlTypesLoader::loadQmlTypes(QFileInfoList() << builtins, &errors, &warnings); + CppQmlTypesLoader::defaultQtObjects() + = CppQmlTypesLoader::loadQmlTypes(QFileInfoList() << builtins, &errors, &warnings); if (!ModelManagerInterface::instance()) new ModelManagerInterface; diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp index f8fb4860243..95fd241eefc 100644 --- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp +++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp @@ -263,7 +263,8 @@ void tst_TestCore::initTestCase() QFileInfo builtins(IDE_DATA_PATH "/qml-type-descriptions/builtins.qmltypes"); QStringList errors, warnings; - QmlJS::CppQmlTypesLoader::defaultQtObjects = QmlJS::CppQmlTypesLoader::loadQmlTypes(QFileInfoList{builtins}, &errors, &warnings); + QmlJS::CppQmlTypesLoader::defaultQtObjects() + = QmlJS::CppQmlTypesLoader::loadQmlTypes(QFileInfoList{builtins}, &errors, &warnings); } void tst_TestCore::cleanupTestCase()