diff --git a/src/libs/sqlite/sqliteids.h b/src/libs/sqlite/sqliteids.h index e7a4f9fbae2..6296f84718a 100644 --- a/src/libs/sqlite/sqliteids.h +++ b/src/libs/sqlite/sqliteids.h @@ -19,8 +19,6 @@ public: constexpr explicit BasicId() = default; - constexpr BasicId(const char *) = delete; - static constexpr BasicId create(InternalIntegerType idNumber) { BasicId id; diff --git a/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp b/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp index 7b0604c19a8..2cc6606efa1 100644 --- a/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp +++ b/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp @@ -4,12 +4,13 @@ #include "componentexporter.h" #include "exportnotification.h" -#include "designdocument.h" -#include "nodemetainfo.h" -#include "qmldesignerplugin.h" -#include "rewriterview.h" -#include "qmlitemnode.h" -#include "qmlobjectnode.h" +#include +#include +#include +#include +#include +#include +#include #include #include @@ -340,12 +341,11 @@ QString AssetExporter::componentUuid(const ModelNode &instance) const // Returns the UUID of the component's root node // Empty string is returned if the node is not an instance of a component within // the project. - NodeMetaInfo metaInfo = instance.metaInfo(); - if (!metaInfo.isValid()) - return {}; - const QString path = metaInfo.componentFileName(); - if (m_componentUuidCache.contains(path)) - return m_componentUuidCache[path]; + if (instance) { + const QString path = ModelUtils::componentFilePath(instance); + return m_componentUuidCache.value(path); + } + return {}; } diff --git a/src/plugins/qmldesigner/assetexporterplugin/componentexporter.cpp b/src/plugins/qmldesigner/assetexporterplugin/componentexporter.cpp index 7ec9841198a..701e9fdd244 100644 --- a/src/plugins/qmldesigner/assetexporterplugin/componentexporter.cpp +++ b/src/plugins/qmldesigner/assetexporterplugin/componentexporter.cpp @@ -28,7 +28,7 @@ static QByteArrayList populateLineage(const QmlDesigner::ModelNode &node) if (!node.isValid() || node.type().isEmpty()) return {}; - for (auto &info : node.metaInfo().superClasses()) + for (auto &info : node.metaInfo().prototypes()) lineage.append(info.typeName()); return lineage; diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp index 7ff4e6f8722..75976fd7210 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp @@ -3,13 +3,14 @@ #include "modelnodecontextmenu_helper.h" -#include -#include -#include #include +#include +#include +#include #include -#include #include +#include +#include #include @@ -76,10 +77,11 @@ bool selectionHasSameParent(const SelectionContext &selectionState) bool fileComponentExists(const ModelNode &modelNode) { - if (!modelNode.metaInfo().isFileComponent()) + if (!modelNode.metaInfo().isFileComponent()) { return true; + } - const QString fileName = modelNode.metaInfo().componentFileName(); + const QString fileName = ModelUtils::componentFilePath(modelNode); if (fileName.contains("qml/QtQuick")) return false; @@ -97,7 +99,8 @@ bool selectionIsImported3DAsset(const SelectionContext &selectionState) { ModelNode node = selectionState.currentSingleSelectedNode(); if (selectionState.view() && node.hasMetaInfo()) { - QString fileName = node.metaInfo().componentFileName(); // absolute path + QString fileName = ModelUtils::componentFilePath(node); + if (fileName.isEmpty()) { // Node is not a file component, so we have to check if the current doc itself is fileName = node.model()->fileUrl().toLocalFile(); diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarybundleimporter.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarybundleimporter.cpp index c31f844e5e2..59ec457d071 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarybundleimporter.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarybundleimporter.cpp @@ -205,7 +205,7 @@ void ContentLibraryBundleImporter::handleImportTimer() for (const QString &pendingType : pendingTypes) { NodeMetaInfo metaInfo = model->metaInfo(pendingType.toUtf8()); const bool isImport = m_pendingTypes[pendingType]; - const bool typeComplete = metaInfo.isValid() && !metaInfo.superClasses().empty(); + const bool typeComplete = metaInfo.isValid() && !metaInfo.prototypes().empty(); if (isImport == typeComplete) { m_pendingTypes.remove(pendingType); if (isImport) diff --git a/src/plugins/qmldesigner/components/debugview/debugview.cpp b/src/plugins/qmldesigner/components/debugview/debugview.cpp index 2a62d7a6b2b..64f85915f16 100644 --- a/src/plugins/qmldesigner/components/debugview/debugview.cpp +++ b/src/plugins/qmldesigner/components/debugview/debugview.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -93,9 +94,9 @@ void DebugView::nodeCreated(const ModelNode &createdNode) message << createdNode.majorVersion() << "." << createdNode.minorVersion(); message << createdNode.nodeSource(); message << "MetaInfo " << createdNode.metaInfo().isValid() << " "; - if (createdNode.metaInfo().isValid()) { - message << createdNode.metaInfo().majorVersion() << "." << createdNode.metaInfo().minorVersion(); - message << createdNode.metaInfo().componentFileName(); + if (auto metaInfo = createdNode.metaInfo()) { + message << metaInfo.majorVersion() << "." << metaInfo.minorVersion(); + message << ModelUtils::componentFilePath(createdNode); } log("::nodeCreated:", message.readAll()); } @@ -282,9 +283,10 @@ void DebugView::selectedNodesChanged(const QList &selectedNodes /*sel message << lineBreak; if (selectedNode.metaInfo().isValid()) { - for (const NodeMetaInfo &metaInfo : selectedNode.metaInfo().classHierarchy()) + for (const NodeMetaInfo &metaInfo : selectedNode.metaInfo().selfAndPrototypes()) { message << metaInfo.typeName() << " " << metaInfo.majorVersion() << "." << metaInfo.minorVersion() << lineBreak; + } message << lineBreak; message << selectedNode.metaInfo().typeName(); diff --git a/src/plugins/qmldesigner/components/edit3d/bakelights.cpp b/src/plugins/qmldesigner/components/edit3d/bakelights.cpp index c0ff5de2af3..88e7ad379d5 100644 --- a/src/plugins/qmldesigner/components/edit3d/bakelights.cpp +++ b/src/plugins/qmldesigner/components/edit3d/bakelights.cpp @@ -3,19 +3,20 @@ #include "bakelights.h" -#include "abstractview.h" -#include "auxiliarydataproperties.h" -#include "bakelightsdatamodel.h" -#include "bakelightsconnectionmanager.h" -#include "bindingproperty.h" -#include "documentmanager.h" -#include "modelnode.h" -#include "nodeabstractproperty.h" -#include "nodeinstanceview.h" -#include "nodemetainfo.h" -#include "plaintexteditmodifier.h" -#include "rewriterview.h" -#include "variantproperty.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include @@ -240,18 +241,21 @@ void BakeLights::rebake() void BakeLights::exposeModelsAndLights(const QString &nodeId) { ModelNode compNode = m_view->modelNodeForId(nodeId); - if (!compNode.isValid() || !compNode.isComponent() - || compNode.metaInfo().componentFileName().isEmpty()) { + if (!compNode.isValid() || !compNode.isComponent()) { + return; + } + + auto componentFilePath = ModelUtils::componentFilePath(compNode); + if (componentFilePath.isEmpty()) { return; } RewriterView rewriter{m_view->externalDependencies(), RewriterView::Amend}; ModelPointer compModel = QmlDesigner::Model::create("QtQuick/Item", 2, 1); - const QString compFile = compNode.metaInfo().componentFileName(); - const Utils::FilePath compFilePath = Utils::FilePath::fromString(compFile); + const Utils::FilePath compFilePath = Utils::FilePath::fromString(componentFilePath); QByteArray src = compFilePath.fileContents().value(); - compModel->setFileUrl(QUrl::fromLocalFile(compFile)); + compModel->setFileUrl(QUrl::fromLocalFile(componentFilePath)); auto textDocument = std::make_unique(QString::fromUtf8(src)); auto modifier = std::make_unique( @@ -295,12 +299,12 @@ void BakeLights::exposeModelsAndLights(const QString &nodeId) QString newText = modifier->text(); if (newText != originalText) { - QSaveFile saveFile(compFile); + QSaveFile saveFile(componentFilePath); if (saveFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { saveFile.write(newText.toUtf8()); saveFile.commit(); } else { - qWarning() << __FUNCTION__ << "Failed to save changes to:" << compFile; + qWarning() << __FUNCTION__ << "Failed to save changes to:" << componentFilePath; } } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp index f8a9fd97718..29fff4b359a 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp @@ -4,14 +4,15 @@ #include "itemlibraryassetimportdialog.h" #include "ui_itemlibraryassetimportdialog.h" -#include "qmldesignerplugin.h" -#include "qmldesignerconstants.h" -#include "model.h" -#include "nodemetainfo.h" -#include "variantproperty.h" +#include +#include +#include +#include +#include +#include -#include "utils/outputformatter.h" -#include "theme.h" +#include +#include #include #include @@ -283,7 +284,7 @@ void ItemLibraryAssetImportDialog::updateImport(const ModelNode &updateNode, QString errorMsg; const ModelNode &node = updateNode; if (node.hasMetaInfo()) { - QString compFileName = node.metaInfo().componentFileName(); // absolute path + QString compFileName = ModelUtils::componentFilePath(node); // absolute path bool preselectNodeSource = false; if (compFileName.isEmpty()) { // Node is not a file component, so we have to check if the current doc itself is diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp index 933686febda..7d3eb7efe6d 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp @@ -548,7 +548,7 @@ void MaterialEditorView::setupQmlBackend() TypeName diffClassName; if (NodeMetaInfo metaInfo = m_selectedMaterial.metaInfo()) { diffClassName = metaInfo.typeName(); - for (const NodeMetaInfo &metaInfo : metaInfo.classHierarchy()) { + for (const NodeMetaInfo &metaInfo : metaInfo.selfAndPrototypes()) { if (PropertyEditorQmlBackend::checkIfUrlExists(qmlSpecificsUrl)) break; qmlSpecificsUrl = PropertyEditorQmlBackend::getQmlFileUrl(metaInfo.typeName() diff --git a/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp index 304ff91fcda..62dba067713 100644 --- a/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp +++ b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp @@ -90,7 +90,7 @@ ChooseFromPropertyListFilter::ChooseFromPropertyListFilter(const NodeMetaInfo &i } else if (insertInfo.isQtQuick3DParticles3DParticle3D()) { if (parentInfo.isQtQuick3DParticles3DParticleEmitter3D()) propertyList.append("particle"); - } else if (insertInfo.isQtQuick3DParticleAbstractShape()) { + } else if (insertInfo.isQtQuick3DParticlesAbstractShape()) { if (parentInfo.isQtQuick3DParticles3DParticleEmitter3D() || parentInfo.isQtQuick3DParticles3DAttractor3D()) propertyList.append("shape"); diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index ceccf25554c..67ddbb4ea9d 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -2,28 +2,29 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "navigatorview.h" + +#include "iconcheckboxitemdelegate.h" +#include "nameitemdelegate.h" #include "navigatortreemodel.h" #include "navigatorwidget.h" -#include "qmldesignerconstants.h" -#include "qmldesignericons.h" -#include "qmldesignerplugin.h" -#include "assetslibrarywidget.h" -#include "commontypecache.h" - -#include "nameitemdelegate.h" -#include "iconcheckboxitemdelegate.h" +#include #include -#include +#include #include +#include #include -#include +#include +#include #include -#include +#include +#include +#include +#include #include #include -#include #include +#include #include #include @@ -450,7 +451,7 @@ void NavigatorView::changeToComponent(const QModelIndex &index) const ModelNode doubleClickNode = modelNodeForIndex(index); if (doubleClickNode.metaInfo().isFileComponent()) Core::EditorManager::openEditor(Utils::FilePath::fromString( - doubleClickNode.metaInfo().componentFileName()), + ModelUtils::componentFilePath(doubleClickNode)), Utils::Id(), Core::EditorManager::DoNotMakeVisible); } @@ -468,7 +469,7 @@ QAbstractItemModel *NavigatorView::currentModel() const const ProjectExplorer::FileNode *NavigatorView::fileNodeForModelNode(const ModelNode &node) const { - QString filename = node.metaInfo().componentFileName(); + QString filename = ModelUtils::componentFilePath(node); Utils::FilePath filePath = Utils::FilePath::fromString(filename); ProjectExplorer::Project *currentProject = ProjectExplorer::ProjectManager::projectForFile( filePath); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp index 3b991a5f622..eaa5ef95738 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp @@ -958,7 +958,7 @@ void PropertyEditorQmlBackend::setValueforAuxiliaryProperties(const QmlObjectNod QUrl PropertyEditorQmlBackend::getQmlUrlForMetaInfo(const NodeMetaInfo &metaInfo, TypeName &className) { if (metaInfo.isValid()) { - const NodeMetaInfos hierarchy = metaInfo.classHierarchy(); + const NodeMetaInfos hierarchy = metaInfo.selfAndPrototypes(); for (const NodeMetaInfo &info : hierarchy) { QUrl fileUrl = fileToUrl(locateQmlFile(info, QString::fromUtf8(qmlFileName(info)))); if (fileUrl.isValid()) { diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp index 5d00f373c49..ba6078a778a 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp @@ -450,7 +450,7 @@ void PropertyEditorView::setupQmlBackend() TypeName diffClassName; if (commonAncestor.isValid()) { diffClassName = commonAncestor.typeName(); - const NodeMetaInfos hierarchy = commonAncestor.classHierarchy(); + const NodeMetaInfos hierarchy = commonAncestor.selfAndPrototypes(); for (const NodeMetaInfo &metaInfo : hierarchy) { if (PropertyEditorQmlBackend::checkIfUrlExists(qmlSpecificsFile)) break; diff --git a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp index 98601ce45ed..73c3c65f30e 100644 --- a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp +++ b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp @@ -416,7 +416,7 @@ void TextureEditorView::setupQmlBackend() TypeName diffClassName; if (NodeMetaInfo metaInfo = m_selectedTexture.metaInfo()) { diffClassName = metaInfo.typeName(); - for (const NodeMetaInfo &metaInfo : metaInfo.classHierarchy()) { + for (const NodeMetaInfo &metaInfo : metaInfo.selfAndPrototypes()) { if (PropertyEditorQmlBackend::checkIfUrlExists(qmlSpecificsUrl)) break; qmlSpecificsUrl = PropertyEditorQmlBackend::getQmlFileUrl(metaInfo.typeName() diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index f220c7e4bc2..7cceb35c074 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -128,6 +128,7 @@ public: NodeMetaInfo fontMetaInfo() const; NodeMetaInfo qmlQtObjectMetaInfo() const; NodeMetaInfo qtQmlModelsListModelMetaInfo() const; + NodeMetaInfo qtQmlModelsListElementMetaInfo() const; NodeMetaInfo qtQuick3DBakedLightmapMetaInfo() const; NodeMetaInfo qtQuick3DDefaultMaterialMetaInfo() const; NodeMetaInfo qtQuick3DMaterialMetaInfo() const; @@ -214,6 +215,8 @@ public: void endDrag(); NotNullPointer projectStorage() const; + const PathCacheType &pathCache() const; + PathCacheType &pathCache(); private: template diff --git a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h index 7ccd1028bfb..153ba6ae84d 100644 --- a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h +++ b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h @@ -65,8 +65,8 @@ public: PropertyMetaInfo defaultProperty() const; bool hasDefaultProperty() const; - std::vector classHierarchy() const; - std::vector superClasses() const; + std::vector selfAndPrototypes() const; + std::vector prototypes() const; NodeMetaInfo commonBase(const NodeMetaInfo &metaInfo) const; bool defaultPropertyIsComponent() const; @@ -76,6 +76,7 @@ public: int majorVersion() const; int minorVersion() const; + SourceId sourceId() const; QString componentFileName() const; bool isBasedOn(const NodeMetaInfo &metaInfo) const; @@ -126,7 +127,6 @@ public: bool isQmlComponent() const; bool isQtMultimediaSoundEffect() const; bool isQtObject() const; - bool isQtQuick3D() const; bool isQtQuick3DBakedLightmap() const; bool isQtQuick3DBuffer() const; bool isQtQuick3DCamera() const; @@ -139,7 +139,7 @@ public: bool isQtQuick3DMaterial() const; bool isQtQuick3DModel() const; bool isQtQuick3DNode() const; - bool isQtQuick3DParticleAbstractShape() const; + bool isQtQuick3DParticlesAbstractShape() const; bool isQtQuick3DParticles3DAffector3D() const; bool isQtQuick3DParticles3DAttractor3D() const; bool isQtQuick3DParticles3DParticle3D() const; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index fee28a9dd3a..4c3e4a2e26f 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -3,66 +3,67 @@ #include "nodeinstanceview.h" -#include "abstractproperty.h" -#include "bindingproperty.h" -#include "captureddatacommand.h" -#include "changeauxiliarycommand.h" -#include "changebindingscommand.h" -#include "changefileurlcommand.h" -#include "changeidscommand.h" -#include "changelanguagecommand.h" -#include "changenodesourcecommand.h" -#include "changepreviewimagesizecommand.h" -#include "changeselectioncommand.h" -#include "changestatecommand.h" -#include "changevaluescommand.h" -#include "childrenchangedcommand.h" -#include "clearscenecommand.h" -#include "completecomponentcommand.h" -#include "componentcompletedcommand.h" -#include "connectionmanagerinterface.h" -#include "createinstancescommand.h" -#include "createscenecommand.h" -#include "debugoutputcommand.h" -#include "informationchangedcommand.h" -#include "imageutils.h" -#include "inputeventcommand.h" -#include "nodeabstractproperty.h" -#include "nodeinstanceserverproxy.h" -#include "nodelistproperty.h" -#include "pixmapchangedcommand.h" -#include "puppettocreatorcommand.h" -#include "qml3dnode.h" -#include "qmlchangeset.h" -#include "qmldesignerconstants.h" -#include "qmlstate.h" -#include "qmltimeline.h" -#include "qmltimelinekeyframegroup.h" -#include "qmlvisualnode.h" -#include "removeinstancescommand.h" -#include "removepropertiescommand.h" -#include "removesharedmemorycommand.h" -#include "reparentinstancescommand.h" -#include "scenecreatedcommand.h" -#include "statepreviewimagechangedcommand.h" -#include "tokencommand.h" -#include "update3dviewstatecommand.h" -#include "valueschangedcommand.h" -#include "variantproperty.h" -#include "view3dactioncommand.h" -#include "requestmodelnodepreviewimagecommand.h" -#include "nanotracecommand.h" -#include "nanotrace/nanotrace.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include #include #include +#include #include #include -#include #include +#include #include @@ -1077,18 +1078,20 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand() if (parentTakesOverRendering(instance.modelNode())) nodeFlags |= InstanceContainer::ParentTakesOverRendering; + const auto modelNode = instance.modelNode(); InstanceContainer container(instance.instanceId(), - instance.modelNode().type(), - instance.modelNode().majorVersion(), - instance.modelNode().minorVersion(), - instance.modelNode().metaInfo().componentFileName(), - instance.modelNode().nodeSource(), + modelNode.type(), + modelNode.majorVersion(), + modelNode.minorVersion(), + ModelUtils::componentFilePath(modelNode), + modelNode.nodeSource(), nodeSourceType, nodeMetaType, nodeFlags); - if (!parentIsBehavior(instance.modelNode())) + if (!parentIsBehavior(modelNode)) { instanceContainerList.append(container); + } } QVector reparentContainerList; @@ -1243,12 +1246,13 @@ CreateInstancesCommand NodeInstanceView::createCreateInstancesCommand(const QLis if (parentTakesOverRendering(instance.modelNode())) nodeFlags |= InstanceContainer::ParentTakesOverRendering; + const auto modelNode = instance.modelNode(); InstanceContainer container(instance.instanceId(), - instance.modelNode().type(), - instance.modelNode().majorVersion(), - instance.modelNode().minorVersion(), - instance.modelNode().metaInfo().componentFileName(), - instance.modelNode().nodeSource(), + modelNode.type(), + modelNode.majorVersion(), + modelNode.minorVersion(), + ModelUtils::componentFilePath(modelNode), + modelNode.nodeSource(), nodeSourceType, nodeMetaType, nodeFlags); @@ -1783,9 +1787,9 @@ void NodeInstanceView::requestModelNodePreviewImage(const ModelNode &node, if (renderInstance.isValid()) renderItemId = renderInstance.instanceId(); if (renderNode.isComponent()) - componentPath = renderNode.metaInfo().componentFileName(); + componentPath = ModelUtils::componentFilePath(renderNode); } else if (node.isComponent()) { - componentPath = node.metaInfo().componentFileName(); + componentPath = ModelUtils::componentFilePath(node); } const double ratio = m_externalDependencies.formEditorDevicePixelRatio(); const int dim = Constants::MODELNODE_PREVIEW_IMAGE_DIMENSIONS * ratio; diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp index ece5b4bf6f1..8cdc590135f 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp @@ -80,7 +80,7 @@ QmlDesigner::NodeHints::NodeHints(const ModelNode &node) : m_modelNode(node) if (!itemLibraryEntryList.isEmpty()) m_hints = itemLibraryEntryList.constFirst().hints(); } else { /* If we have meta information we run the complete type hierarchy and check for hints */ - const auto classHierarchy = m_modelNode.metaInfo().classHierarchy(); + const auto classHierarchy = m_modelNode.metaInfo().selfAndPrototypes(); for (const NodeMetaInfo &metaInfo : classHierarchy) { QList itemLibraryEntryList = libraryInfo->entriesForType( metaInfo.typeName(), metaInfo.majorVersion(), metaInfo.minorVersion()); diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 3836dc8d16f..0baf4319fa4 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -1591,26 +1591,25 @@ bool NodeMetaInfo::hasDefaultProperty() const return !defaultPropertyName().isEmpty(); } -NodeMetaInfos NodeMetaInfo::classHierarchy() const +std::vector NodeMetaInfo::selfAndPrototypes() const { if constexpr (useProjectStorage()) { - NodeMetaInfos hierarchy; - const auto typeIds = m_projectStorage->prototypeAndSelfIds(m_typeId); - hierarchy.reserve(typeIds.size()); - - for (TypeId typeId : typeIds) - hierarchy.emplace_back(typeId, m_projectStorage); - - return hierarchy; + if (isValid()) { + return Utils::transform( + m_projectStorage->prototypeAndSelfIds(m_typeId), [&](TypeId typeId) { + return NodeMetaInfo{typeId, m_projectStorage}; + }); + } } else { if (isValid()) { NodeMetaInfos hierarchy = {*this}; Model *model = m_privateData->model(); - for (const TypeDescription &type : m_privateData->prototypes()) + for (const TypeDescription &type : m_privateData->prototypes()) { hierarchy.emplace_back(model, type.className.toUtf8(), type.majorVersion, type.minorVersion); + } return hierarchy; } @@ -1619,17 +1618,15 @@ NodeMetaInfos NodeMetaInfo::classHierarchy() const return {}; } -NodeMetaInfos NodeMetaInfo::superClasses() const +NodeMetaInfos NodeMetaInfo::prototypes() const { if constexpr (useProjectStorage()) { - NodeMetaInfos hierarchy; - const auto typeIds = m_projectStorage->prototypeIds(m_typeId); - hierarchy.reserve(typeIds.size()); - - for (TypeId typeId : typeIds) - hierarchy.emplace_back(typeId, m_projectStorage); - - return hierarchy; + if (isValid()) { + return Utils::transform( + m_projectStorage->prototypeIds(m_typeId), [&](TypeId typeId) { + return NodeMetaInfo{typeId, m_projectStorage}; + }); + } } else { if (isValid()) { NodeMetaInfos hierarchy; @@ -1691,10 +1688,28 @@ int NodeMetaInfo::minorVersion() const return -1; } +SourceId NodeMetaInfo::sourceId() const +{ + if constexpr (useProjectStorage()) { + if (isValid()) { + return typeData().sourceId; + } + } + + return SourceId{}; +} + QString NodeMetaInfo::componentFileName() const { - if (isValid()) - return m_privateData->componentFileName(); + if constexpr (!useProjectStorage()) { + if (isValid()) { + return m_privateData->componentFileName(); + } + } else { + if (isValid()) { + return m_privateData->componentFileName(); + } + } return {}; } @@ -1736,7 +1751,7 @@ bool NodeMetaInfo::isSubclassOf(const TypeName &type, int majorVersion, int mino stringIdentifier(type, majorVersion, minorVersion))) return false; //take a shortcut - optimization - const NodeMetaInfos superClassList = superClasses(); + const NodeMetaInfos superClassList = prototypes(); for (const NodeMetaInfo &superClass : superClassList) { if (superClass.m_privateData->cleverCheckType(type)) { m_privateData->prototypeCachePositives().insert( @@ -1750,8 +1765,27 @@ bool NodeMetaInfo::isSubclassOf(const TypeName &type, int majorVersion, int mino bool NodeMetaInfo::isSuitableForMouseAreaFill() const { - return isSubclassOf("QtQuick.Item") && !isSubclassOf("QtQuick.MouseArea") - && !isSubclassOf("QtQuick.Controls.Control") && !isSubclassOf("QtQuick.Templates.Control"); + if constexpr (useProjectStorage()) { + if (!isValid()) { + return false; + } + + using namespace Storage::Info; + auto itemId = m_projectStorage->commonTypeId(); + auto mouseAreaId = m_projectStorage->commonTypeId(); + auto controlsControlId = m_projectStorage->commonTypeId(); + auto templatesControlId = m_projectStorage->commonTypeId(); + + return m_projectStorage->isBasedOn(m_typeId, + itemId, + mouseAreaId, + controlsControlId, + templatesControlId); + } else { + return isSubclassOf("QtQuick.Item") && !isSubclassOf("QtQuick.MouseArea") + && !isSubclassOf("QtQuick.Controls.Control") + && !isSubclassOf("QtQuick.Templates.Control"); + } } bool NodeMetaInfo::isBasedOn(const NodeMetaInfo &metaInfo) const @@ -1944,6 +1978,10 @@ namespace { template bool isBasedOnCommonType(NotNullPointer projectStorage, TypeId typeId) { + if (!typeId) { + return false; + } + auto base = projectStorage->commonTypeId(); return projectStorage->isBasedOn(typeId, base); @@ -1953,6 +1991,10 @@ bool isBasedOnCommonType(NotNullPointer projectStorage bool NodeMetaInfo::isGraphicalItem() const { if constexpr (useProjectStorage()) { + if (!isValid()) { + return false; + } + using namespace Storage::Info; auto itemId = m_projectStorage->commonTypeId(); auto windowId = m_projectStorage->commonTypeId(); @@ -1981,6 +2023,10 @@ bool NodeMetaInfo::isQtObject() const bool NodeMetaInfo::isLayoutable() const { if constexpr (useProjectStorage()) { + if (!isValid()) { + return false; + } + using namespace Storage::Info; auto positionerId = m_projectStorage->commonTypeId(); auto layoutId = m_projectStorage->commonTypeId(); @@ -2008,6 +2054,10 @@ bool NodeMetaInfo::isQtQuickLayoutsLayout() const bool NodeMetaInfo::isView() const { if constexpr (useProjectStorage()) { + if (!isValid()) { + return false; + } + using namespace Storage::Info; auto listViewId = m_projectStorage->commonTypeId(); auto gridViewId = m_projectStorage->commonTypeId(); @@ -2036,7 +2086,7 @@ bool NodeMetaInfo::isVector2D() const { if constexpr (useProjectStorage()) { using namespace Storage::Info; - return isTypeId(m_typeId, m_projectStorage->commonTypeId()); + return isValid() && isTypeId(m_typeId, m_projectStorage->commonTypeId()); } else { if (!m_privateData) return false; @@ -2051,7 +2101,7 @@ bool NodeMetaInfo::isVector3D() const { if constexpr (useProjectStorage()) { using namespace Storage::Info; - return isTypeId(m_typeId, m_projectStorage->commonTypeId()); + return isValid() && isTypeId(m_typeId, m_projectStorage->commonTypeId()); } else { if (!m_privateData) return false; @@ -2066,7 +2116,7 @@ bool NodeMetaInfo::isVector4D() const { if constexpr (useProjectStorage()) { using namespace Storage::Info; - return isTypeId(m_typeId, m_projectStorage->commonTypeId()); + return isValid() && isTypeId(m_typeId, m_projectStorage->commonTypeId()); } else { if (!m_privateData) return false; @@ -2152,6 +2202,10 @@ bool NodeMetaInfo::isQtQuickTimelineKeyframeGroup() const bool NodeMetaInfo::isListOrGridView() const { if constexpr (useProjectStorage()) { + if (!isValid()) { + return false; + } + using namespace Storage::Info; auto listViewId = m_projectStorage->commonTypeId(); auto gridViewId = m_projectStorage->commonTypeId(); @@ -2195,7 +2249,11 @@ bool NodeMetaInfo::isQtQuickBorderImage() const bool NodeMetaInfo::isAlias() const { - return isValid() && m_privateData->qualfiedTypeName() == "alias"; + if constexpr (useProjectStorage()) { + return false; // there is no type alias + } else { + return isValid() && m_privateData->qualfiedTypeName() == "alias"; + } } bool NodeMetaInfo::isQtQuickPositioner() const @@ -2340,7 +2398,7 @@ bool NodeMetaInfo::isQtQuick3DParticles3DAttractor3D() const } } -bool NodeMetaInfo::isQtQuick3DParticleAbstractShape() const +bool NodeMetaInfo::isQtQuick3DParticlesAbstractShape() const { if constexpr (useProjectStorage()) { using namespace Storage::Info; @@ -2455,6 +2513,10 @@ bool NodeMetaInfo::isQtMultimediaSoundEffect() const bool NodeMetaInfo::isFlowViewItem() const { if constexpr (useProjectStorage()) { + if (!isValid()) { + return false; + } + using namespace Storage::Info; auto flowItemId = m_projectStorage->commonTypeId(); auto flowWildcardId = m_projectStorage->commonTypeId(); @@ -2558,7 +2620,7 @@ bool NodeMetaInfo::isFont() const { if constexpr (useProjectStorage()) { using namespace Storage::Info; - return isTypeId(m_typeId, m_projectStorage->commonTypeId()); + return isValid() && isTypeId(m_typeId, m_projectStorage->commonTypeId()); } else { return isValid() && m_privateData->qualfiedTypeName() == "font"; } @@ -2568,7 +2630,7 @@ bool NodeMetaInfo::isColor() const { if constexpr (useProjectStorage()) { using namespace Storage::Info; - return isTypeId(m_typeId, m_projectStorage->builtinTypeId()); + return isValid() && isTypeId(m_typeId, m_projectStorage->builtinTypeId()); } else { if (!isValid()) return false; @@ -2583,14 +2645,18 @@ bool NodeMetaInfo::isEffectMaker() const { // We use arbitrary type name because at this time we don't have effect maker // specific type - return typeName() == QString::fromUtf8(Storage::Info::EffectMaker); + if constexpr (useProjectStorage()) { + return false; + } else { + return typeName() == QString::fromUtf8(Storage::Info::EffectMaker); + } } bool NodeMetaInfo::isBool() const { if constexpr (useProjectStorage()) { using namespace Storage::Info; - return isTypeId(m_typeId, m_projectStorage->builtinTypeId()); + return isValid() && isTypeId(m_typeId, m_projectStorage->builtinTypeId()); } else { if (!isValid()) return false; @@ -2605,7 +2671,7 @@ bool NodeMetaInfo::isInteger() const { if constexpr (useProjectStorage()) { using namespace Storage::Info; - return isTypeId(m_typeId, m_projectStorage->builtinTypeId()); + return isValid() && isTypeId(m_typeId, m_projectStorage->builtinTypeId()); } else { if (!isValid()) return false; @@ -2619,6 +2685,10 @@ bool NodeMetaInfo::isInteger() const bool NodeMetaInfo::isFloat() const { if constexpr (useProjectStorage()) { + if (!isValid()) { + return false; + } + using namespace Storage::Info; auto floatId = m_projectStorage->builtinTypeId(); auto doubleId = m_projectStorage->builtinTypeId(); @@ -2638,7 +2708,7 @@ bool NodeMetaInfo::isVariant() const { if constexpr (useProjectStorage()) { using namespace Storage::Info; - return isTypeId(m_typeId, m_projectStorage->builtinTypeId()); + return isValid() && isTypeId(m_typeId, m_projectStorage->builtinTypeId()); } else { return isValid() && simplifiedTypeName() == "QVariant"; } @@ -2648,7 +2718,7 @@ bool NodeMetaInfo::isString() const { if constexpr (useProjectStorage()) { using namespace Storage::Info; - return isTypeId(m_typeId, m_projectStorage->builtinTypeId()); + return isValid() && isTypeId(m_typeId, m_projectStorage->builtinTypeId()); } else { if (!isValid()) return false; @@ -2663,7 +2733,7 @@ bool NodeMetaInfo::isUrl() const { if constexpr (useProjectStorage()) { using namespace Storage::Info; - return isTypeId(m_typeId, m_projectStorage->builtinTypeId()); + return isValid() && isTypeId(m_typeId, m_projectStorage->builtinTypeId()); } else { if (!isValid()) return false; @@ -2823,7 +2893,8 @@ bool NodeMetaInfo::isQtQuick3DCubeMapTexture() const return isBasedOnCommonType(m_projectStorage, m_typeId); } else { return isValid() - && (isSubclassOf("QtQuick3D.CubeMapTexture") || isSubclassOf(".QQuick3DCubeMapTexture")); + && (isSubclassOf("QtQuick3D.CubeMapTexture") + || isSubclassOf(".QQuick3DCubeMapTexture")); } } @@ -2850,7 +2921,7 @@ bool NodeMetaInfo::isQtQuick3DEffect() const bool NodeMetaInfo::isEnumeration() const { if constexpr (useProjectStorage()) - return bool(typeData().traits & Storage::TypeTraits::IsEnum); + return isValid() && bool(typeData().traits & Storage::TypeTraits::IsEnum); return false; } @@ -3064,9 +3135,26 @@ const PropertyName &PropertyMetaInfo::propertyName() const NodeMetaInfo NodeMetaInfo::commonBase(const NodeMetaInfo &metaInfo) const { - for (const NodeMetaInfo &info : metaInfo.superClasses()) { - if (isBasedOn(info)) - return info; + if constexpr (useProjectStorage()) { + if (isValid() && metaInfo) { + const auto firstTypeIds = m_projectStorage->prototypeAndSelfIds(m_typeId); + const auto secondTypeIds = m_projectStorage->prototypeAndSelfIds(metaInfo.m_typeId); + auto found + = std::find_if(firstTypeIds.begin(), firstTypeIds.end(), [&](TypeId firstTypeId) { + return std::find(secondTypeIds.begin(), secondTypeIds.end(), firstTypeId) + != secondTypeIds.end(); + }); + + if (found != firstTypeIds.end()) { + return NodeMetaInfo{*found, m_projectStorage}; + } + } + } else { + for (const NodeMetaInfo &info : metaInfo.selfAndPrototypes()) { + if (isBasedOn(info)) { + return info; + } + } } return {}; diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index a8ad4b76e7c..64912f5b73b 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -927,10 +927,9 @@ static int getMajorVersionFromImport(const Model *model) static int getMajorVersionFromNode(const ModelNode &modelNode) { if (modelNode.metaInfo().isValid()) { - for (const NodeMetaInfo &info : modelNode.metaInfo().classHierarchy()) { - if (info.typeName() == "QtQml.QtObject" - || info.typeName() == "QtQuick.QtObject" - || info.typeName() == "QtQuick.Item") { + for (const NodeMetaInfo &info : modelNode.metaInfo().selfAndPrototypes()) { + if (info.typeName() == "QtQml.QtObject" || info.typeName() == "QtQuick.QtObject" + || info.typeName() == "QtQuick.Item") { return info.majorVersion(); } } @@ -942,7 +941,7 @@ static int getMajorVersionFromNode(const ModelNode &modelNode) static int getMinorVersionFromNode(const ModelNode &modelNode) { if (modelNode.metaInfo().isValid()) { - const NodeMetaInfos infos = modelNode.metaInfo().classHierarchy(); + const NodeMetaInfos infos = modelNode.metaInfo().selfAndPrototypes(); for (const NodeMetaInfo &info : infos) { if (info.typeName() == "QtQuick.QtObject" || info.typeName() == "QtQuick.Item") return info.minorVersion(); diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index fd1e1e89c7d..80375f0ab7c 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -347,7 +347,7 @@ std::pair decomposeTypePath(Util QT_WARNING_POP } // namespace -void ModelPrivate::setTypeId(InternalNode *node, Utils::SmallStringView typeName) +ImportedTypeNameId ModelPrivate::importedTypeNameId(Utils::SmallStringView typeName) { if constexpr (useProjectStorage()) { auto [moduleName, shortTypeName] = decomposeTypePath(typeName); @@ -361,15 +361,21 @@ void ModelPrivate::setTypeId(InternalNode *node, Utils::SmallStringView typeName ModuleId moduleId = projectStorage->moduleId(Utils::PathString{found->url()}); ImportId importId = projectStorage->importId( Storage::Import{moduleId, found->majorVersion(), found->minorVersion(), m_sourceId}); - ImportedTypeNameId typeNameId = projectStorage->importedTypeNameId(importId, - shortTypeName); - node->typeId = projectStorage->typeId(typeNameId); - return; + return projectStorage->importedTypeNameId(importId, shortTypeName); } } - ImportedTypeNameId typeNameId = projectStorage->importedTypeNameId(m_sourceId, shortTypeName); - node->typeId = projectStorage->typeId(typeNameId); + return projectStorage->importedTypeNameId(m_sourceId, shortTypeName); + } + + return ImportedTypeNameId{}; +} + +void ModelPrivate::setTypeId(InternalNode *node, Utils::SmallStringView typeName) +{ + if constexpr (useProjectStorage()) { + node->importedTypeNameId = importedTypeNameId(typeName); + node->typeId = projectStorage->typeId(node->importedTypeNameId); } } @@ -1824,6 +1830,16 @@ NotNullPointer Model::projectStorage() const return d->projectStorage; } +const PathCacheType &Model::pathCache() const +{ + return *d->pathCache; +} + +PathCacheType &Model::pathCache() +{ + return *d->pathCache; +} + void ModelDeleter::operator()(class Model *model) { model->detachAllViews(); @@ -2011,6 +2027,16 @@ NodeMetaInfo Model::qtQmlModelsListModelMetaInfo() const } } +NodeMetaInfo Model::qtQmlModelsListElementMetaInfo() const +{ + if constexpr (useProjectStorage()) { + using namespace Storage::Info; + return createNodeMetaInfo(); + } else { + return metaInfo("QtQml.Models.ListElement"); + } +} + NodeMetaInfo Model::qmlQtObjectMetaInfo() const { if constexpr (useProjectStorage()) { @@ -2317,13 +2343,8 @@ namespace { NodeMetaInfo Model::metaInfo(const TypeName &typeName, int majorVersion, int minorVersion) const { if constexpr (useProjectStorage()) { - auto [module, componentName] = moduleTypeName(typeName); - - ModuleId moduleId = d->projectStorage->moduleId(module); - TypeId typeId = d->projectStorage->typeId(moduleId, - componentName, - Storage::Version{majorVersion, minorVersion}); - return NodeMetaInfo(typeId, d->projectStorage); + return NodeMetaInfo(d->projectStorage->typeId(d->importedTypeNameId(typeName)), + d->projectStorage); } else { return NodeMetaInfo(metaInfoProxyModel(), typeName, majorVersion, minorVersion); } diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index d232068da0d..324df37ddb2 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -311,6 +311,7 @@ private: static QList> toInternalBindingProperties( const ModelResourceSet::SetExpressions &setExpressions); EnabledViewRange enabledViews() const; + ImportedTypeNameId importedTypeNameId(Utils::SmallStringView typeName); void setTypeId(InternalNode *node, Utils::SmallStringView typeName); public: diff --git a/src/plugins/qmldesigner/designercore/model/modelutils.cpp b/src/plugins/qmldesigner/designercore/model/modelutils.cpp index 70da6f98b9c..3a598012800 100644 --- a/src/plugins/qmldesigner/designercore/model/modelutils.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelutils.cpp @@ -4,6 +4,7 @@ #include "modelutils.h" #include +#include #include @@ -102,4 +103,29 @@ PropertyMetaInfo metainfo(const ModelNode &node, const PropertyName &propertyNam return node.metaInfo().property(propertyName); } +QString componentFilePath(const PathCacheType &pathCache, const NodeMetaInfo &metaInfo) +{ + if constexpr (useProjectStorage()) { + auto typeSourceId = metaInfo.sourceId(); + + if (typeSourceId && metaInfo.isFileComponent()) { + return pathCache.sourcePath(typeSourceId).toQString(); + } + } else { + return metaInfo.componentFileName(); + } + + return {}; +} + +QString componentFilePath(const ModelNode &node) +{ + if (node) { + const auto &pathCache = node.model()->pathCache(); + return ModelUtils::componentFilePath(pathCache, node.metaInfo()); + } + + return {}; +} + } // namespace QmlDesigner::ModelUtils diff --git a/src/plugins/qmldesigner/designercore/model/modelutils.h b/src/plugins/qmldesigner/designercore/model/modelutils.h index 578a7adb444..946882c2df7 100644 --- a/src/plugins/qmldesigner/designercore/model/modelutils.h +++ b/src/plugins/qmldesigner/designercore/model/modelutils.h @@ -29,4 +29,8 @@ QMLDESIGNERCORE_EXPORT PropertyMetaInfo metainfo(const AbstractProperty &propert QMLDESIGNERCORE_EXPORT PropertyMetaInfo metainfo(const ModelNode &node, const PropertyName &propertyName); +QMLDESIGNERCORE_EXPORT QString componentFilePath(const PathCacheType &pathCache, + const NodeMetaInfo &metaInfo); + +QMLDESIGNERCORE_EXPORT QString componentFilePath(const ModelNode &node); } // namespace QmlDesigner::ModelUtils diff --git a/src/plugins/qmldesigner/designercore/projectstorage/commontypecache.h b/src/plugins/qmldesigner/designercore/projectstorage/commontypecache.h index ffa9ed87c7f..7a5de4ab2b8 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/commontypecache.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/commontypecache.h @@ -31,6 +31,7 @@ inline constexpr char Camera[] = "Camera"; inline constexpr char Command[] = "Command"; inline constexpr char Component[] = "Component"; inline constexpr char Connections[] = "Connections"; +inline constexpr char Control[] = "Control"; inline constexpr char CubeMapTexture[] = "CubeMapTexture"; inline constexpr char DefaultMaterial[] = "DefaultMaterial"; inline constexpr char Dialog[] = "Dialog"; @@ -55,11 +56,13 @@ inline constexpr char Item[] = "Item"; inline constexpr char KeyframeGroup[] = "KeyframeGroup"; inline constexpr char Keyframe[] = "Keyframe"; inline constexpr char Layout[] = "Layout"; +inline constexpr char ListElement[] = "ListElement"; inline constexpr char ListModel[] = "ListModel"; inline constexpr char ListView[] = "ListView"; inline constexpr char Loader[] = "Loader"; inline constexpr char Material[] = "Material"; inline constexpr char Model[] = "Model"; +inline constexpr char MouseArea[] = "MouseArea"; inline constexpr char Node[] = "Node"; inline constexpr char Particle3D[] = "Particle3D"; inline constexpr char ParticleEmitter3D[] = "ParticleEmitter3D"; @@ -92,6 +95,7 @@ inline constexpr char QtQuick_Dialogs[] = "QtQuick.Dialogs"; inline constexpr char QtQuick_Extras[] = "QtQuick.Extras"; inline constexpr char QtQuick_Layouts[] = "QtQuick.Layouts"; inline constexpr char QtQuick_Studio_Components[] = "QtQuick.Studio.Components"; +inline constexpr char QtQuick_Templates[] = "QtQuick.Templates"; inline constexpr char QtQuick_Timeline[] = "QtQuick.Timeline"; inline constexpr char QtQuick_Window[] = "QtQuick.Window"; inline constexpr char Qt_SafeRenderer[] = "Qt.SafeRenderer"; @@ -160,6 +164,7 @@ class CommonTypeCache CacheType, CacheType, CacheType, + CacheType, CacheType, CacheType, CacheType, @@ -168,6 +173,7 @@ class CommonTypeCache CacheType, CacheType, CacheType, + CacheType, CacheType, CacheType, CacheType, @@ -214,6 +220,7 @@ class CommonTypeCache CacheType, CacheType, CacheType, + CacheType, CacheType, CacheType, CacheType, @@ -223,6 +230,7 @@ class CommonTypeCache CacheType, CacheType, CacheType, + CacheType, CacheType, CacheType, CacheType, diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h index c4fb714e744..1c8f161f076 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h @@ -3268,8 +3268,8 @@ public: "UPDATE types SET defaultPropertyId=?2 WHERE typeId=?1", database}; WriteStatement<1> updateDefaultPropertyIdToNullStatement{ "UPDATE types SET defaultPropertyId=NULL WHERE defaultPropertyId=?1", database}; - mutable ReadStatement<2, 1> selectInfoTypeByTypeIdStatement{ - "SELECT defaultPropertyId, traits FROM types WHERE typeId=?", database}; + mutable ReadStatement<3, 1> selectInfoTypeByTypeIdStatement{ + "SELECT defaultPropertyId, sourceId, traits FROM types WHERE typeId=?", database}; mutable ReadStatement<1, 1> selectPrototypeIdsForTypeIdInOrderStatement{ "WITH RECURSIVE " " all_prototype_and_extension(typeId, prototypeId) AS (" diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h index 71bbb745200..fdf50591509 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h @@ -89,12 +89,14 @@ public: class Type { public: - Type(PropertyDeclarationId defaultPropertyId, TypeTraits traits) + Type(PropertyDeclarationId defaultPropertyId, SourceId sourceId, TypeTraits traits) : defaultPropertyId{defaultPropertyId} + , sourceId{sourceId} , traits{traits} {} PropertyDeclarationId defaultPropertyId; + SourceId sourceId; TypeTraits traits; }; diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp index 3c4ba557920..75ae05de56d 100644 --- a/src/plugins/qmldesigner/documentmanager.cpp +++ b/src/plugins/qmldesigner/documentmanager.cpp @@ -5,13 +5,14 @@ #include "qmldesignerplugin.h" #include +#include #include #include #include #include -#include #include #include +#include #include #include @@ -100,7 +101,7 @@ static void openFileComponentForFile(const QString &fileName) static void openFileComponent(const ModelNode &modelNode) { - openFileComponentForFile(modelNode.metaInfo().componentFileName()); + openFileComponentForFile(ModelUtils::componentFilePath(modelNode)); } static void openFileComponentForDelegate(const ModelNode &modelNode) diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp index 12490dd1afe..f8fb4860243 100644 --- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp +++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp @@ -4829,11 +4829,11 @@ void tst_TestCore::testMetaInfoSimpleType() QCOMPARE(itemMetaInfo.minorVersion(), 1); // super classes - NodeMetaInfo qobject = itemMetaInfo.superClasses()[1]; + NodeMetaInfo qobject = itemMetaInfo.prototypes()[1]; QVERIFY(qobject.isValid()); QVERIFY(qobject.isQtObject()); - QCOMPARE(itemMetaInfo.superClasses().size(), 2); // Item, QtQuick.QtObject + QCOMPARE(itemMetaInfo.prototypes().size(), 2); // Item, QtQuick.QtObject QVERIFY(itemMetaInfo.isQtQuickItem()); QVERIFY(itemMetaInfo.isQtObject()); } @@ -4852,11 +4852,11 @@ void tst_TestCore::testMetaInfoUncreatableType() QCOMPARE(animationTypeInfo.majorVersion(), 2); QCOMPARE(animationTypeInfo.minorVersion(), 1); - NodeMetaInfo qObjectTypeInfo = animationTypeInfo.superClasses()[1]; + NodeMetaInfo qObjectTypeInfo = animationTypeInfo.prototypes()[1]; QVERIFY(qObjectTypeInfo.isValid()); QCOMPARE(qObjectTypeInfo.simplifiedTypeName(), QmlDesigner::TypeName("QtObject")); - QCOMPARE(animationTypeInfo.superClasses().size(), 2); + QCOMPARE(animationTypeInfo.prototypes().size(), 2); } void tst_TestCore::testMetaInfoExtendedType() @@ -4870,7 +4870,7 @@ void tst_TestCore::testMetaInfoExtendedType() QVERIFY(typeInfo.hasProperty("font")); // from QGraphicsWidget QVERIFY(typeInfo.hasProperty("enabled")); // from QGraphicsItem - NodeMetaInfo graphicsObjectTypeInfo = typeInfo.superClasses()[1]; + NodeMetaInfo graphicsObjectTypeInfo = typeInfo.prototypes()[1]; QVERIFY(graphicsObjectTypeInfo.isValid()); } @@ -4892,12 +4892,12 @@ void tst_TestCore::testMetaInfoCustomType() QVERIFY(propertyChangesInfo.hasProperty("restoreEntryValues")); QVERIFY(propertyChangesInfo.hasProperty("explicit")); - NodeMetaInfo stateOperationInfo = propertyChangesInfo.superClasses()[1]; + NodeMetaInfo stateOperationInfo = propertyChangesInfo.prototypes()[1]; QVERIFY(stateOperationInfo.isValid()); QCOMPARE(stateOperationInfo.typeName(), QmlDesigner::TypeName("QtQuick.QQuickStateOperation")); QCOMPARE(stateOperationInfo.majorVersion(), -1); QCOMPARE(stateOperationInfo.minorVersion(), -1); - QCOMPARE(propertyChangesInfo.superClasses().size(), 3); + QCOMPARE(propertyChangesInfo.prototypes().size(), 3); // DeclarativePropertyChanges just has 3 properties QCOMPARE(propertyChangesInfo.properties().size() - stateOperationInfo.properties().size(), 3); diff --git a/tests/unit/tests/mocks/projectstoragemock.cpp b/tests/unit/tests/mocks/projectstoragemock.cpp index 0ddec0b5374..d83ae759acb 100644 --- a/tests/unit/tests/mocks/projectstoragemock.cpp +++ b/tests/unit/tests/mocks/projectstoragemock.cpp @@ -43,6 +43,10 @@ void setupIsBasedOn(ProjectStorageMock &mock) ModuleId ProjectStorageMock::createModule(Utils::SmallStringView moduleName) { + if (auto id = moduleId(moduleName)) { + return id; + } + static ModuleId moduleId; incrementBasicId(moduleId); @@ -54,6 +58,10 @@ ModuleId ProjectStorageMock::createModule(Utils::SmallStringView moduleName) QmlDesigner::ImportedTypeNameId ProjectStorageMock::createImportedTypeNameId( SourceId sourceId, Utils::SmallStringView typeName, TypeId typeId) { + if (auto id = importedTypeNameId(sourceId, typeName)) { + return id; + } + static ImportedTypeNameId importedTypeNameId; incrementBasicId(importedTypeNameId); @@ -76,6 +84,10 @@ QmlDesigner::ImportedTypeNameId ProjectStorageMock::createImportedTypeNameId( QmlDesigner::ImportedTypeNameId ProjectStorageMock::createImportedTypeNameId( QmlDesigner::ImportId importId, Utils::SmallStringView typeName, QmlDesigner::TypeId typeId) { + if (auto id = importedTypeNameId(importId, typeName)) { + return id; + } + static ImportedTypeNameId importedTypeNameId; incrementBasicId(importedTypeNameId); @@ -104,6 +116,10 @@ PropertyDeclarationId ProjectStorageMock::createProperty(TypeId typeId, PropertyDeclarationTraits traits, TypeId propertyTypeId) { + if (auto id = propertyDeclarationId(typeId, name)) { + return id; + } + static PropertyDeclarationId propertyId; incrementBasicId(propertyId); @@ -148,8 +164,13 @@ TypeId ProjectStorageMock::createType(ModuleId moduleId, PropertyDeclarationTraits defaultPropertyTraits, TypeId defaultPropertyTypeId, Storage::TypeTraits typeTraits, - TypeIds baseTypeIds) + TypeIds baseTypeIds, + SourceId sourceId) { + if (auto id = typeId(moduleId, typeName)) { + return id; + } + static TypeId typeId; incrementBasicId(typeId); @@ -167,22 +188,31 @@ TypeId ProjectStorageMock::createType(ModuleId moduleId, } ON_CALL(*this, type(Eq(typeId))) - .WillByDefault(Return(Storage::Info::Type{defaultPropertyDeclarationId, typeTraits})); + .WillByDefault( + Return(Storage::Info::Type{defaultPropertyDeclarationId, sourceId, typeTraits})); ON_CALL(*this, isBasedOn(Eq(typeId), Eq(typeId))).WillByDefault(Return(true)); for (TypeId baseTypeId : baseTypeIds) ON_CALL(*this, isBasedOn(Eq(typeId), Eq(baseTypeId))).WillByDefault(Return(true)); + TypeIds selfAndPrototypes; + selfAndPrototypes.reserve(baseTypeIds.size() + 1); + selfAndPrototypes.push_back(typeId); + selfAndPrototypes.insert(selfAndPrototypes.end(), baseTypeIds.begin(), baseTypeIds.end()); + ON_CALL(*this, prototypeAndSelfIds(Eq(typeId))).WillByDefault(Return(selfAndPrototypes)); + ON_CALL(*this, prototypeIds(Eq(typeId))).WillByDefault(Return(baseTypeIds)); + return typeId; } QmlDesigner::TypeId ProjectStorageMock::createType(QmlDesigner::ModuleId moduleId, Utils::SmallStringView typeName, QmlDesigner::Storage::TypeTraits typeTraits, - QmlDesigner::TypeIds baseTypeIds) + QmlDesigner::TypeIds baseTypeIds, + SourceId sourceId) { - return createType(moduleId, typeName, {}, {}, TypeId{}, typeTraits, baseTypeIds); + return createType(moduleId, typeName, {}, {}, TypeId{}, typeTraits, baseTypeIds, sourceId); } TypeId ProjectStorageMock::createObject(ModuleId moduleId, @@ -190,7 +220,8 @@ TypeId ProjectStorageMock::createObject(ModuleId moduleId, Utils::SmallStringView defaultPropertyName, PropertyDeclarationTraits defaultPropertyTraits, QmlDesigner::TypeId defaultPropertyTypeId, - TypeIds baseTypeIds) + TypeIds baseTypeIds, + QmlDesigner::SourceId sourceId) { return createType(moduleId, typeName, @@ -198,7 +229,8 @@ TypeId ProjectStorageMock::createObject(ModuleId moduleId, defaultPropertyTraits, defaultPropertyTypeId, Storage::TypeTraits::Reference, - baseTypeIds); + baseTypeIds, + sourceId); } TypeId ProjectStorageMock::createObject(ModuleId moduleId, @@ -213,11 +245,13 @@ void ProjectStorageMock::setupQtQuick() setupIsBasedOn(*this); auto qmlModuleId = createModule("QML"); + auto qmlNativeModuleId = createModule("QML-cppnative"); auto qtQmlModelsModuleId = createModule("QtQml.Models"); auto qtQuickModuleId = createModule("QtQuick"); auto qtQuickNativeModuleId = createModule("QtQuick-cppnative"); createType(qmlModuleId, "int", Storage::TypeTraits::Value); + createType(qmlNativeModuleId, "float", Storage::TypeTraits::Value); auto qtObjectId = createObject(qmlModuleId, "QtObject", @@ -275,7 +309,7 @@ void ProjectStorageMock::setupQtQuick() "data", PropertyDeclarationTraits::IsList, qtObjectId, - {qtObjectId, itemId}); + {itemId, qtObjectId}); createObject(flowViewModuleId, "FlowWildcard", "data", diff --git a/tests/unit/tests/mocks/projectstoragemock.h b/tests/unit/tests/mocks/projectstoragemock.h index 18dbf8d6e1b..b7b4428fa76 100644 --- a/tests/unit/tests/mocks/projectstoragemock.h +++ b/tests/unit/tests/mocks/projectstoragemock.h @@ -47,12 +47,14 @@ public: QmlDesigner::Storage::PropertyDeclarationTraits defaultPropertyTraits, QmlDesigner::TypeId defaultPropertyTypeId, QmlDesigner::Storage::TypeTraits typeTraits, - QmlDesigner::TypeIds baseTypeIds = {}); + QmlDesigner::TypeIds baseTypeIds = {}, + QmlDesigner::SourceId sourceId = QmlDesigner::SourceId{}); QmlDesigner::TypeId createType(QmlDesigner::ModuleId moduleId, Utils::SmallStringView typeName, QmlDesigner::Storage::TypeTraits typeTraits, - QmlDesigner::TypeIds baseTypeIds = {}); + QmlDesigner::TypeIds baseTypeIds = {}, + QmlDesigner::SourceId sourceId = QmlDesigner::SourceId{}); QmlDesigner::TypeId createObject( QmlDesigner::ModuleId moduleId, @@ -60,7 +62,8 @@ public: Utils::SmallStringView defaultPropertyName, QmlDesigner::Storage::PropertyDeclarationTraits defaultPropertyTraits, QmlDesigner::TypeId defaultPropertyTypeId, - QmlDesigner::TypeIds baseTypeIds = {}); + QmlDesigner::TypeIds baseTypeIds = {}, + QmlDesigner::SourceId sourceId = QmlDesigner::SourceId{}); QmlDesigner::TypeId createObject(QmlDesigner::ModuleId moduleId, Utils::SmallStringView typeName, @@ -99,7 +102,11 @@ public: typeId, (QmlDesigner::ImportedTypeNameId typeNameId), (const, override)); - + QmlDesigner::TypeId typeId(QmlDesigner::ModuleId moduleId, + ::Utils::SmallStringView exportedTypeName) const + { + return typeId(moduleId, exportedTypeName, QmlDesigner::Storage::Version{}); + } MOCK_METHOD(QmlDesigner::TypeId, typeId, (QmlDesigner::ModuleId moduleId, diff --git a/tests/unit/tests/testdesignercore/CMakeLists.txt b/tests/unit/tests/testdesignercore/CMakeLists.txt index a3f1697f68a..5f3a4e26af7 100644 --- a/tests/unit/tests/testdesignercore/CMakeLists.txt +++ b/tests/unit/tests/testdesignercore/CMakeLists.txt @@ -54,7 +54,6 @@ add_qtc_library(TestDesignerCore OBJECT imagecache/synchronousimagecache.cpp imagecache/timestampproviderinterface.h include/abstractproperty.h - include/abstractview.h include/asynchronousexplicitimagecache.h include/asynchronousimagecache.h include/asynchronousimagecacheinterface.h @@ -64,7 +63,6 @@ add_qtc_library(TestDesignerCore OBJECT include/itemlibraryinfo.h include/metainfo.h include/metainforeader.h - include/model.h include/modelnode.h include/nodeabstractproperty.h include/nodelistproperty.h @@ -108,6 +106,7 @@ add_qtc_library(TestDesignerCore OBJECT model/modelnode.cpp model/modelresourcemanagementinterface.h model/modelresourcemanagement.cpp model/modelresourcemanagement.h + model/modelutils.cpp model/modelutils.h model/propertycontainer.cpp model/propertyparser.cpp model/nodeabstractproperty.cpp diff --git a/tests/unit/tests/unittests/CMakeLists.txt b/tests/unit/tests/unittests/CMakeLists.txt index 7f745301670..04ed0d571c2 100644 --- a/tests/unit/tests/unittests/CMakeLists.txt +++ b/tests/unit/tests/unittests/CMakeLists.txt @@ -3,7 +3,7 @@ file(RELATIVE_PATH TEST_RELATIVE_LIBEXEC_PATH "/${RELATIVE_TEST_PATH}" "/${IDE_L add_qtc_test(unittest GTEST PROPERTIES COMPILE_WARNING_AS_ERROR OFF - SKIP_AUTOMOC ON + SKIP_AUTOGEN ON DEPENDS Qt::Core Qt::Network Qt::Widgets Qt::Xml Qt::Concurrent Qt::QmlPrivate Qt::Gui diff --git a/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp b/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp index 78aed432f7a..caae3ecc5f3 100644 --- a/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp +++ b/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp @@ -23,6 +23,53 @@ auto PropertyId(const Matcher &matcher) class NodeMetaInfo : public testing::Test { +protected: + QmlDesigner::TypeId createDerivedDummy(QmlDesigner::TypeId baseTypeId) + { + return projectStorageMock.createType(qmlModuleId, "Dummy", {}, {baseTypeId}); + } + + QmlDesigner::NodeMetaInfo createDerivedDummyMetaInfo(QmlDesigner::TypeId baseTypeId) + { + return QmlDesigner::NodeMetaInfo{createDerivedDummy(baseTypeId), &projectStorageMock}; + } + + QmlDesigner::NodeMetaInfo createDerivedDummyMetaInfo(QmlDesigner::ModuleId moduleId, + Utils::SmallStringView typeName) + { + auto typeId = projectStorageMock.createType(moduleId, typeName, {}); + + return createDerivedDummyMetaInfo(typeId); + } + + QmlDesigner::NodeMetaInfo createDerivedDummyMetaInfo(Utils::SmallStringView moduleName, + Utils::SmallStringView typeName) + { + auto moduleId = projectStorageMock.createModule(moduleName); + auto typeId = projectStorageMock.createType(moduleId, typeName, {}); + + return createDerivedDummyMetaInfo(typeId); + } + + QmlDesigner::NodeMetaInfo createMetaInfo(QmlDesigner::ModuleId moduleId, + Utils::SmallStringView typeName, + QmlDesigner::Storage::TypeTraits typeTraits = {}) + { + auto typeId = projectStorageMock.createType(moduleId, typeName, typeTraits); + + return QmlDesigner::NodeMetaInfo{typeId, &projectStorageMock}; + } + + QmlDesigner::NodeMetaInfo createMetaInfo(Utils::SmallStringView moduleName, + Utils::SmallStringView typeName, + QmlDesigner::Storage::TypeTraits typeTraits = {}) + { + auto moduleId = projectStorageMock.createModule(moduleName); + auto typeId = projectStorageMock.createType(moduleId, typeName, typeTraits); + + return QmlDesigner::NodeMetaInfo{typeId, &projectStorageMock}; + } + protected: NiceMock pathCache{"/path/foo.qml"}; NiceMock projectStorageMock{pathCache.sourceId}; @@ -37,15 +84,16 @@ protected: ModelNode object = model.createModelNode("QtObject"); QmlDesigner::NodeMetaInfo itemMetaInfo = item.metaInfo(); QmlDesigner::NodeMetaInfo objectMetaInfo = object.metaInfo(); - QmlDesigner::TypeId intTypeId = projectStorageMock.typeId(projectStorageMock.moduleId("QML"), + QmlDesigner::ModuleId qmlModuleId = projectStorageMock.createModule("QML"); + QmlDesigner::ModuleId qtQuickModuleId = projectStorageMock.createModule("QtQuick"); + QmlDesigner::TypeId intTypeId = projectStorageMock.typeId(qmlModuleId, "int", QmlDesigner::Storage::Version{}); }; TEST_F(NodeMetaInfo, is_true_if_meta_info_exists) { - auto node = model.createModelNode("Item"); - auto metaInfo = node.metaInfo(); + auto metaInfo = model.qtQuickItemMetaInfo(); auto isValid = bool(metaInfo); @@ -54,8 +102,7 @@ TEST_F(NodeMetaInfo, is_true_if_meta_info_exists) TEST_F(NodeMetaInfo, is_valid_if_meta_info_exists) { - auto node = model.createModelNode("Item"); - auto metaInfo = node.metaInfo(); + auto metaInfo = model.qtQuickItemMetaInfo(); auto isValid = metaInfo.isValid(); @@ -223,8 +270,7 @@ TEST_F(NodeMetaInfo, invalid_is_not_in_project_module) TEST_F(NodeMetaInfo, has_property) { - auto node = model.createModelNode("Item"); - auto metaInfo = node.metaInfo(); + auto metaInfo = model.qtQuickItemMetaInfo(); projectStorageMock.createProperty(metaInfo.id(), "x", intTypeId); bool hasProperty = metaInfo.hasProperty("x"); @@ -234,8 +280,7 @@ TEST_F(NodeMetaInfo, has_property) TEST_F(NodeMetaInfo, has_not_property) { - auto node = model.createModelNode("Item"); - auto metaInfo = node.metaInfo(); + auto metaInfo = model.qtQuickItemMetaInfo(); bool hasProperty = metaInfo.hasProperty("foo"); @@ -263,8 +308,7 @@ TEST_F(NodeMetaInfo, invalid_has_not_property) TEST_F(NodeMetaInfo, get_property) { - auto node = model.createModelNode("Item"); - auto metaInfo = node.metaInfo(); + auto metaInfo = model.qtQuickItemMetaInfo(); auto propertyId = projectStorageMock.createProperty(metaInfo.id(), "x", intTypeId); auto property = metaInfo.property("x"); @@ -274,8 +318,7 @@ TEST_F(NodeMetaInfo, get_property) TEST_F(NodeMetaInfo, get_invalid_property_if_not_exists) { - auto node = model.createModelNode("Item"); - auto metaInfo = node.metaInfo(); + auto metaInfo = model.qtQuickItemMetaInfo(); auto property = metaInfo.property("x"); @@ -303,8 +346,7 @@ TEST_F(NodeMetaInfo, get_invalid_property_if_meta_info_is_invalid) TEST_F(NodeMetaInfo, get_properties) { - auto node = model.createModelNode("Item"); - auto metaInfo = node.metaInfo(); + auto metaInfo = model.qtQuickItemMetaInfo(); auto xPropertyId = projectStorageMock.createProperty(metaInfo.id(), "x", intTypeId); auto yPropertyId = projectStorageMock.createProperty(metaInfo.id(), "y", intTypeId); @@ -334,8 +376,7 @@ TEST_F(NodeMetaInfo, get_no_properties_if_is_invalid) TEST_F(NodeMetaInfo, get_local_properties) { - auto node = model.createModelNode("Item"); - auto metaInfo = node.metaInfo(); + auto metaInfo = model.qtQuickItemMetaInfo(); auto xPropertyId = projectStorageMock.createProperty(metaInfo.id(), "x", intTypeId); auto yPropertyId = projectStorageMock.createProperty(metaInfo.id(), "y", intTypeId); @@ -365,8 +406,7 @@ TEST_F(NodeMetaInfo, get_no_local_properties_if_node_is_invalid) TEST_F(NodeMetaInfo, get_signal_names) { - auto node = model.createModelNode("Item"); - auto metaInfo = node.metaInfo(); + auto metaInfo = model.qtQuickItemMetaInfo(); projectStorageMock.createSignal(metaInfo.id(), "xChanged"); projectStorageMock.createSignal(metaInfo.id(), "yChanged"); @@ -396,8 +436,7 @@ TEST_F(NodeMetaInfo, get_no_signal_names_if_node_is_invalid) TEST_F(NodeMetaInfo, get_function_names) { - auto node = model.createModelNode("Item"); - auto metaInfo = node.metaInfo(); + auto metaInfo = model.qtQuickItemMetaInfo(); projectStorageMock.createFunction(metaInfo.id(), "setX"); projectStorageMock.createFunction(metaInfo.id(), "setY"); @@ -427,8 +466,7 @@ TEST_F(NodeMetaInfo, get_no_function_names_if_node_is_invalid) TEST_F(NodeMetaInfo, get_default_property) { - auto node = model.createModelNode("Item"); - auto metaInfo = node.metaInfo(); + auto metaInfo = model.qtQuickItemMetaInfo(); auto defaultProperty = metaInfo.property("data"); auto property = metaInfo.defaultProperty(); @@ -457,8 +495,7 @@ TEST_F(NodeMetaInfo, get_no_default_property_if_node_is_invalid) TEST_F(NodeMetaInfo, get_default_property_name) { - auto node = model.createModelNode("Item"); - auto metaInfo = node.metaInfo(); + auto metaInfo = model.qtQuickItemMetaInfo(); auto defaultProperty = metaInfo.property("data"); auto property = metaInfo.defaultPropertyName(); @@ -485,4 +522,1713 @@ TEST_F(NodeMetaInfo, get_no_default_property_name_if_node_is_invalid) ASSERT_THAT(property, IsEmpty()); } +TEST_F(NodeMetaInfo, has_default_property) +{ + auto metaInfo = model.qtQuickItemMetaInfo(); + + bool property = metaInfo.hasDefaultProperty(); + + ASSERT_THAT(property, IsTrue()); +} + +TEST_F(NodeMetaInfo, has_no_default_property) +{ + auto metaInfo = model.qtQmlModelsListElementMetaInfo(); + + bool property = metaInfo.hasDefaultProperty(); + + ASSERT_THAT(property, IsFalse()); +} + +TEST_F(NodeMetaInfo, has_no_default_property_for_default_metainfo) +{ + auto metaInfo = QmlDesigner::NodeMetaInfo{}; + + bool property = metaInfo.hasDefaultProperty(); + + ASSERT_THAT(property, IsFalse()); +} + +TEST_F(NodeMetaInfo, has_no_default_property_if_node_is_invalid) +{ + auto node = model.createModelNode("Foo"); + auto metaInfo = node.metaInfo(); + + bool property = metaInfo.hasDefaultProperty(); + + ASSERT_THAT(property, IsFalse()); +} + +TEST_F(NodeMetaInfo, self_and_prototypes) +{ + auto metaInfo = model.flowViewFlowActionAreaMetaInfo(); + + auto prototypes = metaInfo.selfAndPrototypes(); + + ASSERT_THAT(prototypes, + ElementsAre(model.flowViewFlowActionAreaMetaInfo(), + model.qtQuickItemMetaInfo(), + model.qmlQtObjectMetaInfo())); +} + +TEST_F(NodeMetaInfo, self_and_prototypes_returns_empty_container_for_default) +{ + auto metaInfo = QmlDesigner::NodeMetaInfo(); + + auto prototypes = metaInfo.selfAndPrototypes(); + + ASSERT_THAT(prototypes, IsEmpty()); +} + +TEST_F(NodeMetaInfo, prototypes) +{ + auto metaInfo = model.flowViewFlowActionAreaMetaInfo(); + + auto prototypes = metaInfo.prototypes(); + + ASSERT_THAT(prototypes, ElementsAre(model.qtQuickItemMetaInfo(), model.qmlQtObjectMetaInfo())); +} + +TEST_F(NodeMetaInfo, prototypes_returns_empty_container_for_default) +{ + auto metaInfo = QmlDesigner::NodeMetaInfo(); + + auto prototypes = metaInfo.prototypes(); + + ASSERT_THAT(prototypes, IsEmpty()); +} + +TEST_F(NodeMetaInfo, common_base_is_root) +{ + auto metaInfo = model.flowViewFlowActionAreaMetaInfo(); + + auto commonBase = metaInfo.commonBase(model.qtQuickPropertyAnimationMetaInfo()); + + ASSERT_THAT(commonBase, model.qmlQtObjectMetaInfo()); +} + +TEST_F(NodeMetaInfo, common_base_is_first_leaf) +{ + auto metaInfo = model.qtQuickItemMetaInfo(); + + auto commonBase = metaInfo.commonBase(model.flowViewFlowActionAreaMetaInfo()); + + ASSERT_THAT(commonBase, model.qtQuickItemMetaInfo()); +} + +TEST_F(NodeMetaInfo, common_base_is_second_leaf) +{ + auto metaInfo = model.flowViewFlowActionAreaMetaInfo(); + + auto commonBase = metaInfo.commonBase(model.qtQuickItemMetaInfo()); + + ASSERT_THAT(commonBase, model.qtQuickItemMetaInfo()); +} + +TEST_F(NodeMetaInfo, there_is_no_common_base) +{ + auto metaInfo = model.metaInfo("int"); + + auto commonBase = metaInfo.commonBase(model.qtQuickItemMetaInfo()); + + ASSERT_THAT(commonBase, IsFalse()); +} + +TEST_F(NodeMetaInfo, first_input_is_invalid_for_common_base_returns_invalid) +{ + auto metaInfo = QmlDesigner::NodeMetaInfo(); + + auto commonBase = metaInfo.commonBase(model.flowViewFlowActionAreaMetaInfo()); + + ASSERT_THAT(commonBase, IsFalse()); +} + +TEST_F(NodeMetaInfo, second_input_is_invalid_for_common_base_returns_invalid) +{ + auto metaInfo = model.flowViewFlowActionAreaMetaInfo(); + + auto commonBase = metaInfo.commonBase(QmlDesigner::NodeMetaInfo()); + + ASSERT_THAT(commonBase, IsFalse()); +} + +TEST_F(NodeMetaInfo, source_id) +{ + auto moduleId = projectStorageMock.createModule("/path/to/project"); + auto typeSourceId = QmlDesigner::SourceId::create(999); + auto typeId = projectStorageMock.createType(moduleId, "Foo", {}, {}, typeSourceId); + QmlDesigner::NodeMetaInfo metaInfo{typeId, &projectStorageMock}; + + auto sourceId = metaInfo.sourceId(); + + ASSERT_THAT(sourceId, typeSourceId); +} + +TEST_F(NodeMetaInfo, invalid_returns_invalid_source_id) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + auto sourceId = metaInfo.sourceId(); + + ASSERT_THAT(sourceId, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_bool) +{ + auto metaInfo = createMetaInfo(qmlModuleId, "bool"); + + bool isType = metaInfo.isBool(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_bool) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isBool(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_color) +{ + auto metaInfo = createMetaInfo(qtQuickModuleId, "color"); + + bool isType = metaInfo.isColor(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_color) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isColor(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, float_is_a_floating_type) +{ + auto metaInfo = createMetaInfo("QML-cppnative", "float"); + + bool isType = metaInfo.isFloat(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, double_is_a_floating_type) +{ + auto metaInfo = createMetaInfo(qmlModuleId, "double"); + + bool isType = metaInfo.isFloat(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_float) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isFloat(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_FlowView_FlowActionArea) +{ + auto metaInfo = createDerivedDummyMetaInfo("FlowView", "FlowActionArea"); + + bool isType = metaInfo.isFlowViewFlowActionArea(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_FlowView_FlowActionArea) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isFlowViewFlowActionArea(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_FlowView_FlowDecision) +{ + auto metaInfo = createDerivedDummyMetaInfo("FlowView", "FlowDecision"); + + bool isType = metaInfo.isFlowViewFlowDecision(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_FlowView_FlowDecision) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isFlowViewFlowDecision(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_FlowView_FlowItem) +{ + auto metaInfo = createDerivedDummyMetaInfo("FlowView", "FlowItem"); + + bool isType = metaInfo.isFlowViewFlowItem(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_FlowView_FlowItem) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isFlowViewFlowItem(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_FlowView_FlowTransition) +{ + auto metaInfo = createDerivedDummyMetaInfo("FlowView", "FlowTransition"); + + bool isType = metaInfo.isFlowViewFlowTransition(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_FlowView_FlowTransition) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isFlowViewFlowTransition(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_FlowView_FlowView) +{ + auto metaInfo = createDerivedDummyMetaInfo("FlowView", "FlowView"); + + bool isType = metaInfo.isFlowViewFlowView(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_FlowView_FlowView) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isFlowViewFlowView(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_FlowView_FlowWildcard) +{ + auto metaInfo = createDerivedDummyMetaInfo("FlowView", "FlowWildcard"); + + bool isType = metaInfo.isFlowViewFlowWildcard(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_FlowView_FlowWildcard) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isFlowViewFlowWildcard(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, FlowItem_is_FlowView_item) +{ + auto metaInfo = createDerivedDummyMetaInfo("FlowView", "FlowItem"); + + bool isType = metaInfo.isFlowViewItem(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, FlowWildcard_is_FlowView_item) +{ + auto metaInfo = createDerivedDummyMetaInfo("FlowView", "FlowWildcard"); + + bool isType = metaInfo.isFlowViewItem(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, FlowDecision_is_FlowView_item) +{ + auto metaInfo = createDerivedDummyMetaInfo("FlowView", "FlowDecision"); + + bool isType = metaInfo.isFlowViewItem(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_FlowView_Item) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isFlowViewItem(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_font) +{ + auto metaInfo = createMetaInfo(qtQuickModuleId, "font"); + + bool isType = metaInfo.isFont(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_font) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isFont(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, QtQuick_Item_is_graphical_item) +{ + auto metaInfo = createDerivedDummyMetaInfo(qtQuickModuleId, "Item"); + + bool isType = metaInfo.isGraphicalItem(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, QtQuickWindow_Window_is_graphical_item) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Window", "Window"); + + bool isType = metaInfo.isGraphicalItem(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, QtQuickDialogs_Dialogs_is_graphical_item) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Dialogs", "Dialog"); + + bool isType = metaInfo.isGraphicalItem(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, QtQuickControls_Popup_is_graphical_item) +{ + auto metaInfo = createMetaInfo("QtQuick.Controls", "Popup"); + + bool isType = metaInfo.isGraphicalItem(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_graphical_item) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isGraphicalItem(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_integer) +{ + auto metaInfo = createMetaInfo(qmlModuleId, "int"); + + bool isType = metaInfo.isInteger(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_integer) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isInteger(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, QtQuick_Positioner_is_layoutable) +{ + auto metaInfo = createDerivedDummyMetaInfo(qtQuickModuleId, "Positioner"); + + bool isType = metaInfo.isLayoutable(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, QtQuick_Layouts_Layout_is_layoutable) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Layouts", "Layout"); + + bool isType = metaInfo.isLayoutable(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, QtQuick_Controls_SplitView_is_layoutable) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Controls", "SplitView"); + + bool isType = metaInfo.isLayoutable(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_layoutable) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isLayoutable(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, ListView_is_ListView_or_GridView) +{ + auto metaInfo = createDerivedDummyMetaInfo(qtQuickModuleId, "ListView"); + + bool isType = metaInfo.isListOrGridView(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, GridView_is_ListView_or_GridView) +{ + auto metaInfo = createDerivedDummyMetaInfo(qtQuickModuleId, "GridView"); + + bool isType = metaInfo.isListOrGridView(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_ListView_or_GridView) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isListOrGridView(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_qml_component) +{ + auto metaInfo = createDerivedDummyMetaInfo(qmlModuleId, "Component"); + + bool isType = metaInfo.isQmlComponent(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_qml_component) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQmlComponent(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtMultimedia_SoundEffect) +{ + auto qtMultimediaModuleId = projectStorageMock.createModule("QtMultimedia"); + auto metaInfo = createDerivedDummyMetaInfo(qtMultimediaModuleId, "SoundEffect"); + + bool isType = metaInfo.isQtMultimediaSoundEffect(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtMultimedia_SoundEffect) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtMultimediaSoundEffect(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtObject) +{ + auto metaInfo = createDerivedDummyMetaInfo(qmlModuleId, "QtObject"); + + bool isType = metaInfo.isQtObject(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtObject) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtObject(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_BakedLightmap) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "BakedLightmap"); + + bool isType = metaInfo.isQtQuick3DBakedLightmap(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_BakedLightmap) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DBakedLightmap(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Camera) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "Camera"); + + bool isType = metaInfo.isQtQuick3DCamera(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_Camera) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DCamera(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Command) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "Command"); + + bool isType = metaInfo.isQtQuick3DCommand(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_Command) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DCommand(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_DefaultMaterial) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "DefaultMaterial"); + + bool isType = metaInfo.isQtQuick3DDefaultMaterial(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_DefaultMaterial) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DDefaultMaterial(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Effect) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "Effect"); + + bool isType = metaInfo.isQtQuick3DEffect(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_Effect) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DEffect(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_InstanceList) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "InstanceList"); + + bool isType = metaInfo.isQtQuick3DInstanceList(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_InstanceList) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DInstanceList(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_InstanceListEntry) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "InstanceListEntry"); + + bool isType = metaInfo.isQtQuick3DInstanceListEntry(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_InstanceListEntry) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DInstanceListEntry(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Light) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "Light"); + + bool isType = metaInfo.isQtQuick3DLight(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_Light) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DLight(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Material) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "Material"); + + bool isType = metaInfo.isQtQuick3DMaterial(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_Material) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DMaterial(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Model) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "Model"); + + bool isType = metaInfo.isQtQuick3DModel(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_Model) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DModel(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Node) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "Node"); + + bool isType = metaInfo.isQtQuick3DNode(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_Node) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DNode(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Particles3D_cppnative_QQuick3DParticleAbstractShape) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D.Particles3D-cppnative", + "QQuick3DParticleAbstractShape"); + + bool isType = metaInfo.isQtQuick3DParticlesAbstractShape(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_Particles3D_cppnative_QQuick3DParticleAbstractShape) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DParticlesAbstractShape(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Particles3D_Affector3D) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D.Particles3D", "Affector3D"); + + bool isType = metaInfo.isQtQuick3DParticles3DAffector3D(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, QtQuick3D_Particles3D_Affector3D) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DParticles3DAffector3D(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Particles3D_Attractor3D) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D.Particles3D", "Attractor3D"); + + bool isType = metaInfo.isQtQuick3DParticles3DAttractor3D(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, QtQuick3D_Particles3D_Attractor3D) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DParticles3DAttractor3D(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Particles3D_Particle3D) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D.Particles3D", "Particle3D"); + + bool isType = metaInfo.isQtQuick3DParticles3DParticle3D(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, QtQuick3D_Particles3D_Particle3D) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DParticles3DParticle3D(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Particles3D_ParticleEmitter3D) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D.Particles3D", "ParticleEmitter3D"); + + bool isType = metaInfo.isQtQuick3DParticles3DParticleEmitter3D(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, QtQuick3D_Particles3D_ParticleEmitter3D) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DParticles3DParticleEmitter3D(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Particles3D_SpriteParticle3D) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D.Particles3D", "SpriteParticle3D"); + + bool isType = metaInfo.isQtQuick3DParticles3DSpriteParticle3D(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, QtQuick3D_Particles3D_SpriteParticle3D) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DParticles3DSpriteParticle3D(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Pass) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "Pass"); + + bool isType = metaInfo.isQtQuick3DPass(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_Pass) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DPass(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_PrincipledMaterial) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "PrincipledMaterial"); + + bool isType = metaInfo.isQtQuick3DPrincipledMaterial(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_PrincipledMaterial) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DPrincipledMaterial(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_SpecularGlossyMaterial) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "SpecularGlossyMaterial"); + + bool isType = metaInfo.isQtQuick3DSpecularGlossyMaterial(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_SpecularGlossyMaterial) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DSpecularGlossyMaterial(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_SceneEnvironment) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "SceneEnvironment"); + + bool isType = metaInfo.isQtQuick3DSceneEnvironment(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_SceneEnvironment) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DSceneEnvironment(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Shader) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "Shader"); + + bool isType = metaInfo.isQtQuick3DShader(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_Shader) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DShader(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_Texture) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "Texture"); + + bool isType = metaInfo.isQtQuick3DTexture(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_Texture) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DTexture(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_TextureInput) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "TextureInput"); + + bool isType = metaInfo.isQtQuick3DTextureInput(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_TextureInput) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DTextureInput(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_CubeMapTexture) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "CubeMapTexture"); + + bool isType = metaInfo.isQtQuick3DCubeMapTexture(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_CubeMapTexture) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DCubeMapTexture(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick3D_View3D) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick3D", "View3D"); + + bool isType = metaInfo.isQtQuick3DView3D(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick3D_View3D) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuick3DView3D(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick_BorderImage) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "BorderImage"); + + bool isType = metaInfo.isQtQuickBorderImage(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_BorderImage) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickBorderImage(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuickControls_SwipeView) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Controls", "SwipeView"); + + bool isType = metaInfo.isQtQuickControlsSwipeView(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuickControls_SwipeView) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickControlsSwipeView(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuickControls_TabBar) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Controls", "TabBar"); + + bool isType = metaInfo.isQtQuickControlsTabBar(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuickControls_TabBar) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickControlsTabBar(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuickExtras_Picture) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Extras", "Picture"); + + bool isType = metaInfo.isQtQuickExtrasPicture(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuickExtras_Picture) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickExtrasPicture(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick_Image) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "Image"); + + bool isType = metaInfo.isQtQuickImage(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_Image) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickImage(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick_Item) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "Item"); + + bool isType = metaInfo.isQtQuickItem(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_Item) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickItem(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuickLayouts_BorderImage) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Layouts", "Layout"); + + bool isType = metaInfo.isQtQuickLayoutsLayout(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuickLayouts_Layout) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickLayoutsLayout(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick_Loader) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "Loader"); + + bool isType = metaInfo.isQtQuickLoader(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_Loader) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickLoader(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick_Path) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "Path"); + + bool isType = metaInfo.isQtQuickPath(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_Path) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickPath(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick_PauseAnimation) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "PauseAnimation"); + + bool isType = metaInfo.isQtQuickPauseAnimation(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_PauseAnimation) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickPauseAnimation(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick_Positioner) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "Positioner"); + + bool isType = metaInfo.isQtQuickPositioner(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_Positioner) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickPositioner(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick_PropertyAnimation) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "PropertyAnimation"); + + bool isType = metaInfo.isQtQuickPropertyAnimation(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_PropertyAnimation) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickPropertyAnimation(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick_PropertyChanges) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "PropertyChanges"); + + bool isType = metaInfo.isQtQuickPropertyChanges(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_PropertyChanges) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickPropertyChanges(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick_Repeater) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "Repeater"); + + bool isType = metaInfo.isQtQuickRepeater(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_Repeater) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickRepeater(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick_State) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "State"); + + bool isType = metaInfo.isQtQuickState(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_State) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickState(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuickNative_StateOperation) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick-cppnative", "QQuickStateOperation"); + + bool isType = metaInfo.isQtQuickStateOperation(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuickNative_StateOperation) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickStateOperation(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuickStudioComponents_GroupItem) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Studio.Components", "GroupItem"); + + bool isType = metaInfo.isQtQuickStudioComponentsGroupItem(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuickStudioComponents_GroupItem) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickStudioComponentsGroupItem(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick_Text) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "Text"); + + bool isType = metaInfo.isQtQuickText(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_Text) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickText(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuickTimeline_Keyframe) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Timeline", "Keyframe"); + + bool isType = metaInfo.isQtQuickTimelineKeyframe(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_Keyframe) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickTimelineKeyframe(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuickTimeline_KeyframeGroup) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Timeline", "KeyframeGroup"); + + bool isType = metaInfo.isQtQuickTimelineKeyframeGroup(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_KeyframeGroup) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickTimelineKeyframeGroup(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuickTimeline_Timeline) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Timeline", "Timeline"); + + bool isType = metaInfo.isQtQuickTimelineTimeline(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_Timeline) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickTimelineTimeline(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuickTimeline_TimelineAnimation) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Timeline", "TimelineAnimation"); + + bool isType = metaInfo.isQtQuickTimelineTimelineAnimation(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_TimelineAnimation) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickTimelineTimelineAnimation(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuick_Transition) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "Transition"); + + bool isType = metaInfo.isQtQuickTransition(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuick_Transition) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickTransition(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtQuickWindow_Window) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Window", "Window"); + + bool isType = metaInfo.isQtQuickWindowWindow(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtQuickWindow_Window) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickWindowWindow(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtSafeRenderer_SafeRendererPicture) +{ + auto metaInfo = createDerivedDummyMetaInfo("Qt.SafeRenderer", "SafeRendererPicture"); + + bool isType = metaInfo.isQtSafeRendererSafeRendererPicture(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtSafeRenderer_SafeRendererPicture) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtSafeRendererSafeRendererPicture(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_QtSafeRenderer_SafePicture) +{ + auto metaInfo = createDerivedDummyMetaInfo("Qt.SafeRenderer", "SafePicture"); + + bool isType = metaInfo.isQtSafeRendererSafePicture(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_QtSafeRenderer_SafePicture) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtSafeRendererSafePicture(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_string) +{ + auto metaInfo = createMetaInfo("QML", "string"); + + bool isType = metaInfo.isString(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_string) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isString(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, QtQuick_Item_is_suitable_for_MouseArea_fill) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "Item"); + + bool isType = metaInfo.isSuitableForMouseAreaFill(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, QtQuick_MouseArea_is_suitable_for_MouseArea_fill) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "MouseArea"); + + bool isType = metaInfo.isSuitableForMouseAreaFill(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, QtQuickControls_Control_is_suitable_for_MouseArea_fill) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Controls", "Control"); + + bool isType = metaInfo.isSuitableForMouseAreaFill(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, QtQuickTemplates_Control_is_suitable_for_MouseArea_fill) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick.Templates", "Control"); + + bool isType = metaInfo.isSuitableForMouseAreaFill(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_suitable_for_MouseArea_fill) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isQtQuickTransition(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_url) +{ + auto metaInfo = createMetaInfo("QML", "url"); + + bool isType = metaInfo.isUrl(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_url) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isUrl(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_variant) +{ + auto metaInfo = createMetaInfo("QML", "var"); + + bool isType = metaInfo.isVariant(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_variant) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isVariant(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_vector2d) +{ + auto metaInfo = createMetaInfo("QtQuick", "vector2d"); + + bool isType = metaInfo.isVector2D(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_vector2d) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isVector2D(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_vector3d) +{ + auto metaInfo = createMetaInfo("QtQuick", "vector3d"); + + bool isType = metaInfo.isVector3D(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_vector3d) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isVector3D(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_vector4d) +{ + auto metaInfo = createMetaInfo("QtQuick", "vector4d"); + + bool isType = metaInfo.isVector4D(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_vector4d) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isVector4D(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, QtQuick_ListView_is_view) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "ListView"); + + bool isType = metaInfo.isView(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, QtQuick_GridView_is_view) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "GridView"); + + bool isType = metaInfo.isView(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, QtQuick_PathView_is_view) +{ + auto metaInfo = createDerivedDummyMetaInfo("QtQuick", "PathView"); + + bool isType = metaInfo.isView(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, default_is_not_view) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isView(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, is_enumeration) +{ + auto metaInfo = createMetaInfo("QML", "Foo", QmlDesigner::Storage::TypeTraits::IsEnum); + + bool isType = metaInfo.isEnumeration(); + + ASSERT_THAT(isType, IsTrue()); +} + +TEST_F(NodeMetaInfo, is_not_enumeration) +{ + auto metaInfo = createMetaInfo("QML", "Foo", {}); + + bool isType = metaInfo.isEnumeration(); + + ASSERT_THAT(isType, IsFalse()); +} + +TEST_F(NodeMetaInfo, default_is_not_enumeration) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isType = metaInfo.isEnumeration(); + + ASSERT_THAT(isType, IsFalse()); +} } // namespace diff --git a/tests/unit/tests/unittests/model/CMakeLists.txt b/tests/unit/tests/unittests/model/CMakeLists.txt index 187ed9f99a0..75c81cca6f5 100644 --- a/tests/unit/tests/unittests/model/CMakeLists.txt +++ b/tests/unit/tests/unittests/model/CMakeLists.txt @@ -4,6 +4,8 @@ extend_qtc_test(unittest import-test.cpp model-test.cpp modelnode-test.cpp - nodelistproperty-test.cpp modelresourcemanagement-test.cpp + modelutils-test.cpp + nodelistproperty-test.cpp + ) diff --git a/tests/unit/tests/unittests/model/model-test.cpp b/tests/unit/tests/unittests/model/model-test.cpp index 7f30714e988..83a8d936c6d 100644 --- a/tests/unit/tests/unittests/model/model-test.cpp +++ b/tests/unit/tests/unittests/model/model-test.cpp @@ -855,4 +855,18 @@ TEST_F(Model, change_root_node_type_changes_meta_info) ASSERT_THAT(rootNode.metaInfo(), model.qmlQtObjectMetaInfo()); } +TEST_F(Model, meta_info) +{ + auto meta_info = model.metaInfo("QtObject"); + + ASSERT_THAT(meta_info, model.qmlQtObjectMetaInfo()); +} + +TEST_F(Model, meta_info_of_not_existing_type_is_invalid) +{ + auto meta_info = model.metaInfo("Foo"); + + ASSERT_THAT(meta_info, IsFalse()); +} + } // namespace diff --git a/tests/unit/tests/unittests/model/modelutils-test.cpp b/tests/unit/tests/unittests/model/modelutils-test.cpp new file mode 100644 index 00000000000..7423649296a --- /dev/null +++ b/tests/unit/tests/unittests/model/modelutils-test.cpp @@ -0,0 +1,109 @@ +// 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 + +#include +#include + +#include +#include + +namespace { + +class ModelUtils : public ::testing::Test +{ +protected: + NiceMock pathCacheMock{"/path/model.qml"}; + QmlDesigner::SourceId sourceId = pathCacheMock.createSourceId("/path/foo.qml"); + NiceMock projectStorageMock{pathCacheMock.sourceId}; + QmlDesigner::ModuleId moduleId = projectStorageMock.moduleId("QtQuick"); + QmlDesigner::Model model{{projectStorageMock, pathCacheMock}, + "Item", + {QmlDesigner::Import::createLibraryImport("QML"), + QmlDesigner::Import::createLibraryImport("QtQuick"), + QmlDesigner::Import::createLibraryImport("QtQml.Models")}, + QUrl::fromLocalFile(pathCacheMock.path.toQString())}; +}; + +TEST_F(ModelUtils, component_file_path) +{ + auto typeId = projectStorageMock.createType(moduleId, + "Foo", + QmlDesigner::Storage::TypeTraits::IsFileComponent, + {}, + sourceId); + QmlDesigner::NodeMetaInfo metaInfo{typeId, &projectStorageMock}; + + auto path = QmlDesigner::ModelUtils::componentFilePath(pathCacheMock, metaInfo); + + ASSERT_THAT(path, "/path/foo.qml"); +} + +TEST_F(ModelUtils, empty_component_file_path_for_non_file_component) +{ + auto typeId = projectStorageMock.createType(moduleId, "Foo", {}, {}, sourceId); + QmlDesigner::NodeMetaInfo metaInfo{typeId, &projectStorageMock}; + + auto path = QmlDesigner::ModelUtils::componentFilePath(pathCacheMock, metaInfo); + + ASSERT_THAT(path, IsEmpty()); +} + +TEST_F(ModelUtils, empty_component_file_path_for_invalid_meta_info) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + auto path = QmlDesigner::ModelUtils::componentFilePath(pathCacheMock, metaInfo); + + ASSERT_THAT(path, IsEmpty()); +} + +TEST_F(ModelUtils, component_file_path_for_node) +{ + auto typeId = projectStorageMock.createType(moduleId, + "Foo", + QmlDesigner::Storage::TypeTraits::IsFileComponent, + {}, + sourceId); + projectStorageMock.createImportedTypeNameId(pathCacheMock.sourceId, "Foo", typeId); + auto node = model.createModelNode("Foo"); + + auto path = QmlDesigner::ModelUtils::componentFilePath(node); + + ASSERT_THAT(path, "/path/foo.qml"); +} + +TEST_F(ModelUtils, component_file_path_for_invalid_node_is_empty) +{ + auto path = QmlDesigner::ModelUtils::componentFilePath(QmlDesigner::ModelNode{}); + + ASSERT_THAT(path, IsEmpty()); +} + +TEST_F(ModelUtils, component_file_path_for_node_without_metainfo_is_empty) +{ + auto typeId = projectStorageMock.createType(moduleId, + "Foo", + QmlDesigner::Storage::TypeTraits::IsFileComponent, + {}, + sourceId); + auto node = model.createModelNode("Foo"); + + auto path = QmlDesigner::ModelUtils::componentFilePath(node); + + ASSERT_THAT(path, IsEmpty()); +} + +TEST_F(ModelUtils, component_file_path_for_non_file_component_node_is_empty) +{ + auto typeId = projectStorageMock.createType(moduleId, "Foo", {}, {}, sourceId); + projectStorageMock.createImportedTypeNameId(pathCacheMock.sourceId, "Foo", typeId); + auto node = model.createModelNode("Foo"); + + auto path = QmlDesigner::ModelUtils::componentFilePath(node); + + ASSERT_THAT(path, IsEmpty()); +} + +} // namespace diff --git a/tests/unit/tests/unittests/model/nodelistproperty-test.cpp b/tests/unit/tests/unittests/model/nodelistproperty-test.cpp index f53a066734e..6783bde3e75 100644 --- a/tests/unit/tests/unittests/model/nodelistproperty-test.cpp +++ b/tests/unit/tests/unittests/model/nodelistproperty-test.cpp @@ -62,7 +62,7 @@ protected: ON_CALL(projectStorageMock, typeId(Eq(moduleId), Eq(typeName), _)).WillByDefault(Return(typeId)); ON_CALL(projectStorageMock, type(Eq(typeId))) - .WillByDefault(Return(Info::Type{defaultPropertyId, {}})); + .WillByDefault(Return(Info::Type{defaultPropertyId, QmlDesigner::SourceId{}, {}})); ON_CALL(projectStorageMock, propertyName(Eq(defaultPropertyId))) .WillByDefault(Return(defaultPeopertyName)); } diff --git a/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp b/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp index e52ddb25634..903f5f9c730 100644 --- a/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp @@ -242,15 +242,17 @@ MATCHER(StringsAreSorted, std::string(negation ? "isn't sorted" : "is sorted")) }); } -MATCHER_P2(IsInfoType, +MATCHER_P3(IsInfoType, defaultPropertyId, + sourceId, traits, std::string(negation ? "isn't " : "is ") - + PrintToString(Storage::Info::Type{defaultPropertyId, traits})) + + PrintToString(Storage::Info::Type{defaultPropertyId, sourceId, traits})) { const Storage::Info::Type &type = arg; - return type.defaultPropertyId == defaultPropertyId && type.traits == traits; + return type.defaultPropertyId == defaultPropertyId && type.sourceId == sourceId + && type.traits == traits; } class ProjectStorage : public testing::Test @@ -6520,7 +6522,7 @@ TEST_F(ProjectStorage, get_type) auto type = storage.type(typeId); - ASSERT_THAT(type, Optional(IsInfoType(defaultPropertyId, TypeTraits::Reference))); + ASSERT_THAT(type, Optional(IsInfoType(defaultPropertyId, sourceId1, TypeTraits::Reference))); } TEST_F(ProjectStorage, dont_get_type_for_invalid_id)