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 <ulf.hermann@qt.io>
This commit is contained in:
Eike Ziller
2023-09-06 10:28:36 +02:00
parent 68d12f0724
commit 7082d2a89b
7 changed files with 40 additions and 13 deletions

View File

@@ -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<void()> CppQmlTypesLoader::defaultObjectsInitializer;
CppQmlTypesLoader::BuiltinObjects CppQmlTypesLoader::loadQmlTypes(const QFileInfoList &qmlTypeFiles, QStringList *errors, QStringList *warnings)
CppQmlTypesLoader::BuiltinObjects &CppQmlTypesLoader::defaultQtObjects()
{
if (defaultObjectsInitializer) {
const std::function<void()> init = defaultObjectsInitializer;
defaultObjectsInitializer = {};
init();
}
return sDefaultLibraryObjects;
}
CppQmlTypesLoader::BuiltinObjects &CppQmlTypesLoader::defaultLibraryObjects()
{
if (defaultObjectsInitializer) {
const std::function<void()> init = defaultObjectsInitializer;
defaultObjectsInitializer = {};
init();
}
return sDefaultQtObjects;
}
CppQmlTypesLoader::BuiltinObjects CppQmlTypesLoader::loadQmlTypes(const QFileInfoList &qmlTypeFiles,
QStringList *errors,
QStringList *warnings)
{
QHash<QString, FakeMetaObject::ConstPtr> newObjects;
QStringList newDependencies;

View File

@@ -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<void()> defaultObjectsInitializer;
};
class QMLJS_EXPORT FakeMetaObjectWithOrigin

View File

@@ -196,12 +196,12 @@ Context::ImportsPerDocument LinkPrivate::linkImports()
m_valueOwner->cppQmlTypes().load(QLatin1String("<builtins>"), m_builtins.metaObjects());
} else {
m_valueOwner->cppQmlTypes().load(QLatin1String("<defaults>"),
CppQmlTypesLoader::defaultQtObjects);
CppQmlTypesLoader::defaultQtObjects());
}
// load library objects shipped with Creator
m_valueOwner->cppQmlTypes().load(QLatin1String("<defaultQt4>"),
CppQmlTypesLoader::defaultLibraryObjects);
CppQmlTypesLoader::defaultLibraryObjects());
if (document) {
// do it on document first, to make sure import errors are shown

View File

@@ -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);

View File

@@ -261,7 +261,7 @@ QHash<QString,Dialect> ModelManager::languageForSuffix() const
ModelManager::ModelManager()
{
qRegisterMetaType<QmlJSTools::SemanticInfo>("QmlJSTools::SemanticInfo");
loadDefaultQmlTypeDescriptions();
CppQmlTypesLoader::defaultObjectsInitializer = [this] { loadDefaultQmlTypeDescriptions(); };
}
ModelManager::~ModelManager() = default;

View File

@@ -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;

View File

@@ -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()