summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Hartmann <thomas.hartmann@qt.io>2023-02-07 16:09:44 +0100
committerThomas Hartmann <thomas.hartmann@qt.io>2023-02-10 15:36:35 +0000
commit4d54a16a4910582e7cb1b7501e7b977340458952 (patch)
treea90fe7ac36cf1cc112f6e67c977a7f1c88644381
parente9b1491a175f435aac6f4cbc1221d7df6f3db029 (diff)
downloadqt-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.cpp161
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());