aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2023-03-30 13:14:17 +0200
committerThomas Hartmann <thomas.hartmann@qt.io>2023-04-19 13:58:22 +0000
commit6035ff939d636c9027d87f95f9b70096dfc04d7e (patch)
treea88e1ae1080325465ed30172091b313bd7414234
parent79b5a9f03e01712613581e630e51a5143fd9f647 (diff)
QmlDesigner: Add module scanner
For performance reason we want to get the qml modules directly from the file system. When the project storage is finished we can get the modules from there. Task-number: QDS-9542 Change-Id: I26d4b028fbf5ebc541fcd8e34d285ded1fb14935 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r--src/plugins/qmldesigner/CMakeLists.txt4
-rw-r--r--src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp2
-rw-r--r--src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.h2
-rw-r--r--src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp2
-rw-r--r--src/plugins/qmldesigner/components/connectioneditor/connectionview.h2
-rw-r--r--src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp2
-rw-r--r--src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h2
-rw-r--r--src/plugins/qmldesigner/components/debugview/debugview.cpp2
-rw-r--r--src/plugins/qmldesigner/components/debugview/debugview.h2
-rw-r--r--src/plugins/qmldesigner/components/edit3d/edit3dview.cpp6
-rw-r--r--src/plugins/qmldesigner/components/edit3d/edit3dview.h2
-rw-r--r--src/plugins/qmldesigner/components/formeditor/formeditorview.cpp2
-rw-r--r--src/plugins/qmldesigner/components/formeditor/formeditorview.h2
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibraryaddimportmodel.cpp4
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibraryaddimportmodel.h4
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp6
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h2
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp4
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.h2
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp6
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h6
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp8
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h4
-rw-r--r--src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp4
-rw-r--r--src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h2
-rw-r--r--src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp4
-rw-r--r--src/plugins/qmldesigner/components/materialeditor/materialeditorview.h2
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp2
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatorview.cpp2
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatorview.h2
-rw-r--r--src/plugins/qmldesigner/components/texteditor/texteditorview.cpp2
-rw-r--r--src/plugins/qmldesigner/components/texteditor/texteditorview.h2
-rw-r--r--src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp4
-rw-r--r--src/plugins/qmldesigner/components/textureeditor/textureeditorview.h2
-rw-r--r--src/plugins/qmldesigner/designercore/include/abstractview.h6
-rw-r--r--src/plugins/qmldesigner/designercore/include/externaldependenciesinterface.h1
-rw-r--r--src/plugins/qmldesigner/designercore/include/forwardview.h4
-rw-r--r--src/plugins/qmldesigner/designercore/include/import.h2
-rw-r--r--src/plugins/qmldesigner/designercore/include/model.h12
-rw-r--r--src/plugins/qmldesigner/designercore/include/nodeinstanceview.h2
-rw-r--r--src/plugins/qmldesigner/designercore/include/rewriterview.h2
-rw-r--r--src/plugins/qmldesigner/designercore/include/subcomponentmanager.h4
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp2
-rw-r--r--src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp8
-rw-r--r--src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp2
-rw-r--r--src/plugins/qmldesigner/designercore/model/abstractview.cpp10
-rw-r--r--src/plugins/qmldesigner/designercore/model/model.cpp28
-rw-r--r--src/plugins/qmldesigner/designercore/model/model_p.h16
-rw-r--r--src/plugins/qmldesigner/designercore/model/modelmerger.cpp2
-rw-r--r--src/plugins/qmldesigner/designercore/model/rewriterview.cpp2
-rw-r--r--src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp276
-rw-r--r--src/plugins/qmldesigner/designercore/model/texttomodelmerger.h8
-rw-r--r--src/plugins/qmldesigner/designercore/projectstorage/modulescanner.cpp73
-rw-r--r--src/plugins/qmldesigner/designercore/projectstorage/modulescanner.h37
-rw-r--r--src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp4
-rw-r--r--src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.h4
-rw-r--r--src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp4
-rw-r--r--src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.h4
-rw-r--r--src/plugins/qmldesigner/qmldesignerexternaldependencies.cpp48
-rw-r--r--src/plugins/qmldesigner/qmldesignerexternaldependencies.h1
-rw-r--r--src/plugins/qmldesigner/qmldesignerprojectmanager.cpp36
-rw-r--r--tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp11
-rw-r--r--tests/unit/unittest/CMakeLists.txt7
-rw-r--r--tests/unit/unittest/google-using-declarations.h3
-rw-r--r--tests/unit/unittest/modulescanner-test.cpp53
-rw-r--r--tests/unit/unittest/smallstring-test.cpp2
-rw-r--r--tests/unit/unittest/unittest-matchers.h68
-rw-r--r--tests/unit/unittest/unittest-utility-functions.h5
68 files changed, 532 insertions, 321 deletions
diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt
index ed558082e1e..59a517a529d 100644
--- a/src/plugins/qmldesigner/CMakeLists.txt
+++ b/src/plugins/qmldesigner/CMakeLists.txt
@@ -57,6 +57,7 @@ add_qtc_library(QmlDesignerCore STATIC
Utils
Qt::Widgets
Qt::Qml
+ Qt::QmlPrivate
Core
ProjectExplorer
QmakeProjectManager
@@ -92,7 +93,7 @@ extend_qtc_library(QmlDesignerCore
CONDITION TARGET Qt6::QmlDomPrivate AND TARGET Qt6::QmlCompilerPrivate AND Qt6_VERSION VERSION_GREATER_EQUAL 6.5.0
DEPENDS Qt6::QmlDomPrivate Qt6::QmlCompilerPrivate
- DEFINES QDS_HAS_QMLDOM
+ PUBLIC_DEFINES QDS_HAS_QMLPRIVATE
)
extend_qtc_library(QmlDesignerCore
@@ -400,6 +401,7 @@ extend_qtc_library(QmlDesignerCore
filesystem.cpp filesystem.h
filestatus.h
filestatuscache.cpp filestatuscache.h
+ modulescanner.cpp modulescanner.h
nonlockingmutex.h
projectstorageexceptions.cpp projectstorageexceptions.h
projectstorageinterface.h
diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp
index 14f55efa3f8..90bcc54fddc 100644
--- a/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp
+++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp
@@ -95,7 +95,7 @@ void DesignerActionManagerView::nodeOrderChanged(const NodeListProperty &)
setupContext(SelectionContext::UpdateMode::NodeHierachy);
}
-void DesignerActionManagerView::importsChanged(const QList<Import> &, const QList<Import> &)
+void DesignerActionManagerView::importsChanged(const Imports &, const Imports &)
{
setupContext();
}
diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.h b/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.h
index 41210602b38..9ccfe4e7379 100644
--- a/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.h
+++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.h
@@ -37,7 +37,7 @@ public:
void selectedNodesChanged(const QList<ModelNode> &,
const QList<ModelNode> &) override;
void nodeOrderChanged(const NodeListProperty &) override;
- void importsChanged(const QList<Import> &, const QList<Import> &) override;
+ void importsChanged(const Imports &, const Imports &) override;
void signalHandlerPropertiesChanged(const QVector<SignalHandlerProperty> &/*propertyList*/, PropertyChangeFlags /*propertyChange*/) override;
void variantPropertiesChanged(const QList<VariantProperty>& propertyList, PropertyChangeFlags propertyChangeFlag) override;
void bindingPropertiesChanged(const QList<BindingProperty>& propertyList, PropertyChangeFlags propertyChangeFlag) override;
diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp b/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp
index 39e05a898ca..56fcc7ef6bf 100644
--- a/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp
+++ b/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp
@@ -183,7 +183,7 @@ void ConnectionView::auxiliaryDataChanged([[maybe_unused]] const ModelNode &node
selectionModel->clearSelection();
}
-void ConnectionView::importsChanged(const QList<Import> & /*addedImports*/, const QList<Import> & /*removedImports*/)
+void ConnectionView::importsChanged(const Imports & /*addedImports*/, const Imports & /*removedImports*/)
{
backendModel()->resetModel();
}
diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionview.h b/src/plugins/qmldesigner/components/connectioneditor/connectionview.h
index dcf61ad79d9..89c6c489105 100644
--- a/src/plugins/qmldesigner/components/connectioneditor/connectionview.h
+++ b/src/plugins/qmldesigner/components/connectioneditor/connectionview.h
@@ -50,7 +50,7 @@ public:
AuxiliaryDataKeyView key,
const QVariant &data) override;
- void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override;
+ void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
void currentStateChanged(const ModelNode &node) override;
diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp
index 01932900e9e..105bfed89dd 100644
--- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp
+++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp
@@ -144,7 +144,7 @@ void ContentLibraryView::modelAboutToBeDetached(Model *model)
AbstractView::modelAboutToBeDetached(model);
}
-void ContentLibraryView::importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports)
+void ContentLibraryView::importsChanged(const Imports &addedImports, const Imports &removedImports)
{
Q_UNUSED(addedImports)
Q_UNUSED(removedImports)
diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h
index 1d27f6e260c..137034dd955 100644
--- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h
+++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h
@@ -31,7 +31,7 @@ public:
// AbstractView
void modelAttached(Model *model) override;
void modelAboutToBeDetached(Model *model) override;
- void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override;
+ void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
void active3DSceneChanged(qint32 sceneId) override;
void selectedNodesChanged(const QList<ModelNode> &selectedNodeList,
const QList<ModelNode> &lastSelectedNodeList) override;
diff --git a/src/plugins/qmldesigner/components/debugview/debugview.cpp b/src/plugins/qmldesigner/components/debugview/debugview.cpp
index 2888575e44c..2a62d7a6b2b 100644
--- a/src/plugins/qmldesigner/components/debugview/debugview.cpp
+++ b/src/plugins/qmldesigner/components/debugview/debugview.cpp
@@ -65,7 +65,7 @@ void DebugView::modelAboutToBeDetached(Model *model)
AbstractView::modelAboutToBeDetached(model);
}
-void DebugView::importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports)
+void DebugView::importsChanged(const Imports &addedImports, const Imports &removedImports)
{
if (isDebugViewEnabled()) {
QString message;
diff --git a/src/plugins/qmldesigner/components/debugview/debugview.h b/src/plugins/qmldesigner/components/debugview/debugview.h
index 885030545cf..e80c619c818 100644
--- a/src/plugins/qmldesigner/components/debugview/debugview.h
+++ b/src/plugins/qmldesigner/components/debugview/debugview.h
@@ -24,7 +24,7 @@ public:
void modelAttached(Model *model) override;
void modelAboutToBeDetached(Model *model) override;
- void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override;
+ void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
void nodeCreated(const ModelNode &createdNode) override;
void nodeAboutToBeRemoved(const ModelNode &removedNode) override;
diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp
index d346e2bf164..39125c8f698 100644
--- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp
+++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp
@@ -312,8 +312,8 @@ void Edit3DView::modelAboutToBeDetached(Model *model)
AbstractView::modelAboutToBeDetached(model);
}
-void Edit3DView::importsChanged([[maybe_unused]] const QList<Import> &addedImports,
- [[maybe_unused]] const QList<Import> &removedImports)
+void Edit3DView::importsChanged([[maybe_unused]] const Imports &addedImports,
+ [[maybe_unused]] const Imports &removedImports)
{
checkImports();
}
@@ -920,7 +920,7 @@ void Edit3DView::addQuick3DImport()
{
DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument();
if (document && !document->inFileComponentModelActive() && model()) {
- const QList<Import> imports = model()->possibleImports();
+ const Imports imports = model()->possibleImports();
for (const auto &import : imports) {
if (import.url() == "QtQuick3D") {
if (!import.version().isEmpty() && import.majorVersion() >= 6) {
diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.h b/src/plugins/qmldesigner/components/edit3d/edit3dview.h
index 109555f586b..cd3e686d3bb 100644
--- a/src/plugins/qmldesigner/components/edit3d/edit3dview.h
+++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.h
@@ -44,7 +44,7 @@ public:
void updateActiveScene3D(const QVariantMap &sceneState) override;
void modelAttached(Model *model) override;
void modelAboutToBeDetached(Model *model) override;
- void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override;
+ void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
void customNotification(const AbstractView *view, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data) override;
void nodeAtPosReady(const ModelNode &modelNode, const QVector3D &pos3d) override;
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
index 1f4d5262852..5661e4ff793 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
@@ -253,7 +253,7 @@ void FormEditorView::modelAboutToBeDetached(Model *model)
AbstractView::modelAboutToBeDetached(model);
}
-void FormEditorView::importsChanged(const QList<Import> &/*addedImports*/, const QList<Import> &/*removedImports*/)
+void FormEditorView::importsChanged(const Imports &/*addedImports*/, const Imports &/*removedImports*/)
{
reset();
}
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h
index fde20427628..f97959acb37 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h
@@ -48,7 +48,7 @@ public:
void modelAttached(Model *model) override;
void modelAboutToBeDetached(Model *model) override;
- void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override;
+ void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
void nodeCreated(const ModelNode &createdNode) override;
void nodeAboutToBeRemoved(const ModelNode &removedNode) override;
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryaddimportmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryaddimportmodel.cpp
index 5b46c1d12ef..41a9c6b5f4a 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryaddimportmodel.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryaddimportmodel.cpp
@@ -56,14 +56,14 @@ QHash<int, QByteArray> ItemLibraryAddImportModel::roleNames() const
return m_roleNames;
}
-void ItemLibraryAddImportModel::update(const QList<Import> &possibleImports)
+void ItemLibraryAddImportModel::update(const Imports &possibleImports)
{
beginResetModel();
m_importList.clear();
const DesignerMcuManager &mcuManager = DesignerMcuManager::instance();
const bool isQtForMCUs = mcuManager.isMCUProject();
- QList<Import> filteredImports;
+ Imports filteredImports;
if (isQtForMCUs) {
const QStringList mcuAllowedList = mcuManager.allowedImports();
const QStringList mcuBannedList = mcuManager.bannedImports();
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryaddimportmodel.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryaddimportmodel.h
index 5785b67301a..2989fd51642 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryaddimportmodel.h
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryaddimportmodel.h
@@ -24,7 +24,7 @@ public:
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QHash<int, QByteArray> roleNames() const override;
- void update(const QList<Import> &possibleImports);
+ void update(const Imports &possibleImports);
void setSearchText(const QString &searchText);
Import getImportAt(int index) const;
@@ -33,7 +33,7 @@ public:
private:
QString m_searchText;
- QList<Import> m_importList;
+ Imports m_importList;
QSet<QString> m_importFilterList;
QHash<int, QByteArray> m_roleNames;
QSet<QString> m_priorityImports;
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp
index d9b82419433..e7002ff2503 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp
@@ -709,9 +709,9 @@ void ItemLibraryAssetImporter::finalizeQuick3DImport()
model->rewriterView()->textModifier()->replace(0, 0, {});
} else if (counter < 100) {
try {
- const QList<Import> posImports = model->possibleImports();
- const QList<Import> currentImports = model->imports();
- QList<Import> newImportsToAdd;
+ const Imports posImports = model->possibleImports();
+ const Imports currentImports = model->imports();
+ Imports newImportsToAdd;
for (auto &imp : std::as_const(m_requiredImports)) {
const bool isPos = Utils::contains(posImports, [imp](const Import &posImp) {
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h
index c7952e9b8f6..94413af392e 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h
@@ -107,7 +107,7 @@ private:
int m_currentImportId = 0;
QHash<int, ParseData> m_parseData;
QString m_progressTitle;
- QList<Import> m_requiredImports;
+ Imports m_requiredImports;
QList<int> m_puppetQueue;
};
} // QmlDesigner
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp
index 556d0c978fe..18430ca0179 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp
@@ -343,7 +343,7 @@ void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo, Model *model)
materialBundlePrefix.append(".MaterialBundle");
// create import sections
- const QList<Import> usedImports = model->usedImports();
+ const Imports usedImports = model->usedImports();
QHash<QString, ItemLibraryImport *> importHash;
for (const Import &import : model->imports()) {
if (import.url() != projectName) {
@@ -550,7 +550,7 @@ ItemLibraryImport *ItemLibraryModel::importByUrl(const QString &importUrl) const
return nullptr;
}
-void ItemLibraryModel::updateUsedImports(const QList<Import> &usedImports)
+void ItemLibraryModel::updateUsedImports(const Imports &usedImports)
{
// imports in the excludeList are not marked used and thus can always be removed even when in use.
const QList<QString> excludeList = {"SimulinkConnector"};
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.h
index 4e9c5809c12..212ddf8e040 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.h
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.h
@@ -38,7 +38,7 @@ public:
ItemLibraryImport *importByUrl(const QString &importName) const;
void update(ItemLibraryInfo *itemLibraryInfo, Model *model);
- void updateUsedImports(const QList<Import> &usedImports);
+ void updateUsedImports(const Imports &usedImports);
QMimeData *getMimeData(const ItemLibraryEntry &itemLibraryEntry);
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp
index e8d1b584bfd..89b16fcd8e5 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp
@@ -74,7 +74,7 @@ void ItemLibraryView::modelAboutToBeDetached(Model *model)
m_widget->setModel(nullptr);
}
-void ItemLibraryView::importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports)
+void ItemLibraryView::importsChanged(const Imports &addedImports, const Imports &removedImports)
{
DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument();
for (const auto &import : addedImports)
@@ -111,7 +111,7 @@ void ItemLibraryView::importsChanged(const QList<Import> &addedImports, const QL
}
}
-void ItemLibraryView::possibleImportsChanged(const QList<Import> &possibleImports)
+void ItemLibraryView::possibleImportsChanged(const Imports &possibleImports)
{
DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument();
for (const auto &import : possibleImports)
@@ -120,7 +120,7 @@ void ItemLibraryView::possibleImportsChanged(const QList<Import> &possibleImport
m_widget->updatePossibleImports(possibleImports);
}
-void ItemLibraryView::usedImportsChanged(const QList<Import> &usedImports)
+void ItemLibraryView::usedImportsChanged(const Imports &usedImports)
{
m_widget->updateUsedImports(usedImports);
}
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h
index e28f39318c0..43287ae0e5a 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h
@@ -26,9 +26,9 @@ public:
// AbstractView
void modelAttached(Model *model) override;
void modelAboutToBeDetached(Model *model) override;
- void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override;
- void possibleImportsChanged(const QList<Import> &possibleImports) override;
- void usedImportsChanged(const QList<Import> &usedImports) override;
+ void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
+ void possibleImportsChanged(const Imports &possibleImports) override;
+ void usedImportsChanged(const Imports &usedImports) override;
void documentMessagesChanged(const QList<DocumentMessage> &errors, const QList<DocumentMessage> &warnings) override;
void updateImport3DSupport(const QVariantMap &supportMap) override;
void customNotification(const AbstractView *view, const QString &identifier,
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
index 549f9e69c10..1fafc91ea6a 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
@@ -86,7 +86,7 @@ bool ItemLibraryWidget::eventFilter(QObject *obj, QEvent *event)
Import fileImport = Import::createFileImport(entry.requiredImport());
if (!m_model->hasImport(libImport, true, true)
&& !m_model->hasImport(fileImport, true, true)) {
- const QList<Import> possImports = m_model->possibleImports();
+ const Imports possImports = m_model->possibleImports();
for (const auto &possImport : possImports) {
if ((!possImport.url().isEmpty() && possImport.url() == libImport.url())
|| (!possImport.file().isEmpty() && possImport.file() == fileImport.file())) {
@@ -246,7 +246,7 @@ void ItemLibraryWidget::handleAddImport(int index)
+ importStr);
}
- QList<Import> imports;
+ Imports imports;
const QString dependency = getDependencyImport(import);
auto document = QmlDesignerPlugin::instance()->currentDesignDocument();
@@ -346,13 +346,13 @@ void ItemLibraryWidget::updateModel()
updateSearch();
}
-void ItemLibraryWidget::updatePossibleImports(const QList<Import> &possibleImports)
+void ItemLibraryWidget::updatePossibleImports(const Imports &possibleImports)
{
m_addModuleModel->update(possibleImports);
delayedUpdateModel();
}
-void ItemLibraryWidget::updateUsedImports(const QList<Import> &usedImports)
+void ItemLibraryWidget::updateUsedImports(const Imports &usedImports)
{
m_itemLibraryModel->updateUsedImports(usedImports);
}
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h
index 394b3ea6103..38cd782d097 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h
@@ -60,8 +60,8 @@ public:
void switchToComponentsView();
void delayedUpdateModel();
void updateModel();
- void updatePossibleImports(const QList<Import> &possibleImports);
- void updateUsedImports(const QList<Import> &usedImports);
+ void updatePossibleImports(const Imports &possibleImports);
+ void updateUsedImports(const Imports &usedImports);
void setModel(Model *model);
void setFlowMode(bool b);
diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp
index 8e799336f85..5caf0169eec 100644
--- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp
+++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp
@@ -469,8 +469,8 @@ ModelNode MaterialBrowserView::getMaterialOfModel(const ModelNode &model, int id
return mat;
}
-void MaterialBrowserView::importsChanged([[maybe_unused]] const QList<Import> &addedImports,
- [[maybe_unused]] const QList<Import> &removedImports)
+void MaterialBrowserView::importsChanged([[maybe_unused]] const Imports &addedImports,
+ [[maybe_unused]] const Imports &removedImports)
{
bool hasQuick3DImport = model()->hasImport("QtQuick3D");
diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h
index 811d6679b63..2e0227be413 100644
--- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h
+++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h
@@ -44,7 +44,7 @@ public:
void nodeAboutToBeRemoved(const ModelNode &removedNode) override;
void nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty,
PropertyChangeFlags propertyChange) override;
- void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override;
+ void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
void customNotification(const AbstractView *view, const QString &identifier,
const QList<ModelNode> &nodeList, const QList<QVariant> &data) override;
void instancesCompleted(const QVector<ModelNode> &completedNodeList) override;
diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp
index 47d47985ebd..9cb4959e132 100644
--- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp
+++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp
@@ -974,8 +974,8 @@ void MaterialEditorView::modelNodePreviewPixmapChanged(const ModelNode &node, co
m_qmlBackEnd->updateMaterialPreview(pixmap);
}
-void MaterialEditorView::importsChanged([[maybe_unused]] const QList<Import> &addedImports,
- [[maybe_unused]] const QList<Import> &removedImports)
+void MaterialEditorView::importsChanged([[maybe_unused]] const Imports &addedImports,
+ [[maybe_unused]] const Imports &removedImports)
{
m_hasQuick3DImport = model()->hasImport("QtQuick3D");
m_qmlBackEnd->contextObject()->setHasQuick3DImport(m_hasQuick3DImport);
diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h
index d47d030e57b..c201742bd51 100644
--- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h
+++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h
@@ -55,7 +55,7 @@ public:
void nodeTypeChanged(const ModelNode& node, const TypeName &type, int majorVersion, int minorVersion) override;
void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) override;
void modelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap) override;
- void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override;
+ void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
void customNotification(const AbstractView *view, const QString &identifier,
const QList<ModelNode> &nodeList, const QList<QVariant> &data) override;
void nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent,
diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
index 62868290285..9dcf81a1738 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
@@ -901,7 +901,7 @@ void NavigatorTreeModel::addImport(const QString &importName)
{
Import import = Import::createLibraryImport(importName);
if (!m_view->model()->hasImport(import, true, true)) {
- const QList<Import> possImports = m_view->model()->possibleImports();
+ const Imports possImports = m_view->model()->possibleImports();
for (const auto &possImport : possImports) {
if (possImport.url() == import.url()) {
import = possImport;
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
index 28481aae798..97c7285d49d 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
@@ -228,7 +228,7 @@ void NavigatorView::modelAboutToBeDetached(Model *model)
AbstractView::modelAboutToBeDetached(model);
}
-void NavigatorView::importsChanged(const QList<Import> &/*addedImports*/, const QList<Import> &/*removedImports*/)
+void NavigatorView::importsChanged(const Imports &/*addedImports*/, const Imports &/*removedImports*/)
{
treeWidget()->update();
}
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.h b/src/plugins/qmldesigner/components/navigator/navigatorview.h
index f5fa81591d9..662b749ecec 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorview.h
+++ b/src/plugins/qmldesigner/components/navigator/navigatorview.h
@@ -50,7 +50,7 @@ public:
void modelAttached(Model *model) override;
void modelAboutToBeDetached(Model *model) override;
- void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override;
+ void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
void nodeAboutToBeRemoved(const ModelNode &removedNode) override;
void nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty, PropertyChangeFlags propertyChange) override;
diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp
index 1921487aa0b..6c6102036ac 100644
--- a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp
+++ b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp
@@ -103,7 +103,7 @@ void TextEditorView::modelAboutToBeDetached(Model *model)
}
}
-void TextEditorView::importsChanged(const QList<Import> &/*addedImports*/, const QList<Import> &/*removedImports*/)
+void TextEditorView::importsChanged(const Imports &/*addedImports*/, const Imports &/*removedImports*/)
{
}
diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorview.h b/src/plugins/qmldesigner/components/texteditor/texteditorview.h
index b1865e78f9f..e50372279d9 100644
--- a/src/plugins/qmldesigner/components/texteditor/texteditorview.h
+++ b/src/plugins/qmldesigner/components/texteditor/texteditorview.h
@@ -34,7 +34,7 @@ public:
void modelAttached(Model *model) override;
void modelAboutToBeDetached(Model *model) override;
- void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override;
+ void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
void nodeAboutToBeRemoved(const ModelNode &removedNode) override;
void nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags propertyChange) override;
diff --git a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp
index 38664c146e4..a4132d0eb7a 100644
--- a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp
+++ b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp
@@ -720,8 +720,8 @@ void TextureEditorView::instancePropertyChanged(const QList<QPair<ModelNode, Pro
m_locked = false;
}
-void TextureEditorView::importsChanged([[maybe_unused]] const QList<Import> &addedImports,
- [[maybe_unused]] const QList<Import> &removedImports)
+void TextureEditorView::importsChanged([[maybe_unused]] const Imports &addedImports,
+ [[maybe_unused]] const Imports &removedImports)
{
m_hasQuick3DImport = model()->hasImport("QtQuick3D");
m_qmlBackEnd->contextObject()->setHasQuick3DImport(m_hasQuick3DImport);
diff --git a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.h b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.h
index b299a1e99ae..7baa07e9d30 100644
--- a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.h
+++ b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.h
@@ -58,7 +58,7 @@ public:
void currentStateChanged(const ModelNode &node) override;
void instancePropertyChanged(const QList<QPair<ModelNode, PropertyName> > &propertyList) override;
- void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override;
+ void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
void customNotification(const AbstractView *view, const QString &identifier,
const QList<ModelNode> &nodeList, const QList<QVariant> &data) override;
diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h
index 2d886d959be..0c3df94030c 100644
--- a/src/plugins/qmldesigner/designercore/include/abstractview.h
+++ b/src/plugins/qmldesigner/designercore/include/abstractview.h
@@ -195,9 +195,9 @@ public:
const ModelNode &movedNode,
int oldIndex);
- virtual void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports);
- virtual void possibleImportsChanged(const QList<Import> &possibleImports);
- virtual void usedImportsChanged(const QList<Import> &usedImports);
+ virtual void importsChanged(const Imports &addedImports, const Imports &removedImports);
+ virtual void possibleImportsChanged(const Imports &possibleImports);
+ virtual void usedImportsChanged(const Imports &usedImports);
virtual void auxiliaryDataChanged(const ModelNode &node,
AuxiliaryDataKeyView type,
diff --git a/src/plugins/qmldesigner/designercore/include/externaldependenciesinterface.h b/src/plugins/qmldesigner/designercore/include/externaldependenciesinterface.h
index 7b2b8a2c55f..d6af071a30a 100644
--- a/src/plugins/qmldesigner/designercore/include/externaldependenciesinterface.h
+++ b/src/plugins/qmldesigner/designercore/include/externaldependenciesinterface.h
@@ -40,6 +40,7 @@ public:
virtual PuppetStartData puppetStartData(const class Model &model) const = 0;
virtual bool instantQmlTextUpdate() const = 0;
virtual Utils::FilePath qmlPuppetPath() const = 0;
+ virtual QStringList modulePaths() const = 0;
};
} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/designercore/include/forwardview.h b/src/plugins/qmldesigner/designercore/include/forwardview.h
index 7041e851096..386ac83141c 100644
--- a/src/plugins/qmldesigner/designercore/include/forwardview.h
+++ b/src/plugins/qmldesigner/designercore/include/forwardview.h
@@ -44,7 +44,7 @@ public:
void fileUrlChanged(const QUrl &oldUrl, const QUrl &newUrl) override;
void nodeOrderChanged(const NodeListProperty &listProperty) override;
- void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override;
+ void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) override;
@@ -197,7 +197,7 @@ void ForwardView<ViewType>::nodeOrderChanged(const NodeListProperty &listPropert
}
template <class ViewType>
-void ForwardView<ViewType>::importChanged(const QList<Import> &addedImports, const QList<Import> &removedImports)
+void ForwardView<ViewType>::importChanged(const Imports &addedImports, const Imports &removedImports)
{
for (const ViewTypePointer &view : std::as_const(m_targetViewList))
view->importChanged(addedImport, removedImport);
diff --git a/src/plugins/qmldesigner/designercore/include/import.h b/src/plugins/qmldesigner/designercore/include/import.h
index b221b861732..ff9e90f162f 100644
--- a/src/plugins/qmldesigner/designercore/include/import.h
+++ b/src/plugins/qmldesigner/designercore/include/import.h
@@ -56,6 +56,8 @@ private:
QMLDESIGNERCORE_EXPORT size_t qHash(const Import &import);
+using Imports = QList<Import>;
+
} // namespace QmlDesigner
Q_DECLARE_METATYPE(QmlDesigner::Import)
diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h
index f3227361e68..d36086777d8 100644
--- a/src/plugins/qmldesigner/designercore/include/model.h
+++ b/src/plugins/qmldesigner/designercore/include/model.h
@@ -115,12 +115,12 @@ public:
// Editing sub-components:
// Imports:
- const QList<Import> &imports() const;
- const QList<Import> &possibleImports() const;
- const QList<Import> &usedImports() const;
- void changeImports(const QList<Import> &importsToBeAdded, const QList<Import> &importsToBeRemoved);
- void setPossibleImports(const QList<Import> &possibleImports);
- void setUsedImports(const QList<Import> &usedImports);
+ const Imports &imports() const;
+ const Imports &possibleImports() const;
+ const Imports &usedImports() const;
+ void changeImports(const Imports &importsToBeAdded, const Imports &importsToBeRemoved);
+ void setPossibleImports(const Imports &possibleImports);
+ void setUsedImports(const Imports &usedImports);
bool hasImport(const Import &import, bool ignoreAlias = true, bool allowHigherVersion = false) const;
bool isImportPossible(const Import &import, bool ignoreAlias = true, bool allowHigherVersion = false) const;
QString pathForImport(const Import &import);
diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
index 11017a27b1c..0a9af39fc5e 100644
--- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
+++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
@@ -85,7 +85,7 @@ public:
void fileUrlChanged(const QUrl &oldUrl, const QUrl &newUrl) override;
void nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId) override;
void nodeOrderChanged(const NodeListProperty &listProperty) override;
- void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override;
+ void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
void auxiliaryDataChanged(const ModelNode &node,
AuxiliaryDataKeyView key,
const QVariant &data) override;
diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h
index 9387fdb345e..95e2e51d8a1 100644
--- a/src/plugins/qmldesigner/designercore/include/rewriterview.h
+++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h
@@ -84,7 +84,7 @@ public:
void rewriterBeginTransaction() override;
void rewriterEndTransaction() override;
- void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override;
+ void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
TextModifier *textModifier() const;
void setTextModifier(TextModifier *textModifier);
diff --git a/src/plugins/qmldesigner/designercore/include/subcomponentmanager.h b/src/plugins/qmldesigner/designercore/include/subcomponentmanager.h
index 207f1b7104b..dbc89c1cccd 100644
--- a/src/plugins/qmldesigner/designercore/include/subcomponentmanager.h
+++ b/src/plugins/qmldesigner/designercore/include/subcomponentmanager.h
@@ -27,7 +27,7 @@ public:
explicit SubComponentManager(Model *model,
class ExternalDependenciesInterface &externalDependencies);
- void update(const QUrl &fileUrl, const QList<Import> &imports);
+ void update(const QUrl &fileUrl, const Imports &imports);
void addAndParseImport(const Import &import);
QStringList qmlFiles() const;
@@ -53,7 +53,7 @@ private: // functions
private: // variables
QFileSystemWatcher m_watcher;
- QList<Import> m_imports;
+ Imports m_imports;
// key: canonical directory path
QMultiHash<QString,QString> m_dirToQualifier;
QUrl m_filePath;
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
index ebe5acd9d28..bd28ce2069e 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
@@ -625,7 +625,7 @@ void NodeInstanceView::nodeOrderChanged(const NodeListProperty &listProperty)
m_nodeInstanceServer->reparentInstances(ReparentInstancesCommand(containerList));
}
-void NodeInstanceView::importsChanged(const QList<Import> &/*addedImports*/, const QList<Import> &/*removedImports*/)
+void NodeInstanceView::importsChanged(const Imports &/*addedImports*/, const Imports &/*removedImports*/)
{
restartProcess();
}
diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
index f4b505c4e70..bebd01b422f 100644
--- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
+++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
@@ -768,7 +768,7 @@ NodeMetaInfoPrivate::NodeMetaInfoPrivate(Model *model, TypeName type, int maj, i
}
} else {
m_isFileComponent = true;
- const Imports *imports = context()->imports(document());
+ const auto *imports = context()->imports(document());
const ImportInfo importInfo = imports->info(lookupNameComponent().constLast(),
context().data());
@@ -791,7 +791,7 @@ NodeMetaInfoPrivate::NodeMetaInfoPrivate(Model *model, TypeName type, int maj, i
} else {
// Special case for aliased types for the rewriter
- const Imports *imports = context()->imports(document());
+ const auto *imports = context()->imports(document());
const ImportInfo importInfo = imports->info(QString::fromUtf8(m_qualfiedTypeName),
context().data());
if (importInfo.isValid()) {
@@ -1198,7 +1198,7 @@ QString NodeMetaInfoPrivate::importDirectoryPath() const
ModelManagerInterface *modelManager = ModelManagerInterface::instance();
if (isValid()) {
- const Imports *imports = context()->imports(document());
+ const auto *imports = context()->imports(document());
ImportInfo importInfo = imports->info(lookupNameComponent().constLast(), context().data());
if (importInfo.type() == ImportType::Directory) {
@@ -1333,7 +1333,7 @@ void NodeMetaInfoPrivate::setupPrototypes()
m_prototypes.append(description);
} else {
if (context()->lookupType(document(), {ov->className()})) {
- const Imports *allImports = context()->imports(document());
+ const auto *allImports = context()->imports(document());
ImportInfo importInfo = allImports->info(description.className, context().data());
if (importInfo.isValid()) {
diff --git a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp
index e7feb0d4454..0afd0d735c7 100644
--- a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp
+++ b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp
@@ -491,7 +491,7 @@ QStringList SubComponentManager::qmlFiles() const
return m_watcher.files();
}
-void SubComponentManager::update(const QUrl &filePath, const QList<Import> &imports)
+void SubComponentManager::update(const QUrl &filePath, const Imports &imports)
{
if (debug)
qDebug() << Q_FUNC_INFO << filePath << imports.size();
diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp
index b9f0315c196..ec6ddb6aa43 100644
--- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp
@@ -315,15 +315,15 @@ void AbstractView::nodeTypeChanged(const ModelNode & /*node*/, const TypeName &
}
-void AbstractView::importsChanged(const QList<Import> &/*addedImports*/, const QList<Import> &/*removedImports*/)
+void AbstractView::importsChanged(const Imports &/*addedImports*/, const Imports &/*removedImports*/)
{
}
-void AbstractView::possibleImportsChanged(const QList<Import> &/*possibleImports*/)
+void AbstractView::possibleImportsChanged(const Imports &/*possibleImports*/)
{
}
-void AbstractView::usedImportsChanged(const QList<Import> &/*usedImports*/)
+void AbstractView::usedImportsChanged(const Imports &/*usedImports*/)
{
}
@@ -893,7 +893,7 @@ QmlTimeline AbstractView::currentTimeline() const
static int getMinorVersionFromImport(const Model *model)
{
- const QList<Import> imports = model->imports();
+ const Imports imports = model->imports();
for (const Import &import : imports) {
if (import.isLibraryImport() && import.url() == "QtQuick") {
const QString versionString = import.version();
@@ -909,7 +909,7 @@ static int getMinorVersionFromImport(const Model *model)
static int getMajorVersionFromImport(const Model *model)
{
- const QList<Import> imports = model->imports();
+ const Imports imports = model->imports();
for (const Import &import : imports) {
if (import.isLibraryImport() && import.url() == QStringLiteral("QtQuick")) {
const QString versionString = import.version();
diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp
index 13197666fc4..33571cc3ce1 100644
--- a/src/plugins/qmldesigner/designercore/model/model.cpp
+++ b/src/plugins/qmldesigner/designercore/model/model.cpp
@@ -108,10 +108,10 @@ void ModelPrivate::detachAllViews()
}
}
-void ModelPrivate::changeImports(const QList<Import> &toBeAddedImportList,
- const QList<Import> &toBeRemovedImportList)
+void ModelPrivate::changeImports(const Imports &toBeAddedImportList,
+ const Imports &toBeRemovedImportList)
{
- QList<Import> removedImportList;
+ Imports removedImportList;
for (const Import &import : toBeRemovedImportList) {
if (m_imports.contains(import)) {
removedImportList.append(import);
@@ -119,7 +119,7 @@ void ModelPrivate::changeImports(const QList<Import> &toBeAddedImportList,
}
}
- QList<Import> addedImportList;
+ Imports addedImportList;
for (const Import &import : toBeAddedImportList) {
if (!m_imports.contains(import)) {
addedImportList.append(import);
@@ -131,8 +131,7 @@ void ModelPrivate::changeImports(const QList<Import> &toBeAddedImportList,
notifyImportsChanged(addedImportList, removedImportList);
}
-void ModelPrivate::notifyImportsChanged(const QList<Import> &addedImports,
- const QList<Import> &removedImports)
+void ModelPrivate::notifyImportsChanged(const Imports &addedImports, const Imports &removedImports)
{
bool resetModel = false;
QString description;
@@ -157,7 +156,7 @@ void ModelPrivate::notifyImportsChanged(const QList<Import> &addedImports,
resetModelByRewriter(description);
}
-void ModelPrivate::notifyPossibleImportsChanged(const QList<Import> &possibleImports)
+void ModelPrivate::notifyPossibleImportsChanged(const Imports &possibleImports)
{
for (const QPointer<AbstractView> &view : enabledViews()) {
Q_ASSERT(view != nullptr);
@@ -165,7 +164,7 @@ void ModelPrivate::notifyPossibleImportsChanged(const QList<Import> &possibleImp
}
}
-void ModelPrivate::notifyUsedImportsChanged(const QList<Import> &usedImports)
+void ModelPrivate::notifyUsedImportsChanged(const Imports &usedImports)
{
for (const QPointer<AbstractView> &view : enabledViews()) {
Q_ASSERT(view != nullptr);
@@ -1400,28 +1399,27 @@ Model::Model(const TypeName &typeName, int major, int minor, Model *metaInfoProx
Model::~Model() = default;
-const QList<Import> &Model::imports() const
+const Imports &Model::imports() const
{
return d->imports();
}
-const QList<Import> &Model::possibleImports() const
+const Imports &Model::possibleImports() const
{
return d->m_possibleImportList;
}
-const QList<Import> &Model::usedImports() const
+const Imports &Model::usedImports() const
{
return d->m_usedImportList;
}
-void Model::changeImports(const QList<Import> &importsToBeAdded,
- const QList<Import> &importsToBeRemoved)
+void Model::changeImports(const Imports &importsToBeAdded, const Imports &importsToBeRemoved)
{
d->changeImports(importsToBeAdded, importsToBeRemoved);
}
-void Model::setPossibleImports(const QList<Import> &possibleImports)
+void Model::setPossibleImports(const Imports &possibleImports)
{
if (d->m_possibleImportList != possibleImports) {
d->m_possibleImportList = possibleImports;
@@ -1429,7 +1427,7 @@ void Model::setPossibleImports(const QList<Import> &possibleImports)
}
}
-void Model::setUsedImports(const QList<Import> &usedImports)
+void Model::setUsedImports(const Imports &usedImports)
{
if (d->m_usedImportList != usedImports) {
d->m_usedImportList = usedImports;
diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h
index b08b7388518..95985482548 100644
--- a/src/plugins/qmldesigner/designercore/model/model_p.h
+++ b/src/plugins/qmldesigner/designercore/model/model_p.h
@@ -202,13 +202,13 @@ public:
void resetModelByRewriter(const QString &description);
// Imports:
- const QList<Import> &imports() const { return m_imports; }
+ const Imports &imports() const { return m_imports; }
void addImport(const Import &import);
void removeImport(const Import &import);
- void changeImports(const QList<Import> &importsToBeAdded, const QList<Import> &importToBeRemoved);
- void notifyImportsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports);
- void notifyPossibleImportsChanged(const QList<Import> &possibleImports);
- void notifyUsedImportsChanged(const QList<Import> &usedImportsChanged);
+ void changeImports(const Imports &importsToBeAdded, const Imports &importToBeRemoved);
+ void notifyImportsChanged(const Imports &addedImports, const Imports &removedImports);
+ void notifyPossibleImportsChanged(const Imports &possibleImports);
+ void notifyUsedImportsChanged(const Imports &usedImportsChanged);
//node state property manipulation
void addProperty(const InternalNodePointer &node, const PropertyName &name);
@@ -269,9 +269,9 @@ private:
private:
Model *m_model = nullptr;
MetaInfo m_metaInfo;
- QList<Import> m_imports;
- QList<Import> m_possibleImportList;
- QList<Import> m_usedImportList;
+ Imports m_imports;
+ Imports m_possibleImportList;
+ Imports m_usedImportList;
QList<QPointer<AbstractView>> m_viewList;
QList<QPointer<AbstractView>> m_enabledViewList;
QList<InternalNodePointer> m_selectedInternalNodeList;
diff --git a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp
index 75cdcf83582..30d100f3503 100644
--- a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp
+++ b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp
@@ -173,7 +173,7 @@ ModelNode ModelMerger::insertModel(const ModelNode &modelNode, const MergePredic
return {};
RewriterTransaction transaction(view()->beginRewriterTransaction(QByteArrayLiteral("ModelMerger::insertModel")));
- QList<Import> newImports;
+ Imports newImports;
for (const Import &import : modelNode.model()->imports()) {
if (!view()->model()->hasImport(import, true, true))
diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
index d8088de64be..53a0f4de596 100644
--- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
@@ -261,7 +261,7 @@ void RewriterView::nodeReparented(const ModelNode &node, const NodeAbstractPrope
applyChanges();
}
-void RewriterView::importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports)
+void RewriterView::importsChanged(const Imports &addedImports, const Imports &removedImports)
{
for (const Import &import : addedImports)
importAdded(import);
diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
index 236b690bb4f..bb09d664a77 100644
--- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
+++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
@@ -19,6 +19,7 @@
#include "signalhandlerproperty.h"
#include "variantproperty.h"
#include <externaldependenciesinterface.h>
+#include <projectstorage/modulescanner.h>
#include <rewritingexception.h>
#include <enumeration.h>
@@ -44,6 +45,7 @@
#include <QSet>
#include <memory>
+#include <tuple>
using namespace LanguageUtils;
using namespace QmlJS;
@@ -716,7 +718,7 @@ bool TextToModelMerger::isActive() const
void TextToModelMerger::setupImports(const Document::Ptr &doc,
DifferenceHandler &differenceHandler)
{
- QList<Import> existingImports = m_rewriterView->model()->imports();
+ Imports existingImports = m_rewriterView->model()->imports();
m_hasVersionlessImport = false;
@@ -756,162 +758,125 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc,
differenceHandler.importAbsentInQMl(import);
}
-static bool isLatestImportVersion(const ImportKey &importKey, const QHash<QString, ImportKey> &filteredPossibleImportKeys)
+namespace {
+
+bool skipByMetaInfo(QStringView moduleName, const QStringList &skipModuleNames)
{
- return !filteredPossibleImportKeys.contains(importKey.path())
- || filteredPossibleImportKeys.value(importKey.path()).majorVersion < importKey.majorVersion
- || (filteredPossibleImportKeys.value(importKey.path()).majorVersion == importKey.majorVersion
- && filteredPossibleImportKeys.value(importKey.path()).minorVersion < importKey.minorVersion);
+ return std::any_of(skipModuleNames.begin(),
+ skipModuleNames.end(),
+ [&](const QString &skipModuleName) {
+ return moduleName.contains(skipModuleName);
+ });
}
-static bool filterByMetaInfo(const ImportKey &importKey, Model *model)
+class StartsWith : public QStringView
{
- if (model) {
- for (const QString &filter : model->metaInfo().itemLibraryInfo()->blacklistImports()) {
- if (importKey.libraryQualifiedPath().contains(filter))
- return true;
- }
+public:
+ using QStringView::QStringView;
+ bool operator()(QStringView moduleName) const { return moduleName.startsWith(*this); }
+};
+class EndsWith : public QStringView
+{
+public:
+ using QStringView::QStringView;
+ bool operator()(QStringView moduleName) const { return moduleName.endsWith(*this); }
+};
+
+class StartsAndEndsWith : public std::pair<QStringView, QStringView>
+{
+public:
+ using Base = std::pair<QStringView, QStringView>;
+ using Base::Base;
+ bool operator()(QStringView moduleName) const
+ {
+ return moduleName.startsWith(first) && moduleName.endsWith(second);
}
+};
- return false;
-}
+class Equals : public QStringView
+{
+public:
+ using QStringView::QStringView;
+ bool operator()(QStringView moduleName) const { return moduleName == *this; }
+};
-static bool isBlacklistImport(const ImportKey &importKey, Model *model)
-{
- const QString &importPathFirst = importKey.splitPath.constFirst();
- const QString &importPathLast = importKey.splitPath.constLast();
- return importPathFirst == QStringLiteral("<cpp>")
- || importPathFirst == QStringLiteral("QML")
- || importPathFirst == QStringLiteral("QtQml")
- || (importPathFirst == QStringLiteral("QtQuick") && importPathLast == QStringLiteral("PrivateWidgets"))
- || importPathLast == QStringLiteral("Private")
- || importPathLast == QStringLiteral("private")
- || importKey.libraryQualifiedPath() == QStringLiteral("QtQuick.Particles") //Unsupported
- || importKey.libraryQualifiedPath() == QStringLiteral("QtQuick.Dialogs") //Unsupported
- || importKey.libraryQualifiedPath() == QStringLiteral("QtQuick.Controls.Styles") //Unsupported
- || importKey.libraryQualifiedPath() == QStringLiteral("QtNfc") //Unsupported
- || importKey.libraryQualifiedPath() == QStringLiteral("Qt.WebSockets")
- || importKey.libraryQualifiedPath() == QStringLiteral("QtWebkit")
- || importKey.libraryQualifiedPath() == QStringLiteral("QtLocation")
- || importKey.libraryQualifiedPath() == QStringLiteral("QtWebChannel")
- || importKey.libraryQualifiedPath() == QStringLiteral("QtWinExtras")
- || importKey.libraryQualifiedPath() == QStringLiteral("QtPurchasing")
- || importKey.libraryQualifiedPath() == QStringLiteral("QtBluetooth")
- || importKey.libraryQualifiedPath() == QStringLiteral("Enginio")
-
- || filterByMetaInfo(importKey, model);
-}
-
-static QHash<QString, ImportKey> filterPossibleImportKeys(const QSet<ImportKey> &possibleImportKeys, Model *model)
-{
- QHash<QString, ImportKey> filteredPossibleImportKeys;
- for (const ImportKey &importKey : possibleImportKeys) {
- if (isLatestImportVersion(importKey, filteredPossibleImportKeys) && !isBlacklistImport(importKey, model))
- filteredPossibleImportKeys.insert(importKey.path(), importKey);
- }
+constexpr auto skipModules = std::make_tuple(EndsWith(u".impl"),
+ StartsWith(u"QML"),
+ StartsWith(u"QtQml"),
+ StartsAndEndsWith(u"QtQuick", u".PrivateWidgets"),
+ EndsWith(u".private"),
+ EndsWith(u".Private"),
+ Equals(u"QtQuick.Particles"),
+ Equals(u"QtQuick.Dialogs"),
+ Equals(u"QtQuick.Controls.Styles"),
+ Equals(u"QtNfc"),
+ Equals(u"Qt.WebSockets"),
+ Equals(u"QtWebkit"),
+ Equals(u"QtLocation"),
+ Equals(u"QtWebChannel"),
+ Equals(u"QtWinExtras"),
+ Equals(u"QtPurchasing"),
+ Equals(u"QtBluetooth"),
+ Equals(u"Enginio"));
- return filteredPossibleImportKeys;
+bool skipModule(QStringView moduleName)
+{
+ return std::apply([=](const auto &...skipModule) { return (skipModule(moduleName) || ...); },
+ skipModules);
}
-static void removeUsedImports(QHash<QString, ImportKey> &filteredPossibleImportKeys, const QList<QmlJS::Import> &usedImports)
+bool skipModule(QStringView moduleName, const QStringList &skipModuleNames)
{
- for (const QmlJS::Import &import : usedImports)
- filteredPossibleImportKeys.remove(import.info.path());
+ return skipModule(moduleName) || skipByMetaInfo(moduleName, skipModuleNames);
}
-static QList<QmlDesigner::Import> generatePossibleFileImports(const QString &path,
- const QList<QmlJS::Import> &usedImports)
+void collectPossibleFileImports(const QString &checkPath,
+ QSet<QString> usedImportsSet,
+ QList<QmlDesigner::Import> &possibleImports)
{
- QSet<QString> usedImportsSet;
- for (const QmlJS::Import &i : usedImports)
- usedImportsSet.insert(i.info.path());
-
- QList<QmlDesigner::Import> possibleImports;
const QStringList qmlList("*.qml");
const QStringList qmldirList("qmldir");
-
- QStringList fileImportPaths;
const QChar delimeter('/');
- std::function<void(const QString &)> checkDir;
- checkDir = [&](const QString &checkPath) {
-
- if (QFileInfo(checkPath).isRoot())
- return;
+ if (QFileInfo(checkPath).isRoot())
+ return;
- const QStringList entries = QDir(checkPath).entryList(QDir::Dirs | QDir::NoDot | QDir::NoDotDot);
- const QString checkPathDelim = checkPath + delimeter;
- for (const QString &entry : entries) {
- QDir dir(checkPathDelim + entry);
- const QString dirPath = dir.path();
- if (!dir.entryInfoList(qmlList, QDir::Files).isEmpty()
- && dir.entryInfoList(qmldirList, QDir::Files).isEmpty()
- && !usedImportsSet.contains(dirPath)) {
- const QString importName = dir.path().mid(path.size() + 1);
- QmlDesigner::Import import = QmlDesigner::Import::createFileImport(importName);
- possibleImports.append(import);
- }
- checkDir(dirPath);
+ const QStringList entries = QDir(checkPath).entryList(QDir::Dirs | QDir::NoDot | QDir::NoDotDot);
+ const QString checkPathDelim = checkPath + delimeter;
+ for (const QString &entry : entries) {
+ QDir dir(checkPathDelim + entry);
+ const QString dirPath = dir.path();
+ if (!dir.entryInfoList(qmlList, QDir::Files).isEmpty()
+ && dir.entryInfoList(qmldirList, QDir::Files).isEmpty()
+ && !usedImportsSet.contains(dirPath)) {
+ const QString importName = dir.path().mid(checkPath.size() + 1);
+ QmlDesigner::Import import = QmlDesigner::Import::createFileImport(importName);
+ possibleImports.append(import);
}
- };
- checkDir(path);
-
- return possibleImports;
+ collectPossibleFileImports(dirPath, usedImportsSet, possibleImports);
+ }
}
-static QList<QmlDesigner::Import> generatePossibleLibraryImports(const QHash<QString, ImportKey> &filteredPossibleImportKeys)
+QList<QmlDesigner::Import> generatePossibleFileImports(const QString &path,
+ const QList<QmlJS::Import> &usedImports)
{
- QList<QmlDesigner::Import> possibleImports;
- QSet<QString> controlsImplVersions;
- bool hasVersionedControls = false;
- bool hasVersionlessControls = false;
- const QString controlsName = "QtQuick.Controls";
- const QString controlsImplName = "QtQuick.Controls.impl";
-
- for (const ImportKey &importKey : filteredPossibleImportKeys) {
- QString libraryName = importKey.splitPath.join(QLatin1Char('.'));
- int majorVersion = importKey.majorVersion;
- if (majorVersion >= 0) {
- int minorVersion = (importKey.minorVersion == LanguageUtils::ComponentVersion::NoVersion) ? 0 : importKey.minorVersion;
-
- if (libraryName.contains("QtQuick.Studio")) {
- majorVersion = 1;
- minorVersion = 0;
- }
+ QSet<QString> usedImportsSet;
+ for (const QmlJS::Import &i : usedImports)
+ usedImportsSet.insert(i.info.path());
- QString version = QStringLiteral("%1.%2").arg(majorVersion).arg(minorVersion);
- if (!libraryName.endsWith(".impl"))
- possibleImports.append(QmlDesigner::Import::createLibraryImport(libraryName, version));
-
- // In Qt6, QtQuick.Controls itself doesn't have any version as it has no types,
- // so it never gets added normally to possible imports.
- // We work around this by injecting corresponding QtQuick.Controls version for each
- // found impl version, if no valid QtQuick.Controls versions are found.
- if (!hasVersionedControls) {
- if (libraryName == controlsImplName)
- controlsImplVersions.insert(version);
- else if (libraryName == controlsName)
- hasVersionedControls = true;
- }
- } else if (!hasVersionlessControls && libraryName == controlsName) {
- // If QtQuick.Controls module is not included even in non-versioned, it means
- // QtQuick.Controls is either in use or not available at all,
- // so we shouldn't inject it.
- hasVersionlessControls = true;
- }
- }
+ QList<QmlDesigner::Import> possibleImports;
- if (hasVersionlessControls && !hasVersionedControls && !controlsImplVersions.isEmpty()) {
- for (const auto &version : std::as_const(controlsImplVersions))
- possibleImports.append(QmlDesigner::Import::createLibraryImport(controlsName, version));
- }
+ QStringList fileImportPaths;
+ collectPossibleFileImports(path, usedImportsSet, possibleImports);
return possibleImports;
}
-void TextToModelMerger::setupPossibleImports(const QmlJS::Snapshot &snapshot, const QmlJS::ViewerContext &viewContext)
+} // namespace
+
+void TextToModelMerger::setupPossibleImports()
{
if (!m_rewriterView->possibleImportsEnabled())
return;
@@ -919,27 +884,25 @@ void TextToModelMerger::setupPossibleImports(const QmlJS::Snapshot &snapshot, co
static QUrl lastProjectUrl;
auto &externalDependencies = m_rewriterView->externalDependencies();
auto projectUrl = externalDependencies.projectUrl();
-
- if (m_possibleImportKeys.isEmpty() || projectUrl != lastProjectUrl)
- m_possibleImportKeys = snapshot.importDependencies()->libraryImports(viewContext);
+ auto allUsedImports = m_scopeChain->context()->imports(m_document.data())->all();
+
+ if (m_possibleModules.isEmpty() || projectUrl != lastProjectUrl) {
+ const auto skipModuleNames = m_rewriterView->model()->metaInfo().itemLibraryInfo()->blacklistImports();
+ ModuleScanner moduleScanner{
+ [&](QStringView moduleName) { return skipModule(moduleName, skipModuleNames); }};
+ moduleScanner.scan(m_rewriterView->externalDependencies().modulePaths());
+ m_possibleModules = moduleScanner.modules();
+ }
lastProjectUrl = projectUrl;
- QHash<QString, ImportKey> filteredPossibleImportKeys = filterPossibleImportKeys(
- m_possibleImportKeys, m_rewriterView->model());
-
- const QmlJS::Imports *imports = m_scopeChain->context()->imports(m_document.data());
- if (imports)
- removeUsedImports(filteredPossibleImportKeys, imports->all());
-
- QList<QmlDesigner::Import> possibleImports = generatePossibleLibraryImports(filteredPossibleImportKeys);
+ auto modules = m_possibleModules;
if (document()->fileName() != "<internal>")
- possibleImports.append(
- generatePossibleFileImports(document()->path().toString(), imports->all()));
+ modules.append(generatePossibleFileImports(document()->path().toString(), allUsedImports));
if (m_rewriterView->isAttached())
- m_rewriterView->model()->setPossibleImports(possibleImports);
+ m_rewriterView->model()->setPossibleImports(modules);
}
void TextToModelMerger::setupUsedImports()
@@ -951,7 +914,7 @@ void TextToModelMerger::setupUsedImports()
const QList<QmlJS::Import> allImports = imports->all();
QSet<QString> usedImportsSet;
- QList<Import> usedImports;
+ Imports usedImports;
// populate usedImportsSet from current model nodes
const QList<ModelNode> allModelNodes = m_rewriterView->allModelNodes();
@@ -964,9 +927,6 @@ void TextToModelMerger::setupUsedImports()
for (const QmlJS::Import &import : allImports) {
QString version = import.info.version().toString();
- if (!import.info.version().isValid())
- version = getHighestPossibleImport(import.info.name());
-
if (!import.info.name().isEmpty() && usedImportsSet.contains(import.info.name())) {
if (import.info.type() == ImportType::Library)
usedImports.append(
@@ -1077,7 +1037,7 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH
collectLinkErrors(&errors, ctxt);
}
- setupPossibleImports(snapshot, m_vContext);
+ setupPossibleImports();
qCInfo(rewriterBenchmark) << "possible imports:" << time.elapsed();
@@ -1115,12 +1075,6 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH
setActive(false);
- // Clear possible imports cache if code model hasn't settled yet
- const int importKeysSize = m_possibleImportKeys.size();
- if (m_previousPossibleImportsSize != importKeysSize)
- m_possibleImportKeys.clear();
- m_previousPossibleImportsSize = importKeysSize;
-
return true;
} catch (Exception &e) {
DocumentMessage error(&e);
@@ -2387,8 +2341,8 @@ QList<QmlTypeData> TextToModelMerger::getQMLSingletons() const
void TextToModelMerger::clearPossibleImportKeys()
{
- m_possibleImportKeys.clear();
- m_previousPossibleImportsSize = -1;
+ m_possibleModules.clear();
+ m_previousPossibleModulesSize = -1;
}
QString TextToModelMerger::textAt(const Document::Ptr &doc,
@@ -2403,19 +2357,3 @@ QString TextToModelMerger::textAt(const Document::Ptr &doc,
{
return doc->source().mid(from.offset, to.end() - from.begin());
}
-
-QString TextToModelMerger::getHighestPossibleImport(const QString &importName) const
-{
- QString version = "2.15";
- int maj = -1;
- const auto imports = m_possibleImportKeys.values();
- for (const ImportKey &import : imports) {
- if (importName == import.libraryQualifiedPath()) {
- if (import.majorVersion > maj) {
- version = QString("%1.%2").arg(import.majorVersion).arg(import.minorVersion);
- maj = import.majorVersion;
- }
- }
- }
- return version;
-}
diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h
index 5ed2e24c7a4..50b3a423678 100644
--- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h
+++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h
@@ -37,7 +37,7 @@ public:
bool isActive() const;
void setupImports(const QmlJS::Document::Ptr &doc, DifferenceHandler &differenceHandler);
- void setupPossibleImports(const QmlJS::Snapshot &snapshot, const QmlJS::ViewerContext &viewContext);
+ void setupPossibleImports();
void setupUsedImports();
bool load(const QString &data, DifferenceHandler &differenceHandler);
@@ -137,8 +137,6 @@ private:
const QmlJS::SourceLocation &from,
const QmlJS::SourceLocation &to);
- QString getHighestPossibleImport(const QString &importName) const;
-
private:
RewriterView *m_rewriterView;
bool m_isActive;
@@ -150,8 +148,8 @@ private:
QSet<ModelNode> m_clearImplicitComponentList;
QmlJS::ViewerContext m_vContext;
QSet<QPair<QString, QString> > m_qrcMapping;
- QSet<QmlJS::ImportKey> m_possibleImportKeys;
- int m_previousPossibleImportsSize = -1;
+ Imports m_possibleModules;
+ int m_previousPossibleModulesSize = -1;
bool m_hasVersionlessImport = false;
};
diff --git a/src/plugins/qmldesigner/designercore/projectstorage/modulescanner.cpp b/src/plugins/qmldesigner/designercore/projectstorage/modulescanner.cpp
new file mode 100644
index 00000000000..5fd70bfdd35
--- /dev/null
+++ b/src/plugins/qmldesigner/designercore/projectstorage/modulescanner.cpp
@@ -0,0 +1,73 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#include "modulescanner.h"
+
+#ifdef QDS_HAS_QMLPRIVATE
+#include <private/qqmldirparser_p.h>
+#endif
+
+#include <QFile>
+
+#include <filesystem>
+
+namespace QmlDesigner {
+
+namespace {
+
+std::optional<QString> contentAsQString(const QString &filePath)
+{
+ QFile file{filePath};
+ if (file.open(QIODevice::ReadOnly))
+ return {QString::fromUtf8(file.readAll())};
+
+ return {};
+}
+
+} // namespace
+
+void ModuleScanner::scan(const QStringList &modulePaths)
+{
+ for (const QString &modulePath : modulePaths)
+ scan(modulePath.toStdString());
+}
+
+void ModuleScanner::scan(std::string_view modulePath)
+{
+#ifdef QDS_HAS_QMLPRIVATE
+ try {
+ const std::filesystem::path installDirectoryPath{modulePath};
+
+ auto current = std::filesystem::recursive_directory_iterator{installDirectoryPath};
+ auto end = std::filesystem::end(current);
+
+ for (; current != end; ++current) {
+ const auto &entry = *current;
+ auto path = entry.path();
+
+ if (path.filename() == "qmldir") {
+ QQmlDirParser parser;
+
+ auto content = contentAsQString(QString::fromStdU16String(path.u16string()));
+ if (!content)
+ continue;
+
+ bool hasError = parser.parse(*content);
+ if (hasError)
+ continue;
+
+ auto moduleName = parser.typeNamespace();
+
+ if (moduleName.isEmpty() || m_skip(moduleName))
+ continue;
+
+ m_modules.push_back(Import::createLibraryImport(moduleName));
+ }
+ }
+ } catch (const std::filesystem::filesystem_error &) {
+ return;
+ }
+#endif
+}
+
+} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/designercore/projectstorage/modulescanner.h b/src/plugins/qmldesigner/designercore/projectstorage/modulescanner.h
new file mode 100644
index 00000000000..3c03f9cd36d
--- /dev/null
+++ b/src/plugins/qmldesigner/designercore/projectstorage/modulescanner.h
@@ -0,0 +1,37 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#pragma once
+
+#include <qmldesignercorelib_global.h>
+
+#include <import.h>
+
+#include <optional>
+
+namespace QmlDesigner {
+
+class QMLDESIGNERCORE_EXPORT ModuleScanner
+{
+public:
+ using SkipFunction = std::function<bool(QStringView)>;
+
+ ModuleScanner(SkipFunction skip)
+ : m_skip{std::move(skip)}
+ {
+ m_modules.reserve(128);
+ }
+
+ void scan(const QStringList &modulePaths);
+
+ const Imports &modules() const { return m_modules; }
+
+private:
+ void scan(std::string_view modulePaths);
+
+private:
+ SkipFunction m_skip;
+ Imports m_modules;
+};
+
+} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp b/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp
index 97aac6a8577..894299e7958 100644
--- a/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp
+++ b/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.cpp
@@ -10,7 +10,7 @@
#include <sqlitedatabase.h>
-#ifdef QDS_HAS_QMLDOM
+#ifdef QDS_HAS_QMLPRIVATE
#include <private/qqmldomtop_p.h>
#endif
@@ -19,7 +19,7 @@
namespace QmlDesigner {
-#ifdef QDS_HAS_QMLDOM
+#ifdef QDS_HAS_QMLPRIVATE
namespace QmlDom = QQmlJS::Dom;
diff --git a/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.h b/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.h
index 744825aadc5..87fb03ddaba 100644
--- a/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.h
+++ b/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.h
@@ -18,7 +18,7 @@ public:
using ProjectStorage = QmlDesigner::ProjectStorage<Sqlite::Database>;
using PathCache = QmlDesigner::SourcePathCache<ProjectStorage, NonLockingMutex>;
-#ifdef QDS_HAS_QMLDOM
+#ifdef QDS_HAS_QMLPRIVATE
QmlDocumentParser(ProjectStorage &storage, PathCache &pathCache)
: m_storage{storage}
, m_pathCache{pathCache}
@@ -35,7 +35,7 @@ public:
private:
// m_pathCache and m_storage are only used when compiled for QDS
-#ifdef QDS_HAS_QMLDOM
+#ifdef QDS_HAS_QMLPRIVATE
ProjectStorage &m_storage;
PathCache &m_pathCache;
#endif
diff --git a/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp b/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp
index bca7b3279d8..3ed15639982 100644
--- a/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp
+++ b/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp
@@ -8,7 +8,7 @@
#include <sqlitedatabase.h>
-#ifdef QDS_HAS_QMLDOM
+#ifdef QDS_HAS_QMLPRIVATE
#include <private/qqmldomtop_p.h>
#include <private/qqmljstypedescriptionreader_p.h>
#endif
@@ -20,7 +20,7 @@
namespace QmlDesigner {
-#ifdef QDS_HAS_QMLDOM
+#ifdef QDS_HAS_QMLPRIVATE
namespace QmlDom = QQmlJS::Dom;
diff --git a/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.h b/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.h
index 902d3c5a44f..522e5d3292e 100644
--- a/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.h
+++ b/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.h
@@ -24,7 +24,7 @@ public:
using ProjectStorage = QmlDesigner::ProjectStorage<Sqlite::Database>;
using PathCache = QmlDesigner::SourcePathCache<ProjectStorage, NonLockingMutex>;
-#ifdef QDS_HAS_QMLDOM
+#ifdef QDS_HAS_QMLPRIVATE
QmlTypesParser(PathCache &pathCache, ProjectStorage &storage)
: m_pathCache{pathCache}
, m_storage{storage}
@@ -41,7 +41,7 @@ public:
private:
// m_pathCache and m_storage are only used when compiled for QDS
-#ifdef QDS_HAS_QMLDOM
+#ifdef QDS_HAS_QMLPRIVATE
PathCache &m_pathCache;
ProjectStorage &m_storage;
#endif
diff --git a/src/plugins/qmldesigner/qmldesignerexternaldependencies.cpp b/src/plugins/qmldesigner/qmldesignerexternaldependencies.cpp
index a3fdc762448..71c5379cda6 100644
--- a/src/plugins/qmldesigner/qmldesignerexternaldependencies.cpp
+++ b/src/plugins/qmldesigner/qmldesignerexternaldependencies.cpp
@@ -9,9 +9,11 @@
#include <edit3d/edit3dviewconfig.h>
#include <itemlibraryimport.h>
#include <projectexplorer/kit.h>
+#include <projectexplorer/project.h>
#include <projectexplorer/session.h>
#include <projectexplorer/target.h>
#include <puppetenvironmentbuilder.h>
+#include <qmlprojectmanager/qmlproject.h>
#include <qmlpuppetpaths.h>
#include <qtsupport/baseqtversion.h>
#include <qtsupport/qtkitinformation.h>
@@ -186,4 +188,50 @@ Utils::FilePath ExternalDependencies::qmlPuppetPath() const
return puppetPath;
}
+namespace {
+
+QString qmlPath(ProjectExplorer::Target *target)
+{
+ auto kit = target->kit();
+
+ if (!kit)
+ return {};
+
+ auto qtVersion = QtSupport::QtKitAspect::qtVersion(kit);
+ if (!qtVersion)
+ return {};
+
+ return qtVersion->qmlPath().toString();
+}
+} // namespace
+
+QStringList ExternalDependencies::modulePaths() const
+{
+ QStringList modulePaths;
+
+ auto project = ProjectExplorer::SessionManager::startupProject();
+
+ if (!project)
+ return modulePaths;
+
+ auto target = project->activeTarget();
+
+ if (!target)
+ return modulePaths;
+
+ if (auto path = qmlPath(target); !path.isEmpty())
+ modulePaths.push_back(path);
+
+ const auto qmlBuildSystem = qobject_cast<QmlProjectManager::QmlBuildSystem *>(
+ target->buildSystem());
+
+ if (!qmlBuildSystem)
+ return modulePaths;
+
+ for (const QString &modulePath : qmlBuildSystem->customImportPaths())
+ modulePaths.append(project->projectDirectory().pathAppended(modulePath).toString());
+
+ return modulePaths;
+}
+
} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/qmldesignerexternaldependencies.h b/src/plugins/qmldesigner/qmldesignerexternaldependencies.h
index 3e57847ce9d..b19ad0ae111 100644
--- a/src/plugins/qmldesigner/qmldesignerexternaldependencies.h
+++ b/src/plugins/qmldesigner/qmldesignerexternaldependencies.h
@@ -36,6 +36,7 @@ public:
PuppetStartData puppetStartData(const class Model &model) const override;
bool instantQmlTextUpdate() const override;
Utils::FilePath qmlPuppetPath() const override;
+ QStringList modulePaths() const override;
private:
const DesignerSettings &m_designerSettings;
diff --git a/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp b/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp
index e6a02fecab7..67144a813b4 100644
--- a/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp
+++ b/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp
@@ -342,7 +342,7 @@ void projectQmldirPaths(::ProjectExplorer::Target *target, QStringList &qmldirPa
qmldirPaths.push_back(QDir::cleanPath(pojectDirectory.absoluteFilePath(importPath))
+ "/qmldir");
}
-#ifdef QDS_HAS_QMLDOM
+#ifdef QDS_HAS_QMLPRIVATE
bool skipPath(const std::filesystem::path &path)
{
auto directory = path.filename();
@@ -359,25 +359,27 @@ bool skipPath(const std::filesystem::path &path)
}
#endif
-void qtQmldirPaths([[maybe_unused]] ::ProjectExplorer::Target *target,
- [[maybe_unused]] QStringList &qmldirPaths)
+void qtQmldirPaths(::ProjectExplorer::Target *target, QStringList &qmldirPaths)
{
-#ifdef QDS_HAS_QMLDOM
- const QString installDirectory = qmlPath(target).toString();
+#ifdef QDS_HAS_QMLPRIVATE
- const std::filesystem::path installDirectoryPath{installDirectory.toStdString()};
+ if (useProjectStorage()) {
+ const QString installDirectory = qmlPath(target).toString();
- auto current = std::filesystem::recursive_directory_iterator{installDirectoryPath};
- auto end = std::filesystem::end(current);
- for (; current != end; ++current) {
- const auto &entry = *current;
- auto path = entry.path();
- if (current.depth() < 3 && !current->is_regular_file() && skipPath(path)) {
- current.disable_recursion_pending();
- continue;
- }
- if (path.filename() == "qmldir") {
- qmldirPaths.push_back(QString::fromStdU16String(path.generic_u16string()));
+ const std::filesystem::path installDirectoryPath{installDirectory.toStdString()};
+
+ auto current = std::filesystem::recursive_directory_iterator{installDirectoryPath};
+ auto end = std::filesystem::end(current);
+ for (; current != end; ++current) {
+ const auto &entry = *current;
+ auto path = entry.path();
+ if (current.depth() < 3 && !current->is_regular_file() && skipPath(path)) {
+ current.disable_recursion_pending();
+ continue;
+ }
+ if (path.filename() == "qmldir") {
+ qmldirPaths.push_back(QString::fromStdU16String(path.generic_u16string()));
+ }
}
}
#endif
diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp
index 7850d4512a0..0efa20ff8a2 100644
--- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp
+++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp
@@ -160,6 +160,7 @@ public:
PuppetStartData puppetStartData(const class Model &) const override { return {}; }
bool instantQmlTextUpdate() const override { return true; }
Utils::FilePath qmlPuppetPath() const override { return {}; }
+ QStringList modulePaths() const override { return {}; }
public:
QSettings qsettings;
@@ -1074,10 +1075,10 @@ void tst_TestCore::testRewriterChangeImports()
//
Import webkitImport = Import::createLibraryImport("QtWebKit", "1.0");
- QList<Import> importList;
+ Imports importList;
importList << webkitImport;
- model->changeImports(importList, QList<Import>());
+ model->changeImports(importList, Imports());
const QLatin1String qmlWithImport("\n"
"import QtQuick 2.1\n"
@@ -1086,7 +1087,7 @@ void tst_TestCore::testRewriterChangeImports()
"Rectangle {}\n");
QCOMPARE(textEdit.toPlainText(), qmlWithImport);
- model->changeImports(QList<Import>(), importList);
+ model->changeImports(Imports(), importList);
QCOMPARE(model->imports().size(), 1);
QCOMPARE(model->imports().first(), Import::createLibraryImport("QtQuick", "2.1"));
@@ -1100,7 +1101,7 @@ void tst_TestCore::testRewriterChangeImports()
Import webkitImportAlias = Import::createLibraryImport("QtWebKit", "1.0", "Web");
- model->changeImports(QList<Import>() << webkitImportAlias, QList<Import>() << webkitImport);
+ model->changeImports(Imports() << webkitImportAlias, Imports() << webkitImport);
const QLatin1String qmlWithAliasImport("\n"
"import QtQuick 2.1\n"
@@ -1109,7 +1110,7 @@ void tst_TestCore::testRewriterChangeImports()
"Rectangle {}\n");
QCOMPARE(textEdit.toPlainText(), qmlWithAliasImport);
- model->changeImports(QList<Import>(), QList<Import>() << webkitImportAlias);
+ model->changeImports(Imports(), Imports() << webkitImportAlias);
QCOMPARE(model->imports().first(), Import::createLibraryImport("QtQuick", "2.1"));
QCOMPARE(textEdit.toPlainText(), qmlString);
diff --git a/tests/unit/unittest/CMakeLists.txt b/tests/unit/unittest/CMakeLists.txt
index 3df9686e906..8d3898d7f7c 100644
--- a/tests/unit/unittest/CMakeLists.txt
+++ b/tests/unit/unittest/CMakeLists.txt
@@ -25,7 +25,7 @@ add_qtc_test(unittest GTEST
BEFORE "../mockup/qmldesigner/designercore/include"
DEPENDS
Qt::Core Qt::Network Qt::Widgets
- Qt::Xml Qt::Concurrent Qt::Qml Qt::Gui
+ Qt::Xml Qt::Concurrent Qt::QmlPrivate Qt::Gui
Qt6Core5Compat QmlJS Sqlite SqliteC
Googletest
DEFINES
@@ -36,6 +36,7 @@ add_qtc_test(unittest GTEST
QTC_RESOURCE_DIR="${CMAKE_CURRENT_LIST_DIR}/../../../share/qtcreator"
TESTDATA_DIR="${CMAKE_CURRENT_BINARY_DIR}/data"
TEST_RELATIVE_LIBEXEC_PATH="${TEST_RELATIVE_LIBEXEC_PATH}"
+ QT6_INSTALL_PREFIX="${QT6_INSTALL_PREFIX}"
SOURCES
abstractviewmock.h
compare-operators.h
@@ -97,6 +98,7 @@ add_qtc_test(unittest GTEST
mockimagecachestorage.h
asynchronousexplicitimagecache-test.cpp
asynchronousimagefactory-test.cpp
+ modulescanner-test.cpp
)
if (NOT TARGET unittest)
@@ -250,6 +252,7 @@ extend_qtc_test(unittest
projectstorage/filesystem.cpp projectstorage/filesystem.h
projectstorage/filestatus.h
projectstorage/filestatuscache.cpp projectstorage/filestatuscache.h
+ projectstorage/modulescanner.cpp projectstorage/modulescanner.h
projectstorage/nonlockingmutex.h
projectstorage/projectstorageexceptions.cpp projectstorage/projectstorageexceptions.h
projectstorage/projectstorageinterface.h
@@ -335,7 +338,7 @@ extend_qtc_test(unittest
CONDITION TARGET Qt6::QmlDomPrivate AND TARGET Qt6::QmlCompilerPrivate AND Qt6_VERSION VERSION_GREATER_EQUAL 6.5.0
SOURCES_PREFIX "${QmlDesignerDir}/designercore"
DEPENDS Qt6::QmlDomPrivate Qt6::QmlCompilerPrivate
- DEFINES QDS_HAS_QMLDOM
+ DEFINES QDS_HAS_QMLPRIVATE
SOURCES
projectstorage/qmldocumentparser.cpp projectstorage/qmldocumentparser.h
projectstorage/qmltypesparser.cpp projectstorage/qmltypesparser.h
diff --git a/tests/unit/unittest/google-using-declarations.h b/tests/unit/unittest/google-using-declarations.h
index 67e887c696d..85fc82282f6 100644
--- a/tests/unit/unittest/google-using-declarations.h
+++ b/tests/unit/unittest/google-using-declarations.h
@@ -5,7 +5,6 @@
#include <gmock/gmock.h>
-
using testing::_;
using testing::A;
using testing::AllOf;
@@ -21,6 +20,7 @@ using testing::ByRef;
using testing::ContainerEq;
using testing::Contains;
using testing::ElementsAre;
+using testing::EndsWith;
using testing::Eq;
using testing::Exactly;
using testing::Field;
@@ -29,7 +29,6 @@ using testing::Gt;
using testing::HasSubstr;
using testing::InSequence;
using testing::Invoke;
-using testing::IsEmpty;
using testing::IsNull;
using testing::Le;
using testing::Lt;
diff --git a/tests/unit/unittest/modulescanner-test.cpp b/tests/unit/unittest/modulescanner-test.cpp
new file mode 100644
index 00000000000..bd72d3db901
--- /dev/null
+++ b/tests/unit/unittest/modulescanner-test.cpp
@@ -0,0 +1,53 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#include "googletest.h"
+
+#include <projectstorage/modulescanner.h>
+
+#include <QDebug>
+
+namespace {
+
+template<typename Matcher>
+auto UrlProperty(const Matcher &matcher)
+{
+ return Property(&QmlDesigner::Import::url, matcher);
+}
+
+class ModuleScanner : public testing::Test
+{
+protected:
+ QmlDesigner::ModuleScanner scanner{
+ [](QStringView moduleName) { return moduleName.endsWith(u"impl"); }};
+};
+
+TEST_F(ModuleScanner, ReturnEmptyOptionalForWrongPath)
+{
+ scanner.scan(QStringList{""});
+
+ ASSERT_THAT(scanner.modules(), IsEmpty());
+}
+
+TEST_F(ModuleScanner, GetQtQuick)
+{
+ scanner.scan(QStringList{QT6_INSTALL_PREFIX});
+
+ ASSERT_THAT(scanner.modules(), Contains(UrlProperty("QtQuick")));
+}
+
+TEST_F(ModuleScanner, SkipEmptyModules)
+{
+ scanner.scan(QStringList{QT6_INSTALL_PREFIX});
+
+ ASSERT_THAT(scanner.modules(), Not(Contains(UrlProperty(IsEmpty()))));
+}
+
+TEST_F(ModuleScanner, UseSkipFunction)
+{
+ scanner.scan(QStringList{QT6_INSTALL_PREFIX});
+
+ ASSERT_THAT(scanner.modules(), Not(Contains(UrlProperty(EndsWith(QStringView{u"impl"})))));
+}
+
+} // namespace
diff --git a/tests/unit/unittest/smallstring-test.cpp b/tests/unit/unittest/smallstring-test.cpp
index d8321ec98f4..6364bd9c646 100644
--- a/tests/unit/unittest/smallstring-test.cpp
+++ b/tests/unit/unittest/smallstring-test.cpp
@@ -9,8 +9,6 @@
#include <utils/smallstringio.h>
#include <utils/smallstringvector.h>
-using namespace ::testing;
-
using Utils::PathString;
using Utils::SmallString;
using Utils::SmallStringLiteral;
diff --git a/tests/unit/unittest/unittest-matchers.h b/tests/unit/unittest/unittest-matchers.h
index 12f47074835..0f59a5e79a8 100644
--- a/tests/unit/unittest/unittest-matchers.h
+++ b/tests/unit/unittest/unittest-matchers.h
@@ -7,7 +7,7 @@
#include <utils/smallstringio.h>
-namespace UnitTests {
+namespace Internal {
template <typename StringType>
class EndsWithMatcher
@@ -46,10 +46,68 @@ private:
const StringType m_suffix;
};
-inline
-testing::PolymorphicMatcher<EndsWithMatcher<Utils::SmallString> >
-EndsWith(const Utils::SmallString &suffix)
+class QStringEndsWithMatcher
{
- return testing::MakePolymorphicMatcher(EndsWithMatcher<Utils::SmallString>(suffix));
+public:
+ explicit QStringEndsWithMatcher(const QString &suffix)
+ : m_suffix(suffix)
+ {}
+
+ template<typename MatcheeStringType>
+ bool MatchAndExplain(const MatcheeStringType &s, testing::MatchResultListener * /* listener */) const
+ {
+ return s.endsWith(m_suffix);
+ }
+
+ void DescribeTo(::std::ostream *os) const
+ {
+ *os << "ends with " << testing::PrintToString(m_suffix);
+ }
+
+ void DescribeNegationTo(::std::ostream *os) const
+ {
+ *os << "doesn't end with " << testing::PrintToString(m_suffix);
+ }
+
+private:
+ const QString m_suffix;
+};
+
+class IsEmptyMatcher : public testing::internal::IsEmptyMatcher
+{
+public:
+ using Base = testing::internal::IsEmptyMatcher;
+
+ using Base::MatchAndExplain;
+
+ bool MatchAndExplain(const QString &s, testing::MatchResultListener *listener) const
+ {
+ if (s.isEmpty()) {
+ return true;
+ }
+
+ *listener << "whose size is " << s.size();
+ return false;
+ }
+
+ void DescribeTo(std::ostream *os) const { *os << "is empty"; }
+
+ void DescribeNegationTo(std::ostream *os) const { *os << "isn't empty"; }
+};
+
+} // namespace Internal
+
+inline auto EndsWith(const Utils::SmallString &suffix)
+{
+ return Internal::EndsWithMatcher(suffix);
}
+
+inline auto EndsWith(const QStringView &suffix)
+{
+ return ::testing::PolymorphicMatcher(Internal::QStringEndsWithMatcher(suffix.toString()));
+}
+
+inline auto IsEmpty()
+{
+ return ::testing::PolymorphicMatcher(Internal::IsEmptyMatcher());
}
diff --git a/tests/unit/unittest/unittest-utility-functions.h b/tests/unit/unittest/unittest-utility-functions.h
index a4866cfa889..090360e8a70 100644
--- a/tests/unit/unittest/unittest-utility-functions.h
+++ b/tests/unit/unittest/unittest-utility-functions.h
@@ -15,10 +15,9 @@ bool operator==(const QString &first, const char *second)
namespace UnitTest {
-inline
-Utils::PathString temporaryDirPath()
+inline ::Utils::PathString temporaryDirPath()
{
- return Utils::PathString::fromQString(Utils::TemporaryDirectory::masterDirectoryPath());
+ return ::Utils::PathString::fromQString(Utils::TemporaryDirectory::masterDirectoryPath());
}
} // namespace UnitTest