From d408ad2e4fbbebe5e1c6208d029f2663217c2e20 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 11 Mar 2025 10:51:36 +0100 Subject: [PATCH] QmlProjectManager: Fix crash when creating qml project Change-Id: Icaaa4f455f40b84188f014848f84c1c8a0ab238b Reviewed-by: Christian Kandeler --- .../projectexplorer/runconfiguration.h | 4 +-- .../qmlprojectmanager/qmlmainfileaspect.cpp | 26 ++++++++++--------- .../qmlprojectmanager/qmlmainfileaspect.h | 2 -- .../qmlprojectrunconfiguration.cpp | 1 - 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index 730402bd5c6..46c09c24d30 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -176,11 +176,11 @@ public: BuildConfiguration *buildConfiguration() const { return m_buildConfiguration; } + BuildSystem *buildSystem() const; + protected: RunConfiguration(BuildConfiguration *bc, Utils::Id id); - BuildSystem *buildSystem() const; - using Updater = std::function; void setUpdater(const Updater &updater); diff --git a/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp b/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp index 420fde2102b..f6591b9af63 100644 --- a/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp +++ b/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp @@ -14,7 +14,6 @@ #include #include -#include #include #include @@ -91,7 +90,9 @@ void QmlMainFileAspect::fromMap(const Store &map) void QmlMainFileAspect::updateFileComboBox() { - const FilePath projectDir = m_target->project()->projectDirectory(); + auto buildSystem = qmlBuildSystem(); + QTC_ASSERT(buildSystem, return); + const FilePath projectDir = buildSystem->projectDirectory(); if (mainScriptSource() == FileInProjectFile) { const FilePath mainScriptInFilePath = mainScript().relativePathFromDir(projectDir); @@ -108,7 +109,7 @@ void QmlMainFileAspect::updateFileComboBox() m_fileListModel.appendRow(new QStandardItem(CURRENT_FILE)); QModelIndex currentIndex; - FilePaths sortedFiles = m_target->project()->files(Project::SourceFiles); + FilePaths sortedFiles = buildSystem->project()->files(Project::SourceFiles); // make paths relative to project directory FilePaths relativeFiles; @@ -143,6 +144,7 @@ void QmlMainFileAspect::updateFileComboBox() QmlMainFileAspect::MainScriptSource QmlMainFileAspect::mainScriptSource() const { + QTC_ASSERT(qmlBuildSystem(), return FileInEditor); if (!qmlBuildSystem()->mainFile().isEmpty()) return FileInProjectFile; if (!m_mainScriptFilename.isEmpty()) @@ -160,11 +162,6 @@ void QmlMainFileAspect::setMainScript(int index) } } -void QmlMainFileAspect::setTarget(ProjectExplorer::Target *target) -{ - m_target = target; -} - void QmlMainFileAspect::setScriptSource(MainScriptSource source, const QString &settingsPath) { if (source == FileInEditor) { @@ -175,7 +172,8 @@ void QmlMainFileAspect::setScriptSource(MainScriptSource source, const QString & m_mainScriptFilename.clear(); } else { // FileInSettings m_scriptFile = settingsPath; - m_mainScriptFilename = m_target->project()->projectDirectory() / m_scriptFile; + if (QTC_GUARD(qmlBuildSystem())) + m_mainScriptFilename = qmlBuildSystem()->projectDirectory() / m_scriptFile; } emit changed(); @@ -187,7 +185,7 @@ void QmlMainFileAspect::setScriptSource(MainScriptSource source, const QString & */ FilePath QmlMainFileAspect::mainScript() const { - if (!qmlBuildSystem()->mainFile().isEmpty()) { + if (QTC_GUARD(qmlBuildSystem()) && !qmlBuildSystem()->mainFile().isEmpty()) { const FilePath pathInProject = qmlBuildSystem()->mainFilePath(); return qmlBuildSystem()->canonicalProjectDir().resolvePath(pathInProject); } @@ -232,7 +230,9 @@ bool QmlMainFileAspect::isQmlFilePresent() || mainScriptMimeType.matchesName(QMLPROJECT_MIMETYPE)) { // find a qml file with lowercase filename. This is slow, but only done // in initialization/other border cases. - const FilePaths files = m_target->project()->files(Project::SourceFiles); + + QTC_ASSERT(qmlBuildSystem(), return qmlFileFound); + const FilePaths files = qmlBuildSystem()->project()->files(Project::SourceFiles); for (const FilePath &filename : files) { if (!filename.isEmpty() && filename.baseName().at(0).isLower()) { const MimeType type = mimeTypeForFile(filename); @@ -252,7 +252,9 @@ bool QmlMainFileAspect::isQmlFilePresent() QmlBuildSystem *QmlMainFileAspect::qmlBuildSystem() const { - return static_cast(m_target->buildSystem()); + RunConfiguration *runConfig = qobject_cast(container()); + QTC_ASSERT(runConfig, return nullptr); + return qobject_cast(runConfig->buildSystem()); } } // QmlProjectManager diff --git a/src/plugins/qmlprojectmanager/qmlmainfileaspect.h b/src/plugins/qmlprojectmanager/qmlmainfileaspect.h index bc46a727705..2b437fda133 100644 --- a/src/plugins/qmlprojectmanager/qmlmainfileaspect.h +++ b/src/plugins/qmlprojectmanager/qmlmainfileaspect.h @@ -50,7 +50,6 @@ public: MainScriptSource mainScriptSource() const; void setMainScript(int index); - void setTarget(ProjectExplorer::Target *target); void setScriptSource(MainScriptSource source, const QString &settingsPath = QString()); Utils::FilePath mainScript() const; @@ -60,7 +59,6 @@ public: QmlBuildSystem *qmlBuildSystem() const; public: - ProjectExplorer::Target *m_target = nullptr; QPointer m_fileListCombo; QStandardItemModel m_fileListModel; QString m_scriptFile; diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index 5729002b88f..9281a4680db 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -118,7 +118,6 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(BuildConfiguration *bc, I return cmd; }); - qmlMainFile.setTarget(target()); connect(&qmlMainFile, &BaseAspect::changed, this, &RunConfiguration::update); if (Core::ICore::isQtDesignStudio())