aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2022-08-24 15:39:21 +0200
committerThomas Hartmann <thomas.hartmann@qt.io>2022-08-26 10:56:26 +0000
commit84e3ffeaba5d5a74208f4619d57c86eaf2f8685e (patch)
treeebcc404cb83630cb688e6c4f53d6bbe5032d72b2
parentfe5848a47c6de9ca1f87593e047202f59649a8de (diff)
QmlPropjectManager: Fix ownership
Explicit ownership has the advatage that you can see if you leak memory. Removed overused casting too. Change-Id: I2336aa07525742d6c1415471ea15ed101406a90c Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r--src/plugins/qmlprojectmanager/fileformat/filefilteritems.h13
-rw-r--r--src/plugins/qmlprojectmanager/fileformat/qmlprojectfileformat.cpp27
-rw-r--r--src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp28
-rw-r--r--src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h22
4 files changed, 53 insertions, 37 deletions
diff --git a/src/plugins/qmlprojectmanager/fileformat/filefilteritems.h b/src/plugins/qmlprojectmanager/fileformat/filefilteritems.h
index 38ad7262fc..169e8dd796 100644
--- a/src/plugins/qmlprojectmanager/fileformat/filefilteritems.h
+++ b/src/plugins/qmlprojectmanager/fileformat/filefilteritems.h
@@ -25,8 +25,6 @@
#pragma once
-#include "qmlprojectitem.h"
-
#include <QObject>
#include <QRegularExpression>
#include <QSet>
@@ -38,6 +36,17 @@ namespace Utils { class FileSystemWatcher; }
namespace QmlProjectManager {
+class QmlProjectContentItem : public QObject
+{
+ // base class for all elements that should be direct children of Project element
+ Q_OBJECT
+
+public:
+ QmlProjectContentItem(QObject *parent = nullptr)
+ : QObject(parent)
+ {}
+};
+
class FileFilterBaseItem : public QmlProjectContentItem {
Q_OBJECT
diff --git a/src/plugins/qmlprojectmanager/fileformat/qmlprojectfileformat.cpp b/src/plugins/qmlprojectmanager/fileformat/qmlprojectfileformat.cpp
index ec84d34d4a..a55569d069 100644
--- a/src/plugins/qmlprojectmanager/fileformat/qmlprojectfileformat.cpp
+++ b/src/plugins/qmlprojectmanager/fileformat/qmlprojectfileformat.cpp
@@ -28,8 +28,10 @@
#include "filefilteritems.h"
#include <qmljs/qmljssimplereader.h>
-#include <QVariant>
#include <QDebug>
+#include <QVariant>
+
+#include <memory>
enum {
debug = false
@@ -37,7 +39,9 @@ enum {
namespace {
-QmlProjectManager::FileFilterBaseItem *setupFileFilterItem(QmlProjectManager::FileFilterBaseItem *fileFilterItem, const QmlJS::SimpleReaderNode::Ptr &node)
+std::unique_ptr<QmlProjectManager::FileFilterBaseItem> setupFileFilterItem(
+ std::unique_ptr<QmlProjectManager::FileFilterBaseItem> fileFilterItem,
+ const QmlJS::SimpleReaderNode::Ptr &node)
{
const auto directoryProperty = node->property(QLatin1String("directory"));
if (directoryProperty.isValid())
@@ -148,17 +152,24 @@ QmlProjectItem *QmlProjectFileFormat::parseProjectFile(const Utils::FilePath &fi
qDebug() << "reading type:" << childNode->name();
if (childNode->name() == QLatin1String("QmlFiles")) {
- projectItem->appendContent(setupFileFilterItem(new FileFilterItem("*.qml"), childNode));
+ projectItem->appendContent(
+ setupFileFilterItem(std::make_unique<FileFilterItem>("*.qml"), childNode));
} else if (childNode->name() == QLatin1String("JavaScriptFiles")) {
- projectItem->appendContent(setupFileFilterItem(new FileFilterItem("*.js"), childNode));
+ projectItem->appendContent(
+ setupFileFilterItem(std::make_unique<FileFilterItem>("*.js"), childNode));
} else if (childNode->name() == QLatin1String("ImageFiles")) {
- projectItem->appendContent(setupFileFilterItem(new ImageFileFilterItem(projectItem), childNode));
+ projectItem->appendContent(
+ setupFileFilterItem(std::make_unique<ImageFileFilterItem>(projectItem),
+ childNode));
} else if (childNode->name() == QLatin1String("CssFiles")) {
- projectItem->appendContent(setupFileFilterItem(new FileFilterItem("*.css"), childNode));
+ projectItem->appendContent(
+ setupFileFilterItem(std::make_unique<FileFilterItem>("*.css"), childNode));
} else if (childNode->name() == QLatin1String("FontFiles")) {
- projectItem->appendContent(setupFileFilterItem(new FileFilterItem("*.ttf;*.otf"), childNode));
+ projectItem->appendContent(
+ setupFileFilterItem(std::make_unique<FileFilterItem>("*.ttf;*.otf"), childNode));
} else if (childNode->name() == QLatin1String("Files")) {
- projectItem->appendContent(setupFileFilterItem(new FileFilterBaseItem(), childNode));
+ projectItem->appendContent(
+ setupFileFilterItem(std::make_unique<FileFilterBaseItem>(), childNode));
} else if (childNode->name() == "Environment") {
const auto properties = childNode->properties();
auto i = properties.constBegin();
diff --git a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp
index 806c873817..c1c51b2f2d 100644
--- a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp
+++ b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp
@@ -40,13 +40,12 @@ void QmlProjectItem::setSourceDirectory(const QString &directoryPath)
m_sourceDirectory = directoryPath;
- for (auto contentElement : qAsConst(m_content)) {
- auto fileFilter = qobject_cast<FileFilterBaseItem*>(contentElement);
- if (fileFilter) {
- fileFilter->setDefaultDirectory(directoryPath);
- connect(fileFilter, &FileFilterBaseItem::filesChanged,
- this, &QmlProjectItem::qmlFilesChanged);
- }
+ for (auto &fileFilter : m_content) {
+ fileFilter->setDefaultDirectory(directoryPath);
+ connect(fileFilter.get(),
+ &FileFilterBaseItem::filesChanged,
+ this,
+ &QmlProjectItem::qmlFilesChanged);
}
}
@@ -99,12 +98,10 @@ QStringList QmlProjectItem::files() const
{
QSet<QString> files;
- for (const auto contentElement : qAsConst(m_content)) {
- if (auto fileFilter = qobject_cast<const FileFilterBaseItem *>(contentElement)) {
- const QStringList fileList = fileFilter->files();
- for (const QString &file : fileList) {
- files.insert(file);
- }
+ for (const auto &fileFilter : m_content) {
+ const QStringList fileList = fileFilter->files();
+ for (const QString &file : fileList) {
+ files.insert(file);
}
}
return Utils::toList(files);
@@ -118,9 +115,8 @@ QStringList QmlProjectItem::files() const
*/
bool QmlProjectItem::matchesFile(const QString &filePath) const
{
- return Utils::contains(m_content, [&filePath](const QmlProjectContentItem *item) {
- auto fileFilter = qobject_cast<const FileFilterBaseItem *>(item);
- return fileFilter && fileFilter->matchesFile(filePath);
+ return Utils::contains(m_content, [&filePath](const auto &fileFilter) {
+ return fileFilter->matchesFile(filePath);
});
}
diff --git a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h
index d437db6114..d95617ef90 100644
--- a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h
+++ b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h
@@ -25,21 +25,18 @@
#pragma once
+#include "filefilteritems.h"
+
#include <utils/environment.h>
#include <QObject>
#include <QSet>
#include <QStringList>
-namespace QmlProjectManager {
-
-class QmlProjectContentItem : public QObject {
- // base class for all elements that should be direct children of Project element
- Q_OBJECT
+#include <memory>
+#include <vector>
-public:
- QmlProjectContentItem(QObject *parent = nullptr) : QObject(parent) {}
-};
+namespace QmlProjectManager {
class QmlProjectItem : public QObject
{
@@ -91,9 +88,12 @@ public:
void setShaderToolArgs(const QStringList &args) {m_shaderToolArgs = args; }
QStringList shaderToolFiles() const { return m_shaderToolFiles; }
- void setShaderToolFiles(const QStringList &files) {m_shaderToolFiles = files; }
+ void setShaderToolFiles(const QStringList &files) { m_shaderToolFiles = files; }
- void appendContent(QmlProjectContentItem *item) { m_content.append(item); }
+ void appendContent(std::unique_ptr<FileFilterBaseItem> item)
+ {
+ m_content.push_back(std::move(item));
+ }
Utils::EnvironmentItems environment() const;
void addToEnviroment(const QString &key, const QString &value);
@@ -112,7 +112,7 @@ protected:
QString m_mainFile;
QString m_mainUiFile;
Utils::EnvironmentItems m_environment;
- QVector<QmlProjectContentItem *> m_content; // content property
+ std::vector<std::unique_ptr<FileFilterBaseItem>> m_content; // content property
bool m_forceFreeType = false;
bool m_qtForMCUs = false;
bool m_qt6Project = false;