forked from qt-creator/qt-creator
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:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user