From 21a6368db5de2fb660cb5bb1c7bbf6e3583b8086 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 11 Apr 2025 12:53:30 +0300 Subject: [PATCH] QmlDesigner: Reset old QMLJS code model when new types are added Code view warnings/errors still come from the old QMLJS code model, so we need to reset it after importing new types. Fixes: QDS-15167 Change-Id: Ifd80f69bac29108702b0d98bfa3c6ac353a12424 Reviewed-by: Thomas Hartmann --- .../componentcore/bundleimporter.cpp | 19 ++++++++++++++----- .../components/componentcore/bundleimporter.h | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/bundleimporter.cpp b/src/plugins/qmldesigner/components/componentcore/bundleimporter.cpp index e83757a549a..7a5b5e69532 100644 --- a/src/plugins/qmldesigner/components/componentcore/bundleimporter.cpp +++ b/src/plugins/qmldesigner/components/componentcore/bundleimporter.cpp @@ -12,9 +12,7 @@ #include #include -#ifndef QDS_USE_PROJECTSTORAGE #include -#endif #include #include @@ -54,9 +52,9 @@ QString BundleImporter::importComponent(const QString &bundleDir, if (!bundleImportPath.exists() && !bundleImportPath.createDir()) return QStringLiteral("Failed to create bundle import folder: '%1'").arg(bundleImportPath.toUrlishString()); + bool doReset = false; #ifndef QDS_USE_PROJECTSTORAGE bool doScan = false; - bool doReset = false; #endif FilePath qmldirPath = bundleImportPath.pathAppended("qmldir"); QString qmldirContent = QString::fromUtf8(qmldirPath.fileContents().value_or(QByteArray())); @@ -81,9 +79,7 @@ QString BundleImporter::importComponent(const QString &bundleDir, qmldirContent.append(qmlFile); qmldirContent.append('\n'); qmldirPath.writeFileContents(qmldirContent.toUtf8()); -#ifndef QDS_USE_PROJECTSTORAGE doReset = true; -#endif } QStringList allFiles; @@ -129,6 +125,7 @@ QString BundleImporter::importComponent(const QString &bundleDir, Import import = Import::createLibraryImport(module, "1.0"); #ifdef QDS_USE_PROJECTSTORAGE model->changeImports({import}, {}); + m_pendingFullReset = doReset; #else if (doScan) data.pathToScan = bundleImportPath; @@ -163,6 +160,7 @@ void BundleImporter::handleImportTimer() auto handleFailure = [this] { m_importTimer.stop(); m_importTimerCount = 0; + m_pendingFullReset = false; // Emit dummy finished signals for all pending types const QList pendingTypes = m_pendingImports.keys(); @@ -198,6 +196,17 @@ void BundleImporter::handleImportTimer() } } + if (keys.size() > 0) + return; // Do the code model reset/cleanup on next timer tick + + if (m_pendingFullReset) { + m_pendingFullReset = false; + // Force code model reset to notice changes to existing module + auto modelManager = QmlJS::ModelManagerInterface::instance(); + if (modelManager) + modelManager->resetCodeModel(); + } + if (m_pendingImports.isEmpty()) { m_bundleId.clear(); m_importTimer.stop(); diff --git a/src/plugins/qmldesigner/components/componentcore/bundleimporter.h b/src/plugins/qmldesigner/components/componentcore/bundleimporter.h index 3c743bfe55b..9a346225894 100644 --- a/src/plugins/qmldesigner/components/componentcore/bundleimporter.h +++ b/src/plugins/qmldesigner/components/componentcore/bundleimporter.h @@ -56,6 +56,7 @@ private: bool isImport = true; // false = unimport TypeName type; }; + bool m_pendingFullReset = false; // Reset old QMLJS code model (it's used for code view warnings) #else struct ImportData {