diff options
author | Thomas Hartmann <thomas.hartmann@qt.io> | 2023-02-07 16:09:44 +0100 |
---|---|---|
committer | Thomas Hartmann <thomas.hartmann@qt.io> | 2023-02-10 15:36:35 +0000 |
commit | 4d54a16a4910582e7cb1b7501e7b977340458952 (patch) | |
tree | a90fe7ac36cf1cc112f6e67c977a7f1c88644381 | |
parent | e9b1491a175f435aac6f4cbc1221d7df6f3db029 (diff) | |
download | qt-creator-4d54a16a4910582e7cb1b7501e7b977340458952.tar.gz |
QmlDesigner: Remove legacy code path from TextToNodelMerger
We can use NodeMetaInfo instead of directly accessing the code model.
Task-number: QDS-8800
Change-Id: I1d73e2a470c40a15e5237544746cb4b841f8e1b7
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Vikas Pachdha <vikas.pachdha@qt.io>
-rw-r--r-- | src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp | 161 |
1 files changed, 52 insertions, 109 deletions
diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 99cb44487c..a704c08558 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -36,11 +36,12 @@ #include <utils/qrcparser.h> #include <utils/qtcassert.h> -#include <QSet> #include <QDir> +#include <QElapsedTimer> #include <QLoggingCategory> #include <QRegularExpression> -#include <QElapsedTimer> +#include <QScopeGuard> +#include <QSet> #include <memory> @@ -428,91 +429,43 @@ public: void leaveScope() { m_scopeBuilder.pop(); } - void lookup(AST::UiQualifiedId *astTypeNode, QString &typeName, int &majorVersion, - int &minorVersion, QString &defaultPropertyName) + NodeMetaInfo lookup(AST::UiQualifiedId *astTypeNode) { - const ObjectValue *value = m_context->lookupType(m_doc.data(), astTypeNode); - defaultPropertyName = m_context->defaultPropertyName(value); - - const CppComponentValue *qmlValue = value_cast<CppComponentValue>(value); - if (qmlValue) { - typeName = qmlValue->moduleName() + QStringLiteral(".") + qmlValue->className(); - - majorVersion = qmlValue->componentVersion().majorVersion(); - minorVersion = qmlValue->componentVersion().minorVersion(); - } else { - for (AST::UiQualifiedId *iter = astTypeNode; iter; iter = iter->next) - if (!iter->next && !iter->name.isEmpty()) - typeName = iter->name.toString(); - - QString fullTypeName; - for (AST::UiQualifiedId *iter = astTypeNode; iter; iter = iter->next) - if (!iter->name.isEmpty()) - fullTypeName += iter->name.toString() + QLatin1Char('.'); - - if (fullTypeName.endsWith(QLatin1Char('.'))) - fullTypeName.chop(1); - - majorVersion = ComponentVersion::NoVersion; - minorVersion = ComponentVersion::NoVersion; - - const Imports *imports = m_context->imports(m_doc.data()); - ImportInfo importInfo = imports->info(fullTypeName, m_context.data()); - if (importInfo.isValid() && importInfo.type() == ImportType::Library) { - QString name = importInfo.name(); - majorVersion = importInfo.version().majorVersion(); - minorVersion = importInfo.version().minorVersion(); - typeName.prepend(name + QLatin1Char('.')); - } else if (importInfo.isValid() && importInfo.type() == ImportType::Directory) { - const Utils::FilePath path = Utils::FilePath::fromString(importInfo.path()); - const Utils::FilePath dir = m_doc->path(); - // should probably try to make it relative to some import path, not to the document path - const Utils::FilePath relativePath = path.relativeChildPath(dir); - QString name = relativePath.path().replace(QLatin1Char('/'), QLatin1Char('.')); - if (!name.isEmpty() && name != QLatin1String(".")) - typeName.prepend(name + QLatin1Char('.')); - } else if (importInfo.isValid() && importInfo.type() == ImportType::QrcDirectory) { - QString path = Utils::QrcParser::normalizedQrcDirectoryPath(importInfo.path()); - path = path.mid(1, path.size() - ((path.size() > 1) ? 2 : 1)); - const QString name = path.replace(QLatin1Char('/'), QLatin1Char('.')); - if (!name.isEmpty()) - typeName.prepend(name + QLatin1Char('.')); - } - } - - { - TypeName fullTypeName; - for (AST::UiQualifiedId *iter = astTypeNode; iter; iter = iter->next) - if (!iter->name.isEmpty()) - fullTypeName += iter->name.toUtf8() + '.'; + TypeName fullTypeName; + for (AST::UiQualifiedId *iter = astTypeNode; iter; iter = iter->next) + if (!iter->name.isEmpty()) + fullTypeName += iter->name.toUtf8() + '.'; - if (fullTypeName.endsWith('.')) - fullTypeName.chop(1); + if (fullTypeName.endsWith('.')) + fullTypeName.chop(1); - NodeMetaInfo metaInfo = m_model->metaInfo(fullTypeName); - - bool ok = metaInfo.typeName() == typeName.toUtf8() - && metaInfo.majorVersion() == majorVersion - && metaInfo.minorVersion() == minorVersion; + NodeMetaInfo metaInfo = m_model->metaInfo(fullTypeName); + return metaInfo; + } + bool lookupProperty(const QString &propertyPrefix, + const ModelNode &node, + const AST::UiQualifiedId *propertyId) + { + const QString propertyName = propertyPrefix.isEmpty() ? propertyId->name.toString() + : propertyPrefix; - if (!ok) { - qDebug() << Q_FUNC_INFO; - qDebug() << astTypeNode->name.toString() << typeName; - qDebug() << metaInfo.isValid() << metaInfo.typeName(); - } + if (propertyName == QStringLiteral("id") && !propertyId->next) + return false; // ### should probably be a special value - typeName = QString::fromUtf8(metaInfo.typeName()); - majorVersion = metaInfo.majorVersion(); - minorVersion = metaInfo.minorVersion(); - } + //compare to lookupProperty(propertyPrefix, propertyId); + return node.metaInfo().hasProperty(propertyName.toUtf8()); } /// When something is changed here, also change Check::checkScopeObjectMember in /// qmljscheck.cpp /// ### Maybe put this into the context as a helper function. - bool lookupProperty(const QString &prefix, const AST::UiQualifiedId *id, const Value **property = nullptr, - const ObjectValue **parentObject = nullptr, QString *name = nullptr) + /// + bool lookupProperty(const QString &prefix, + const AST::UiQualifiedId *id, + const Value **property = nullptr, + const ObjectValue **parentObject = nullptr, + QString *name = nullptr) { QList<const ObjectValue *> scopeObjects = m_scopeChain.qmlScopeObjects(); if (scopeObjects.isEmpty()) @@ -1205,23 +1158,21 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, m_rewriterView->positionStorage()->setNodeOffset(modelNode, astObjectType->identifierToken.offset); - QString typeNameString; - QString defaultPropertyNameString; - int majorVersion; - int minorVersion; - context->lookup(astObjectType, typeNameString, majorVersion, minorVersion, defaultPropertyNameString); + NodeMetaInfo info = context->lookup(astObjectType); + if (!info.isValid()) { + qWarning() << "Skipping node with unknown type" << toString(astObjectType) << info.typeName(); + return; + } + + int majorVersion = info.majorVersion(); + int minorVersion = info.minorVersion(); - TypeName typeName = typeNameString.toUtf8(); - PropertyName defaultPropertyName = defaultPropertyNameString.toUtf8(); + TypeName typeName = info.typeName(); + PropertyName defaultPropertyName = info.defaultPropertyName(); if (defaultPropertyName.isEmpty()) //fallback and use the meta system of the model defaultPropertyName = modelNode.metaInfo().defaultPropertyName(); - if (typeName.isEmpty()) { - qWarning() << "Skipping node with unknown type" << toString(astObjectType); - return; - } - if (modelNode.isRootNode() && !m_rewriterView->allowComponentRoot() && isComponentType(typeName)) { for (AST::UiObjectMemberList *iter = astInitializer->members; iter; iter = iter->next) { if (auto def = AST::cast<AST::UiObjectDefinition *>(iter->member)) { @@ -1564,20 +1515,16 @@ void TextToModelMerger::syncNodeProperty(AbstractProperty &modelProperty, const TypeName &dynamicPropertyType, DifferenceHandler &differenceHandler) { + NodeMetaInfo info = context->lookup(binding->qualifiedTypeNameId); - QString typeNameString; - QString dummy; - int majorVersion; - int minorVersion; - context->lookup(binding->qualifiedTypeNameId, typeNameString, majorVersion, minorVersion, dummy); - - TypeName typeName = typeNameString.toUtf8(); - - - if (typeName.isEmpty()) { - qWarning() << "Skipping node with unknown type" << toString(binding->qualifiedTypeNameId); + if (!info.isValid()) { + qWarning() << "SNP" + << "Skipping node with unknown type" << toString(binding->qualifiedTypeNameId); return; } + TypeName typeName = info.typeName(); + int majorVersion = info.majorVersion(); + int minorVersion = info.minorVersion(); if (modelProperty.isNodeProperty() && dynamicPropertyType == modelProperty.dynamicTypeName()) { ModelNode nodePropertyNode = modelProperty.toNodeProperty().modelNode(); @@ -2095,18 +2042,14 @@ ModelNode ModelAmender::listPropertyMissingModelNode(NodeListProperty &modelProp if (!astObjectType || !astInitializer) return ModelNode(); - QString typeNameString; - QString dummy; - int majorVersion; - int minorVersion; - context->lookup(astObjectType, typeNameString, majorVersion, minorVersion, dummy); - - TypeName typeName = typeNameString.toUtf8(); - - if (typeName.isEmpty()) { + NodeMetaInfo info = context->lookup(astObjectType); + if (!info.isValid()) { qWarning() << "Skipping node with unknown type" << toString(astObjectType); - return ModelNode(); + return {}; } + TypeName typeName = info.typeName(); + int majorVersion = info.majorVersion(); + int minorVersion = info.minorVersion(); const bool propertyTakesComponent = propertyIsComponentType(modelProperty, typeName, m_merger->view()->model()); |