From feab217705656e313c11462f69a2dc795ff32fd1 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 31 Mar 2025 13:57:16 +0200 Subject: [PATCH] QmlDesigner: Do not remove imports is parsing virtual files Since we use the same url as the QML file currently edited, if we remove imports this breaks the imports. This is because when parsing the "virtual file" imports could be removed (which is disabled by this patch). The verification step triggered by the merger does not check for "temporarily" removed imports, because this was done on a different model. The project storage cannot handle this. The alternative would be to use a different "virtual" file URL. This patch also sets all imports of the current document on the template. Task-number: QDS-15046 Change-Id: Id8826c28232eeba347af191f04a92872e1833c4e Reviewed-by: Miikka Heikkinen --- .../libs/designercore/include/rewriterview.h | 2 ++ .../libs/designercore/rewriter/rewriterview.cpp | 5 +++++ .../libs/designercore/rewriter/texttomodelmerger.cpp | 11 +++++++++-- .../libs/designercore/rewriter/texttomodelmerger.h | 3 +++ src/plugins/qmldesigner/qmltools/qmlvisualnode.cpp | 3 +++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/libs/designercore/include/rewriterview.h b/src/plugins/qmldesigner/libs/designercore/include/rewriterview.h index 9672fdc35d2..ac64b97cd3f 100644 --- a/src/plugins/qmldesigner/libs/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/libs/designercore/include/rewriterview.h @@ -179,6 +179,8 @@ public: void setIsDocumentRewriterView(bool b); #endif + void setRemoveImports(bool removeImports); + signals: void modelInterfaceProjectUpdated(); diff --git a/src/plugins/qmldesigner/libs/designercore/rewriter/rewriterview.cpp b/src/plugins/qmldesigner/libs/designercore/rewriter/rewriterview.cpp index 02f5c2f05d3..d94846d234a 100644 --- a/src/plugins/qmldesigner/libs/designercore/rewriter/rewriterview.cpp +++ b/src/plugins/qmldesigner/libs/designercore/rewriter/rewriterview.cpp @@ -678,6 +678,11 @@ void RewriterView::setIsDocumentRewriterView(bool b) } #endif +void RewriterView::setRemoveImports(bool removeImports) +{ + m_textToModelMerger->setRemoveImports(removeImports); +} + Internal::ModelNodePositionStorage *RewriterView::positionStorage() const { return m_positionStorage.get(); diff --git a/src/plugins/qmldesigner/libs/designercore/rewriter/texttomodelmerger.cpp b/src/plugins/qmldesigner/libs/designercore/rewriter/texttomodelmerger.cpp index 57785a1a570..f9f56923378 100644 --- a/src/plugins/qmldesigner/libs/designercore/rewriter/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/libs/designercore/rewriter/texttomodelmerger.cpp @@ -702,8 +702,10 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc, } } - for (const Import &import : std::as_const(existingImports)) - differenceHandler.importAbsentInQMl(import); + if (m_removeImports) { + for (const Import &import : std::as_const(existingImports)) + differenceHandler.importAbsentInQMl(import); + } } namespace { @@ -2439,6 +2441,11 @@ void TextToModelMerger::clearPossibleImportKeys() m_previousPossibleModulesSize = -1; } +void TextToModelMerger::setRemoveImports(bool removeImports) +{ + m_removeImports = removeImports; +} + QString TextToModelMerger::textAt(const Document::Ptr &doc, const SourceLocation &location) { diff --git a/src/plugins/qmldesigner/libs/designercore/rewriter/texttomodelmerger.h b/src/plugins/qmldesigner/libs/designercore/rewriter/texttomodelmerger.h index 897555c301d..9220f226703 100644 --- a/src/plugins/qmldesigner/libs/designercore/rewriter/texttomodelmerger.h +++ b/src/plugins/qmldesigner/libs/designercore/rewriter/texttomodelmerger.h @@ -124,6 +124,8 @@ public: void clearPossibleImportKeys(); + void setRemoveImports(bool removeImports); + private: void setupCustomParserNode(const ModelNode &node); void setupComponent(const ModelNode &node); @@ -160,6 +162,7 @@ private: Imports m_possibleModules; int m_previousPossibleModulesSize = -1; bool m_hasVersionlessImport = false; + bool m_removeImports = true; }; class DifferenceHandler diff --git a/src/plugins/qmldesigner/qmltools/qmlvisualnode.cpp b/src/plugins/qmldesigner/qmltools/qmlvisualnode.cpp index 61f6833dd59..1e17c2e2fac 100644 --- a/src/plugins/qmldesigner/qmltools/qmlvisualnode.cpp +++ b/src/plugins/qmldesigner/qmltools/qmlvisualnode.cpp @@ -289,6 +289,8 @@ static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view, auto inputModel = Model::create("QtQuick.Item", 1, 0, view->model()); #endif inputModel->setFileUrl(view->model()->fileUrl()); + inputModel->changeImports(view->model()->imports(), {}); + QPlainTextEdit textEdit; textEdit.setPlainText(source); @@ -300,6 +302,7 @@ static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view, rewriterView->setTextModifier(&modifier); rewriterView->setAllowComponentRoot(true); rewriterView->setPossibleImportsEnabled(false); + rewriterView->setRemoveImports(false); inputModel->setRewriterView(rewriterView.get()); if (rewriterView->errors().isEmpty() && rewriterView->rootModelNode().isValid()) {