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 <miikka.heikkinen@qt.io>
This commit is contained in:
Thomas Hartmann
2025-03-31 13:57:16 +02:00
parent 1ff575f93c
commit feab217705
5 changed files with 22 additions and 2 deletions

View File

@@ -179,6 +179,8 @@ public:
void setIsDocumentRewriterView(bool b);
#endif
void setRemoveImports(bool removeImports);
signals:
void modelInterfaceProjectUpdated();

View File

@@ -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();

View File

@@ -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)
{

View File

@@ -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

View File

@@ -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()) {