aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--VERSION2
-rw-r--r--src/lib/corelib/tools/stlutils.h3
-rw-r--r--src/lib/msbuild/CMakeLists.txt4
-rw-r--r--src/lib/msbuild/msbuild.qbs4
-rw-r--r--src/lib/msbuild/msbuild/imsbuildnode.h50
-rw-r--r--src/lib/msbuild/msbuild/items/msbuildclcompile.cpp4
-rw-r--r--src/lib/msbuild/msbuild/items/msbuildclcompile.h4
-rw-r--r--src/lib/msbuild/msbuild/items/msbuildclinclude.cpp4
-rw-r--r--src/lib/msbuild/msbuild/items/msbuildclinclude.h4
-rw-r--r--src/lib/msbuild/msbuild/items/msbuildfileitem.cpp20
-rw-r--r--src/lib/msbuild/msbuild/items/msbuildfileitem.h2
-rw-r--r--src/lib/msbuild/msbuild/items/msbuildfilter.cpp18
-rw-r--r--src/lib/msbuild/msbuild/items/msbuildfilter.h7
-rw-r--r--src/lib/msbuild/msbuild/items/msbuildlink.cpp6
-rw-r--r--src/lib/msbuild/msbuild/items/msbuildlink.h5
-rw-r--r--src/lib/msbuild/msbuild/items/msbuildnone.cpp4
-rw-r--r--src/lib/msbuild/msbuild/items/msbuildnone.h4
-rw-r--r--src/lib/msbuild/msbuild/msbuildimport.cpp11
-rw-r--r--src/lib/msbuild/msbuild/msbuildimport.h7
-rw-r--r--src/lib/msbuild/msbuild/msbuildimportgroup.cpp21
-rw-r--r--src/lib/msbuild/msbuild/msbuildimportgroup.h13
-rw-r--r--src/lib/msbuild/msbuild/msbuilditem.cpp12
-rw-r--r--src/lib/msbuild/msbuild/msbuilditem.h8
-rw-r--r--src/lib/msbuild/msbuild/msbuilditemdefinitiongroup.cpp11
-rw-r--r--src/lib/msbuild/msbuild/msbuilditemdefinitiongroup.h7
-rw-r--r--src/lib/msbuild/msbuild/msbuilditemgroup.cpp10
-rw-r--r--src/lib/msbuild/msbuild/msbuilditemgroup.h8
-rw-r--r--src/lib/msbuild/msbuild/msbuilditemgroupbase.cpp (renamed from src/lib/msbuild/msbuild/imsbuildgroup.cpp)20
-rw-r--r--src/lib/msbuild/msbuild/msbuilditemgroupbase.h (renamed from src/lib/msbuild/msbuild/imsbuildgroup.h)37
-rw-r--r--src/lib/msbuild/msbuild/msbuilditemmetadata.cpp9
-rw-r--r--src/lib/msbuild/msbuild/msbuilditemmetadata.h10
-rw-r--r--src/lib/msbuild/msbuild/msbuildproject.cpp18
-rw-r--r--src/lib/msbuild/msbuild/msbuildproject.h16
-rw-r--r--src/lib/msbuild/msbuild/msbuildproperty.cpp9
-rw-r--r--src/lib/msbuild/msbuild/msbuildproperty.h9
-rw-r--r--src/lib/msbuild/msbuild/msbuildpropertybase.cpp5
-rw-r--r--src/lib/msbuild/msbuild/msbuildpropertybase.h7
-rw-r--r--src/lib/msbuild/msbuild/msbuildpropertygroup.cpp22
-rw-r--r--src/lib/msbuild/msbuild/msbuildpropertygroup.h13
-rw-r--r--src/plugins/generator/visualstudio/msbuildfiltersproject.cpp29
-rw-r--r--src/plugins/generator/visualstudio/msbuildfiltersproject.h5
-rw-r--r--src/plugins/generator/visualstudio/msbuildqbsgenerateproject.cpp14
-rw-r--r--src/plugins/generator/visualstudio/msbuildqbsgenerateproject.h7
-rw-r--r--src/plugins/generator/visualstudio/msbuildqbsproductproject.cpp43
-rw-r--r--src/plugins/generator/visualstudio/msbuildqbsproductproject.h10
-rw-r--r--src/plugins/generator/visualstudio/msbuildsharedsolutionpropertiesproject.cpp2
-rw-r--r--src/plugins/generator/visualstudio/msbuildsharedsolutionpropertiesproject.h2
-rw-r--r--src/plugins/generator/visualstudio/msbuildsolutionpropertiesproject.cpp2
-rw-r--r--src/plugins/generator/visualstudio/msbuildsolutionpropertiesproject.h2
-rw-r--r--src/plugins/generator/visualstudio/msbuildtargetproject.cpp27
-rw-r--r--src/plugins/generator/visualstudio/msbuildtargetproject.h7
51 files changed, 283 insertions, 295 deletions
diff --git a/VERSION b/VERSION
index 4a36342fc..fd2a01863 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-3.0.0
+3.1.0
diff --git a/src/lib/corelib/tools/stlutils.h b/src/lib/corelib/tools/stlutils.h
index 306f37157..4fa01219e 100644
--- a/src/lib/corelib/tools/stlutils.h
+++ b/src/lib/corelib/tools/stlutils.h
@@ -263,6 +263,9 @@ constexpr std::underlying_type_t<Enum> toUnderlying(Enum e) noexcept
return static_cast<std::underlying_type_t<Enum>>(e);
}
+template<typename T, typename... Types>
+constexpr bool is_any_of_types = std::disjunction_v<std::is_same<T, Types>...>;
+
} // namespace Internal
} // namespace qbs
diff --git a/src/lib/msbuild/CMakeLists.txt b/src/lib/msbuild/CMakeLists.txt
index c908ed2d3..90259e14b 100644
--- a/src/lib/msbuild/CMakeLists.txt
+++ b/src/lib/msbuild/CMakeLists.txt
@@ -13,8 +13,6 @@ set(SOLUTION_SOURCES
list_transform_prepend(SOLUTION_SOURCES solution/)
set(MSBUILD_SOURCES
- imsbuildgroup.cpp
- imsbuildgroup.h
imsbuildnode.cpp
imsbuildnode.h
imsbuildnodevisitor.h
@@ -24,6 +22,8 @@ set(MSBUILD_SOURCES
msbuildimportgroup.h
msbuilditem.cpp
msbuilditem.h
+ msbuilditemgroupbase.cpp
+ msbuilditemgroupbase.h
msbuilditemdefinitiongroup.cpp
msbuilditemdefinitiongroup.h
msbuilditemgroup.cpp
diff --git a/src/lib/msbuild/msbuild.qbs b/src/lib/msbuild/msbuild.qbs
index 505b977be..9f5b1e62b 100644
--- a/src/lib/msbuild/msbuild.qbs
+++ b/src/lib/msbuild/msbuild.qbs
@@ -28,8 +28,6 @@ QbsStaticLibrary {
name: "MSBuild Object Model"
prefix: "msbuild/"
files: [
- "imsbuildgroup.cpp",
- "imsbuildgroup.h",
"imsbuildnode.cpp",
"imsbuildnode.h",
"imsbuildnodevisitor.h",
@@ -39,6 +37,8 @@ QbsStaticLibrary {
"msbuildimportgroup.h",
"msbuilditem.cpp",
"msbuilditem.h",
+ "msbuilditemgroupbase.cpp",
+ "msbuilditemgroupbase.h",
"msbuilditemdefinitiongroup.cpp",
"msbuilditemdefinitiongroup.h",
"msbuilditemgroup.cpp",
diff --git a/src/lib/msbuild/msbuild/imsbuildnode.h b/src/lib/msbuild/msbuild/imsbuildnode.h
index 67fb10081..750ac23f7 100644
--- a/src/lib/msbuild/msbuild/imsbuildnode.h
+++ b/src/lib/msbuild/msbuild/imsbuildnode.h
@@ -31,6 +31,11 @@
#ifndef IMSBUILDNODE_H
#define IMSBUILDNODE_H
+#include <tools/stlutils.h>
+
+#include <memory>
+#include <vector>
+
namespace qbs {
class IMSBuildNodeVisitor;
@@ -42,6 +47,51 @@ public:
virtual void accept(IMSBuildNodeVisitor *visitor) const = 0;
};
+template<typename... Types>
+class MSBuildNode : public IMSBuildNode
+{
+public:
+ template<class T>
+ T *appendChild(std::unique_ptr<T> child)
+ {
+ static_assert(Internal::is_any_of_types<T, Types...>, "Type is not in the allowed list");
+ const auto p = child.get();
+ m_children.push_back(std::move(child));
+ return p;
+ }
+
+ template<class T, class... Args>
+ T *makeChild(Args &&...args)
+ {
+ static_assert(Internal::is_any_of_types<T, Types...>, "Type is not in the allowed list");
+ return appendChild(std::make_unique<T>(std::forward<Args>(args)...));
+ }
+
+ template<class T>
+ std::unique_ptr<T> takeChild(T *ptr)
+ {
+ static_assert(Internal::is_any_of_types<T, Types...>, "Type is not in the allowed list");
+ const auto pred = [ptr](const auto &node) { return node.get() == ptr; };
+ const auto it = std::find_if(m_children.begin(), m_children.end(), pred);
+ if (it == m_children.end())
+ return {};
+ std::unique_ptr<T> result(static_cast<T *>(it->release()));
+ m_children.erase(it);
+ return result;
+ }
+
+protected:
+ const std::vector<std::unique_ptr<IMSBuildNode>> &children() const { return m_children; }
+ void acceptChildren(IMSBuildNodeVisitor *visitor) const
+ {
+ for (const auto &child : m_children)
+ child->accept(visitor);
+ }
+
+private:
+ std::vector<std::unique_ptr<IMSBuildNode>> m_children;
+};
+
} // namespace qbs
#endif // IMSBUILDNODE_H
diff --git a/src/lib/msbuild/msbuild/items/msbuildclcompile.cpp b/src/lib/msbuild/msbuild/items/msbuildclcompile.cpp
index d8a587454..6e0e1056d 100644
--- a/src/lib/msbuild/msbuild/items/msbuildclcompile.cpp
+++ b/src/lib/msbuild/msbuild/items/msbuildclcompile.cpp
@@ -34,8 +34,8 @@ namespace qbs {
static const QString MSBuildClCompileItemName = QStringLiteral("ClCompile");
-MSBuildClCompile::MSBuildClCompile(IMSBuildItemGroup *parent)
- : MSBuildFileItem(MSBuildClCompileItemName, parent)
+MSBuildClCompile::MSBuildClCompile()
+ : MSBuildFileItem(MSBuildClCompileItemName)
{
}
diff --git a/src/lib/msbuild/msbuild/items/msbuildclcompile.h b/src/lib/msbuild/msbuild/items/msbuildclcompile.h
index 8c326a036..9103481f1 100644
--- a/src/lib/msbuild/msbuild/items/msbuildclcompile.h
+++ b/src/lib/msbuild/msbuild/items/msbuildclcompile.h
@@ -37,10 +37,8 @@ namespace qbs {
class MSBuildClCompile : public MSBuildFileItem
{
- Q_OBJECT
- Q_DISABLE_COPY(MSBuildClCompile)
public:
- explicit MSBuildClCompile(IMSBuildItemGroup *parent = nullptr);
+ explicit MSBuildClCompile();
};
} // namespace qbs
diff --git a/src/lib/msbuild/msbuild/items/msbuildclinclude.cpp b/src/lib/msbuild/msbuild/items/msbuildclinclude.cpp
index d9c61bece..207950144 100644
--- a/src/lib/msbuild/msbuild/items/msbuildclinclude.cpp
+++ b/src/lib/msbuild/msbuild/items/msbuildclinclude.cpp
@@ -34,8 +34,8 @@ namespace qbs {
static const QString MSBuildClIncludeItemName = QStringLiteral("ClInclude");
-MSBuildClInclude::MSBuildClInclude(IMSBuildItemGroup *parent)
- : MSBuildFileItem(MSBuildClIncludeItemName, parent)
+MSBuildClInclude::MSBuildClInclude()
+ : MSBuildFileItem(MSBuildClIncludeItemName)
{
}
diff --git a/src/lib/msbuild/msbuild/items/msbuildclinclude.h b/src/lib/msbuild/msbuild/items/msbuildclinclude.h
index 77d8e0ff2..54be95795 100644
--- a/src/lib/msbuild/msbuild/items/msbuildclinclude.h
+++ b/src/lib/msbuild/msbuild/items/msbuildclinclude.h
@@ -37,10 +37,8 @@ namespace qbs {
class MSBuildClInclude : public MSBuildFileItem
{
- Q_OBJECT
- Q_DISABLE_COPY(MSBuildClInclude)
public:
- explicit MSBuildClInclude(IMSBuildItemGroup *parent = nullptr);
+ explicit MSBuildClInclude();
};
} // namespace qbs
diff --git a/src/lib/msbuild/msbuild/items/msbuildfileitem.cpp b/src/lib/msbuild/msbuild/items/msbuildfileitem.cpp
index 4cbb01d04..114e7b24f 100644
--- a/src/lib/msbuild/msbuild/items/msbuildfileitem.cpp
+++ b/src/lib/msbuild/msbuild/items/msbuildfileitem.cpp
@@ -38,15 +38,13 @@ namespace qbs {
class MSBuildFileItemPrivate
{
public:
- std::unique_ptr<MSBuildItemMetadata> filter;
+ MSBuildItemMetadata *filter{nullptr};
};
-MSBuildFileItem::MSBuildFileItem(const QString &name, IMSBuildItemGroup *parent)
- : MSBuildItem(name, parent)
+MSBuildFileItem::MSBuildFileItem(const QString &name)
+ : MSBuildItem(name)
, d(new MSBuildFileItemPrivate)
-{
- d->filter = std::make_unique<MSBuildItemMetadata>(QStringLiteral("Filter"), QVariant());
-}
+{}
MSBuildFileItem::~MSBuildFileItem() = default;
@@ -62,13 +60,17 @@ void MSBuildFileItem::setFilePath(const QString &filePath)
QString MSBuildFileItem::filterName() const
{
- return d->filter->value().toString();
+ return d->filter ? d->filter->value().toString() : QString();
}
void MSBuildFileItem::setFilterName(const QString &filterName)
{
- d->filter->setValue(filterName);
- d->filter->setParent(!filterName.isEmpty() ? this : nullptr);
+ if (d->filter) {
+ (void) takeChild(d->filter);
+ d->filter = nullptr;
+ }
+ if (!filterName.isEmpty())
+ d->filter = makeChild<MSBuildItemMetadata>(QStringLiteral("Filter"), filterName);
}
} // namespace qbs
diff --git a/src/lib/msbuild/msbuild/items/msbuildfileitem.h b/src/lib/msbuild/msbuild/items/msbuildfileitem.h
index f34ac119a..be5e52ec6 100644
--- a/src/lib/msbuild/msbuild/items/msbuildfileitem.h
+++ b/src/lib/msbuild/msbuild/items/msbuildfileitem.h
@@ -49,7 +49,7 @@ public:
void setFilterName(const QString &filterName);
protected:
- explicit MSBuildFileItem(const QString &name, IMSBuildItemGroup *parent = nullptr);
+ explicit MSBuildFileItem(const QString &name);
private:
std::unique_ptr<MSBuildFileItemPrivate> d;
diff --git a/src/lib/msbuild/msbuild/items/msbuildfilter.cpp b/src/lib/msbuild/msbuild/items/msbuildfilter.cpp
index 0b9c2c86a..95b91ca69 100644
--- a/src/lib/msbuild/msbuild/items/msbuildfilter.cpp
+++ b/src/lib/msbuild/msbuild/items/msbuildfilter.cpp
@@ -48,21 +48,19 @@ public:
MSBuildItemMetadata *extensionsMetadata = nullptr;
};
-MSBuildFilter::MSBuildFilter(IMSBuildItemGroup *parent)
- : MSBuildItem(MSBuildFilterItemName, parent)
+MSBuildFilter::MSBuildFilter()
+ : MSBuildItem(MSBuildFilterItemName)
, d(new MSBuildFilterPrivate)
{
- d->identifierMetadata = new MSBuildItemMetadata(QStringLiteral("UniqueIdentifier"),
- QVariant(), this);
- d->extensionsMetadata = new MSBuildItemMetadata(QStringLiteral("Extensions"),
- QVariant(), this);
+ d->identifierMetadata = makeChild<MSBuildItemMetadata>(
+ QStringLiteral("UniqueIdentifier"), QVariant());
+ d->extensionsMetadata = makeChild<MSBuildItemMetadata>(
+ QStringLiteral("Extensions"), QVariant());
setIdentifier(QUuid::createUuid());
}
-MSBuildFilter::MSBuildFilter(const QString &name,
- const QList<QString> &extensions,
- IMSBuildItemGroup *parent)
- : MSBuildFilter(parent)
+MSBuildFilter::MSBuildFilter(const QString &name, const QList<QString> &extensions)
+ : MSBuildFilter()
{
setInclude(name);
setExtensions(extensions);
diff --git a/src/lib/msbuild/msbuild/items/msbuildfilter.h b/src/lib/msbuild/msbuild/items/msbuildfilter.h
index fb977f1cc..8c09ee06c 100644
--- a/src/lib/msbuild/msbuild/items/msbuildfilter.h
+++ b/src/lib/msbuild/msbuild/items/msbuildfilter.h
@@ -35,16 +35,13 @@
namespace qbs {
-class IMSBuildItemGroup;
class MSBuildFilterPrivate;
class MSBuildFilter : public MSBuildItem
{
- Q_OBJECT
public:
- explicit MSBuildFilter(IMSBuildItemGroup *parent = nullptr);
- MSBuildFilter(const QString &name, const QList<QString> &extensions,
- IMSBuildItemGroup *parent = nullptr);
+ explicit MSBuildFilter();
+ MSBuildFilter(const QString &name, const QList<QString> &extensions);
~MSBuildFilter() override;
QUuid identifier() const;
diff --git a/src/lib/msbuild/msbuild/items/msbuildlink.cpp b/src/lib/msbuild/msbuild/items/msbuildlink.cpp
index cae1a63a3..f171ca5e6 100644
--- a/src/lib/msbuild/msbuild/items/msbuildlink.cpp
+++ b/src/lib/msbuild/msbuild/items/msbuildlink.cpp
@@ -30,14 +30,12 @@
#include "msbuildlink.h"
-#include "../imsbuildgroup.h"
-
namespace qbs {
static const QString MSBuildLinkItemName = QStringLiteral("Link");
-MSBuildLink::MSBuildLink(IMSBuildItemGroup *parent)
- : MSBuildItem(MSBuildLinkItemName, parent)
+MSBuildLink::MSBuildLink()
+ : MSBuildItem(MSBuildLinkItemName)
{
}
diff --git a/src/lib/msbuild/msbuild/items/msbuildlink.h b/src/lib/msbuild/msbuild/items/msbuildlink.h
index 3d7a3ab44..cfb38e339 100644
--- a/src/lib/msbuild/msbuild/items/msbuildlink.h
+++ b/src/lib/msbuild/msbuild/items/msbuildlink.h
@@ -35,13 +35,10 @@
namespace qbs {
-class IMSBuildItemGroup;
-
class MSBuildLink : public MSBuildItem
{
- Q_OBJECT
public:
- explicit MSBuildLink(IMSBuildItemGroup *parent = nullptr);
+ explicit MSBuildLink();
};
} // namespace qbs
diff --git a/src/lib/msbuild/msbuild/items/msbuildnone.cpp b/src/lib/msbuild/msbuild/items/msbuildnone.cpp
index a590c6e9f..d0611e6d7 100644
--- a/src/lib/msbuild/msbuild/items/msbuildnone.cpp
+++ b/src/lib/msbuild/msbuild/items/msbuildnone.cpp
@@ -32,8 +32,8 @@
namespace qbs {
-MSBuildNone::MSBuildNone(IMSBuildItemGroup *parent)
- : MSBuildFileItem(QStringLiteral("None"), parent)
+MSBuildNone::MSBuildNone()
+ : MSBuildFileItem(QStringLiteral("None"))
{
}
diff --git a/src/lib/msbuild/msbuild/items/msbuildnone.h b/src/lib/msbuild/msbuild/items/msbuildnone.h
index 3779da04f..6fc268612 100644
--- a/src/lib/msbuild/msbuild/items/msbuildnone.h
+++ b/src/lib/msbuild/msbuild/items/msbuildnone.h
@@ -37,10 +37,8 @@ namespace qbs {
class MSBuildNone : public MSBuildFileItem
{
- Q_OBJECT
- Q_DISABLE_COPY(MSBuildNone)
public:
- explicit MSBuildNone(IMSBuildItemGroup *parent = nullptr);
+ explicit MSBuildNone();
};
} // namespace qbs
diff --git a/src/lib/msbuild/msbuild/msbuildimport.cpp b/src/lib/msbuild/msbuild/msbuildimport.cpp
index 000af4496..4178a9a2b 100644
--- a/src/lib/msbuild/msbuild/msbuildimport.cpp
+++ b/src/lib/msbuild/msbuild/msbuildimport.cpp
@@ -43,15 +43,8 @@ public:
QString condition;
};
-MSBuildImport::MSBuildImport(MSBuildProject *parent)
- : QObject(parent)
- , d(new MSBuildImportPrivate)
-{
-}
-
-MSBuildImport::MSBuildImport(MSBuildImportGroup *parent)
- : QObject(parent)
- , d(new MSBuildImportPrivate)
+MSBuildImport::MSBuildImport()
+ : d(new MSBuildImportPrivate)
{
}
diff --git a/src/lib/msbuild/msbuild/msbuildimport.h b/src/lib/msbuild/msbuild/msbuildimport.h
index 65f9bc056..fb42513d8 100644
--- a/src/lib/msbuild/msbuild/msbuildimport.h
+++ b/src/lib/msbuild/msbuild/msbuildimport.h
@@ -46,13 +46,10 @@ class MSBuildProject;
*
* https://msdn.microsoft.com/en-us/library/92x05xfs.aspx
*/
-class MSBuildImport : public QObject, public IMSBuildNode
+class MSBuildImport : public IMSBuildNode
{
- Q_OBJECT
- Q_DISABLE_COPY(MSBuildImport)
public:
- explicit MSBuildImport(MSBuildProject *parent);
- explicit MSBuildImport(MSBuildImportGroup *parent);
+ MSBuildImport();
~MSBuildImport() override;
QString project() const;
diff --git a/src/lib/msbuild/msbuild/msbuildimportgroup.cpp b/src/lib/msbuild/msbuild/msbuildimportgroup.cpp
index d84d81783..67fb2e3a1 100644
--- a/src/lib/msbuild/msbuild/msbuildimportgroup.cpp
+++ b/src/lib/msbuild/msbuild/msbuildimportgroup.cpp
@@ -38,15 +38,25 @@ namespace qbs {
class MSBuildImportGroupPrivate
{
public:
+ QString condition;
QString label;
};
-MSBuildImportGroup::MSBuildImportGroup(MSBuildProject *parent)
- : IMSBuildGroup(parent)
- , d(new MSBuildImportGroupPrivate)
+MSBuildImportGroup::MSBuildImportGroup()
+ : d(new MSBuildImportGroupPrivate)
{
}
+QString MSBuildImportGroup::condition() const
+{
+ return d->condition;
+}
+
+void MSBuildImportGroup::setCondition(const QString &condition)
+{
+ d->condition = condition;
+}
+
MSBuildImportGroup::~MSBuildImportGroup() = default;
QString MSBuildImportGroup::label() const
@@ -63,10 +73,7 @@ void MSBuildImportGroup::accept(IMSBuildNodeVisitor *visitor) const
{
visitor->visitStart(this);
- for (const auto &child : children()) {
- if (const auto import = qobject_cast<const MSBuildImport *>(child))
- import->accept(visitor);
- }
+ acceptChildren(visitor);
visitor->visitEnd(this);
}
diff --git a/src/lib/msbuild/msbuild/msbuildimportgroup.h b/src/lib/msbuild/msbuild/msbuildimportgroup.h
index a21cb5a54..fb619fc73 100644
--- a/src/lib/msbuild/msbuild/msbuildimportgroup.h
+++ b/src/lib/msbuild/msbuild/msbuildimportgroup.h
@@ -31,11 +31,13 @@
#ifndef MSBUILDIMPORTGROUP_H
#define MSBUILDIMPORTGROUP_H
-#include "imsbuildgroup.h"
#include "imsbuildnode.h"
+#include <QtCore/qstring.h>
+
namespace qbs {
+class MSBuildImport;
class MSBuildProject;
class MSBuildImportGroupPrivate;
@@ -44,14 +46,15 @@ class MSBuildImportGroupPrivate;
*
* https://msdn.microsoft.com/en-us/library/ff606262.aspx
*/
-class MSBuildImportGroup : public IMSBuildGroup, public IMSBuildNode
+class MSBuildImportGroup : public MSBuildNode<MSBuildImport>
{
- Q_OBJECT
- Q_DISABLE_COPY(MSBuildImportGroup)
public:
- explicit MSBuildImportGroup(MSBuildProject *parent = nullptr);
+ MSBuildImportGroup();
~MSBuildImportGroup() override;
+ QString condition() const;
+ void setCondition(const QString &condition);
+
QString label() const;
void setLabel(const QString &label);
diff --git a/src/lib/msbuild/msbuild/msbuilditem.cpp b/src/lib/msbuild/msbuild/msbuilditem.cpp
index ed181a453..c6810204c 100644
--- a/src/lib/msbuild/msbuild/msbuilditem.cpp
+++ b/src/lib/msbuild/msbuild/msbuilditem.cpp
@@ -44,9 +44,8 @@ public:
QString include;
};
-MSBuildItem::MSBuildItem(const QString &name, IMSBuildItemGroup *parent)
- : QObject(parent)
- , d(new MSBuildItemPrivate)
+MSBuildItem::MSBuildItem(const QString &name)
+ : d(new MSBuildItemPrivate)
{
setName(name);
}
@@ -75,17 +74,14 @@ void MSBuildItem::setInclude(const QString &include)
void MSBuildItem::appendProperty(const QString &name, const QVariant &value)
{
- new MSBuildItemMetadata(name, value, this);
+ makeChild<MSBuildItemMetadata>(name, value);
}
void MSBuildItem::accept(IMSBuildNodeVisitor *visitor) const
{
visitor->visitStart(this);
- for (const auto &child : children()) {
- if (const auto itemMetadata = qobject_cast<const MSBuildItemMetadata *>(child))
- itemMetadata->accept(visitor);
- }
+ acceptChildren(visitor);
visitor->visitEnd(this);
}
diff --git a/src/lib/msbuild/msbuild/msbuilditem.h b/src/lib/msbuild/msbuild/msbuilditem.h
index d01a357a2..11dfd3643 100644
--- a/src/lib/msbuild/msbuild/msbuilditem.h
+++ b/src/lib/msbuild/msbuild/msbuilditem.h
@@ -38,7 +38,8 @@
namespace qbs {
-class IMSBuildItemGroup;
+class MSBuildItemMetadata;
+class MSBuildItemGroupBase;
class MSBuildItemDefinitionGroup;
class MSBuildItemGroup;
class MSBuildItemPrivate;
@@ -48,11 +49,10 @@ class MSBuildItemPrivate;
*
* https://msdn.microsoft.com/en-us/library/ms164283.aspx
*/
-class MSBuildItem : public QObject, public IMSBuildNode
+class MSBuildItem : public MSBuildNode<MSBuildItemMetadata>
{
- Q_OBJECT
public:
- explicit MSBuildItem(const QString &name, IMSBuildItemGroup *parent = nullptr);
+ explicit MSBuildItem(const QString &name);
~MSBuildItem() override;
QString name() const;
diff --git a/src/lib/msbuild/msbuild/msbuilditemdefinitiongroup.cpp b/src/lib/msbuild/msbuild/msbuilditemdefinitiongroup.cpp
index 1479577c5..186e04357 100644
--- a/src/lib/msbuild/msbuild/msbuilditemdefinitiongroup.cpp
+++ b/src/lib/msbuild/msbuild/msbuilditemdefinitiongroup.cpp
@@ -35,21 +35,14 @@
namespace qbs {
-MSBuildItemDefinitionGroup::MSBuildItemDefinitionGroup(MSBuildProject *parent)
- : IMSBuildItemGroup(parent)
-{
-}
-
+MSBuildItemDefinitionGroup::MSBuildItemDefinitionGroup() = default;
MSBuildItemDefinitionGroup::~MSBuildItemDefinitionGroup() = default;
void MSBuildItemDefinitionGroup::accept(IMSBuildNodeVisitor *visitor) const
{
visitor->visitStart(this);
- for (const auto &child : children()) {
- if (const auto item = qobject_cast<MSBuildItem *>(child))
- item->accept(visitor);
- }
+ acceptChildren(visitor);
visitor->visitEnd(this);
}
diff --git a/src/lib/msbuild/msbuild/msbuilditemdefinitiongroup.h b/src/lib/msbuild/msbuild/msbuilditemdefinitiongroup.h
index 3c324699d..ae1e0b53f 100644
--- a/src/lib/msbuild/msbuild/msbuilditemdefinitiongroup.h
+++ b/src/lib/msbuild/msbuild/msbuilditemdefinitiongroup.h
@@ -31,8 +31,8 @@
#ifndef MSBUILDITEMDEFINITIONGROUP_H
#define MSBUILDITEMDEFINITIONGROUP_H
-#include "imsbuildgroup.h"
#include "imsbuildnode.h"
+#include "msbuilditemgroupbase.h"
namespace qbs {
@@ -44,11 +44,10 @@ class MSBuildItemDefinitionGroupPrivate;
*
* https://msdn.microsoft.com/en-us/library/bb629392.aspx
*/
-class MSBuildItemDefinitionGroup : public IMSBuildItemGroup, public IMSBuildNode
+class MSBuildItemDefinitionGroup : public MSBuildItemGroupBase
{
- Q_OBJECT
public:
- explicit MSBuildItemDefinitionGroup(MSBuildProject *parent = nullptr);
+ MSBuildItemDefinitionGroup();
~MSBuildItemDefinitionGroup() override;
void accept(IMSBuildNodeVisitor *visitor) const override;
diff --git a/src/lib/msbuild/msbuild/msbuilditemgroup.cpp b/src/lib/msbuild/msbuild/msbuilditemgroup.cpp
index 48f919709..632668ec3 100644
--- a/src/lib/msbuild/msbuild/msbuilditemgroup.cpp
+++ b/src/lib/msbuild/msbuild/msbuilditemgroup.cpp
@@ -43,9 +43,8 @@ public:
QString label;
};
-MSBuildItemGroup::MSBuildItemGroup(MSBuildProject *parent)
- : IMSBuildItemGroup(parent)
- , d(new MSBuildItemGroupPrivate)
+MSBuildItemGroup::MSBuildItemGroup()
+ : d(new MSBuildItemGroupPrivate)
{
}
@@ -65,10 +64,7 @@ void MSBuildItemGroup::accept(IMSBuildNodeVisitor *visitor) const
{
visitor->visitStart(this);
- for (const auto &child : children()) {
- if (const MSBuildItem *item = qobject_cast<MSBuildItem *>(child))
- item->accept(visitor);
- }
+ acceptChildren(visitor);
visitor->visitEnd(this);
}
diff --git a/src/lib/msbuild/msbuild/msbuilditemgroup.h b/src/lib/msbuild/msbuild/msbuilditemgroup.h
index bbbdb0e69..0f3111416 100644
--- a/src/lib/msbuild/msbuild/msbuilditemgroup.h
+++ b/src/lib/msbuild/msbuild/msbuilditemgroup.h
@@ -31,8 +31,8 @@
#ifndef MSBUILDITEMGROUP_H
#define MSBUILDITEMGROUP_H
-#include "imsbuildgroup.h"
#include "imsbuildnode.h"
+#include "msbuilditemgroupbase.h"
#include <memory>
@@ -46,12 +46,10 @@ class MSBuildItemGroupPrivate;
*
* https://msdn.microsoft.com/en-us/library/646dk05y.aspx
*/
-class MSBuildItemGroup : public IMSBuildItemGroup, public IMSBuildNode
+class MSBuildItemGroup : public MSBuildItemGroupBase
{
- Q_OBJECT
- Q_DISABLE_COPY(MSBuildItemGroup)
public:
- explicit MSBuildItemGroup(MSBuildProject *parent = nullptr);
+ MSBuildItemGroup();
~MSBuildItemGroup() override;
QString label() const;
diff --git a/src/lib/msbuild/msbuild/imsbuildgroup.cpp b/src/lib/msbuild/msbuild/msbuilditemgroupbase.cpp
index 81078ecb9..b5a089d57 100644
--- a/src/lib/msbuild/msbuild/imsbuildgroup.cpp
+++ b/src/lib/msbuild/msbuild/msbuilditemgroupbase.cpp
@@ -28,38 +28,32 @@
**
****************************************************************************/
-#include "imsbuildgroup.h"
+#include "msbuilditemgroupbase.h"
#include "msbuildproject.h"
namespace qbs {
-class IMSBuildGroupPrivate
+class IMSBuildItemGroupPrivate
{
public:
QString condition;
};
-IMSBuildGroup::IMSBuildGroup(MSBuildProject *parent)
- : QObject(parent)
- , d(new IMSBuildGroupPrivate)
+MSBuildItemGroupBase::MSBuildItemGroupBase()
+ : d(new IMSBuildItemGroupPrivate)
{
}
-IMSBuildGroup::~IMSBuildGroup() = default;
+MSBuildItemGroupBase::~MSBuildItemGroupBase() = default;
-QString IMSBuildGroup::condition() const
+QString MSBuildItemGroupBase::condition() const
{
return d->condition;
}
-void IMSBuildGroup::setCondition(const QString &condition)
+void MSBuildItemGroupBase::setCondition(const QString &condition)
{
d->condition = condition;
}
-IMSBuildItemGroup::IMSBuildItemGroup(MSBuildProject *parent)
- : IMSBuildGroup(parent)
-{
-}
-
} // namespace qbs
diff --git a/src/lib/msbuild/msbuild/imsbuildgroup.h b/src/lib/msbuild/msbuild/msbuilditemgroupbase.h
index 3d9115643..8aabcce61 100644
--- a/src/lib/msbuild/msbuild/imsbuildgroup.h
+++ b/src/lib/msbuild/msbuild/msbuilditemgroupbase.h
@@ -31,34 +31,43 @@
#ifndef IMSBUILDGROUP_H
#define IMSBUILDGROUP_H
-#include <QtCore/qobject.h>
+#include "imsbuildnode.h"
+
+#include <QtCore/qstring.h>
#include <memory>
namespace qbs {
+class MSBuildClInclude;
+class MSBuildClCompile;
+class MSBuildItem;
+class MSBuildFileItem;
+class MSBuildFilter;
+class MSBuildLink;
+class MSBuildNone;
class MSBuildProject;
-class IMSBuildGroupPrivate;
+class MSBuildProperty;
+class IMSBuildItemGroupPrivate;
-class IMSBuildGroup : public QObject
+class MSBuildItemGroupBase : public MSBuildNode<
+ MSBuildClInclude,
+ MSBuildClCompile,
+ MSBuildItem,
+ MSBuildFileItem,
+ MSBuildFilter,
+ MSBuildLink,
+ MSBuildNone>
{
- Q_OBJECT
public:
- explicit IMSBuildGroup(MSBuildProject *parent = nullptr);
- ~IMSBuildGroup() override;
+ MSBuildItemGroupBase();
+ ~MSBuildItemGroupBase() override;
QString condition() const;
void setCondition(const QString &condition);
private:
- std::unique_ptr<IMSBuildGroupPrivate> d;
-};
-
-class IMSBuildItemGroup : public IMSBuildGroup
-{
- Q_OBJECT
-public:
- explicit IMSBuildItemGroup(MSBuildProject *parent = nullptr);
+ std::unique_ptr<IMSBuildItemGroupPrivate> d;
};
} // namespace qbs
diff --git a/src/lib/msbuild/msbuild/msbuilditemmetadata.cpp b/src/lib/msbuild/msbuild/msbuilditemmetadata.cpp
index 2f315287c..8c6a43759 100644
--- a/src/lib/msbuild/msbuild/msbuilditemmetadata.cpp
+++ b/src/lib/msbuild/msbuild/msbuilditemmetadata.cpp
@@ -35,14 +35,9 @@
namespace qbs {
-MSBuildItemMetadata::MSBuildItemMetadata(MSBuildItem *parent)
- : MSBuildPropertyBase(parent)
-{
-}
+MSBuildItemMetadata::MSBuildItemMetadata() = default;
-MSBuildItemMetadata::MSBuildItemMetadata(const QString &name, const QVariant &value,
- MSBuildItem *parent)
- : MSBuildItemMetadata(parent)
+MSBuildItemMetadata::MSBuildItemMetadata(const QString &name, const QVariant &value)
{
setName(name);
setValue(value);
diff --git a/src/lib/msbuild/msbuild/msbuilditemmetadata.h b/src/lib/msbuild/msbuild/msbuilditemmetadata.h
index cfde125bb..42ac7de7c 100644
--- a/src/lib/msbuild/msbuild/msbuilditemmetadata.h
+++ b/src/lib/msbuild/msbuild/msbuilditemmetadata.h
@@ -31,7 +31,6 @@
#ifndef MSBUILDITEMMETADATA_H
#define MSBUILDITEMMETADATA_H
-#include "imsbuildnode.h"
#include "msbuildpropertybase.h"
namespace qbs {
@@ -43,14 +42,11 @@ class MSBuildItem;
*
* https://msdn.microsoft.com/en-us/library/ms164284.aspx
*/
-class MSBuildItemMetadata : public MSBuildPropertyBase, public IMSBuildNode
+class MSBuildItemMetadata : public MSBuildPropertyBase
{
- Q_OBJECT
- Q_DISABLE_COPY(MSBuildItemMetadata)
public:
- explicit MSBuildItemMetadata(MSBuildItem *parent = nullptr);
- MSBuildItemMetadata(const QString &name, const QVariant &value = QVariant(),
- MSBuildItem *parent = nullptr);
+ MSBuildItemMetadata();
+ MSBuildItemMetadata(const QString &name, const QVariant &value = QVariant());
void accept(IMSBuildNodeVisitor *visitor) const override;
};
diff --git a/src/lib/msbuild/msbuild/msbuildproject.cpp b/src/lib/msbuild/msbuild/msbuildproject.cpp
index 11b5b81ea..ad06bffbc 100644
--- a/src/lib/msbuild/msbuild/msbuildproject.cpp
+++ b/src/lib/msbuild/msbuild/msbuildproject.cpp
@@ -46,9 +46,8 @@ public:
QString toolsVersion;
};
-MSBuildProject::MSBuildProject(QObject *parent)
- : QObject(parent)
- , d(new MSBuildProjectPrivate)
+MSBuildProject::MSBuildProject()
+ : d(new MSBuildProjectPrivate)
{
}
@@ -78,18 +77,7 @@ void MSBuildProject::accept(IMSBuildNodeVisitor *visitor) const
{
visitor->visitStart(this);
- for (const auto &child : children()) {
- if (const auto node = qobject_cast<MSBuildImport *>(child))
- node->accept(visitor);
- else if (const auto node = qobject_cast<MSBuildImportGroup *>(child))
- node->accept(visitor);
- else if (const auto node = qobject_cast<MSBuildItemDefinitionGroup *>(child))
- node->accept(visitor);
- else if (const auto node = qobject_cast<MSBuildItemGroup *>(child))
- node->accept(visitor);
- else if (const auto node = qobject_cast<MSBuildPropertyGroup *>(child))
- node->accept(visitor);
- }
+ acceptChildren(visitor);
visitor->visitEnd(this);
}
diff --git a/src/lib/msbuild/msbuild/msbuildproject.h b/src/lib/msbuild/msbuild/msbuildproject.h
index 5281f615d..b74d34cdb 100644
--- a/src/lib/msbuild/msbuild/msbuildproject.h
+++ b/src/lib/msbuild/msbuild/msbuildproject.h
@@ -38,6 +38,11 @@
namespace qbs {
+class MSBuildImport;
+class MSBuildImportGroup;
+class MSBuildItemGroup;
+class MSBuildItemDefinitionGroup;
+class MSBuildPropertyGroup;
class MSBuildProjectPrivate;
/*!
@@ -45,12 +50,15 @@ class MSBuildProjectPrivate;
*
* https://msdn.microsoft.com/en-us/library/bcxfsh87.aspx
*/
-class MSBuildProject : public QObject, public IMSBuildNode
+class MSBuildProject : public MSBuildNode<
+ MSBuildImport,
+ MSBuildImportGroup,
+ MSBuildItemGroup,
+ MSBuildItemDefinitionGroup,
+ MSBuildPropertyGroup>
{
- Q_OBJECT
- Q_DISABLE_COPY(MSBuildProject)
public:
- explicit MSBuildProject(QObject *parent = nullptr);
+ MSBuildProject();
~MSBuildProject() override;
QString defaultTargets() const;
diff --git a/src/lib/msbuild/msbuild/msbuildproperty.cpp b/src/lib/msbuild/msbuild/msbuildproperty.cpp
index fd6942d0c..66517d541 100644
--- a/src/lib/msbuild/msbuild/msbuildproperty.cpp
+++ b/src/lib/msbuild/msbuild/msbuildproperty.cpp
@@ -35,14 +35,9 @@
namespace qbs {
-MSBuildProperty::MSBuildProperty(MSBuildPropertyGroup *parent)
- : MSBuildPropertyBase(parent)
-{
-}
+MSBuildProperty::MSBuildProperty() = default;
-MSBuildProperty::MSBuildProperty(const QString &name, const QVariant &value,
- MSBuildPropertyGroup *parent)
- : MSBuildProperty(parent)
+MSBuildProperty::MSBuildProperty(const QString &name, const QVariant &value)
{
setName(name);
setValue(value);
diff --git a/src/lib/msbuild/msbuild/msbuildproperty.h b/src/lib/msbuild/msbuild/msbuildproperty.h
index 4fd36b275..7282e6407 100644
--- a/src/lib/msbuild/msbuild/msbuildproperty.h
+++ b/src/lib/msbuild/msbuild/msbuildproperty.h
@@ -31,7 +31,6 @@
#ifndef MSBUILDPROPERTY_H
#define MSBUILDPROPERTY_H
-#include "imsbuildnode.h"
#include "msbuildpropertybase.h"
namespace qbs {
@@ -43,13 +42,11 @@ class MSBuildPropertyGroup;
*
* https://msdn.microsoft.com/en-us/library/ms164288.aspx
*/
-class MSBuildProperty : public MSBuildPropertyBase, public IMSBuildNode
+class MSBuildProperty : public MSBuildPropertyBase
{
- Q_OBJECT
public:
- explicit MSBuildProperty(MSBuildPropertyGroup *parent = nullptr);
- MSBuildProperty(const QString &name, const QVariant &value = QVariant(),
- MSBuildPropertyGroup *parent = nullptr);
+ MSBuildProperty();
+ MSBuildProperty(const QString &name, const QVariant &value = QVariant());
void accept(IMSBuildNodeVisitor *visitor) const override;
};
diff --git a/src/lib/msbuild/msbuild/msbuildpropertybase.cpp b/src/lib/msbuild/msbuild/msbuildpropertybase.cpp
index 3a8affd3f..eaf064bd2 100644
--- a/src/lib/msbuild/msbuild/msbuildpropertybase.cpp
+++ b/src/lib/msbuild/msbuild/msbuildpropertybase.cpp
@@ -40,9 +40,8 @@ public:
QVariant value;
};
-MSBuildPropertyBase::MSBuildPropertyBase(QObject *parent)
- : QObject(parent)
- , d(new MSBuildPropertyBasePrivate)
+MSBuildPropertyBase::MSBuildPropertyBase()
+ : d(new MSBuildPropertyBasePrivate)
{
}
diff --git a/src/lib/msbuild/msbuild/msbuildpropertybase.h b/src/lib/msbuild/msbuild/msbuildpropertybase.h
index b4d25f827..4aac29092 100644
--- a/src/lib/msbuild/msbuild/msbuildpropertybase.h
+++ b/src/lib/msbuild/msbuild/msbuildpropertybase.h
@@ -31,6 +31,8 @@
#ifndef MSBUILDPROPERTYBASE_H
#define MSBUILDPROPERTYBASE_H
+#include "imsbuildnode.h"
+
#include <QtCore/qobject.h>
#include <QtCore/qvariant.h>
@@ -40,11 +42,10 @@ namespace qbs {
class MSBuildPropertyBasePrivate;
-class MSBuildPropertyBase : public QObject
+class MSBuildPropertyBase : public IMSBuildNode
{
- Q_OBJECT
protected:
- explicit MSBuildPropertyBase(QObject *parent = nullptr);
+ MSBuildPropertyBase();
public:
~MSBuildPropertyBase() override;
diff --git a/src/lib/msbuild/msbuild/msbuildpropertygroup.cpp b/src/lib/msbuild/msbuild/msbuildpropertygroup.cpp
index 5acb73dad..53af98d90 100644
--- a/src/lib/msbuild/msbuild/msbuildpropertygroup.cpp
+++ b/src/lib/msbuild/msbuild/msbuildpropertygroup.cpp
@@ -42,12 +42,21 @@ public:
QString label;
};
-MSBuildPropertyGroup::MSBuildPropertyGroup(MSBuildProject *parent)
- : IMSBuildGroup(parent)
- , d(new MSBuildPropertyGroupPrivate)
+MSBuildPropertyGroup::MSBuildPropertyGroup()
+ : d(new MSBuildPropertyGroupPrivate)
{
}
+QString MSBuildPropertyGroup::condition() const
+{
+ return d->condition;
+}
+
+void MSBuildPropertyGroup::setCondition(const QString &condition)
+{
+ d->condition = condition;
+}
+
MSBuildPropertyGroup::~MSBuildPropertyGroup() = default;
QString MSBuildPropertyGroup::label() const
@@ -62,17 +71,14 @@ void MSBuildPropertyGroup::setLabel(const QString &label)
void MSBuildPropertyGroup::appendProperty(const QString &name, const QVariant &value)
{
- new MSBuildProperty(name, value, this);
+ makeChild<MSBuildProperty>(name, value);
}
void MSBuildPropertyGroup::accept(IMSBuildNodeVisitor *visitor) const
{
visitor->visitStart(this);
- for (const auto &child : children()) {
- if (const MSBuildProperty *property = qobject_cast<MSBuildProperty *>(child))
- property->accept(visitor);
- }
+ acceptChildren(visitor);
visitor->visitEnd(this);
}
diff --git a/src/lib/msbuild/msbuild/msbuildpropertygroup.h b/src/lib/msbuild/msbuild/msbuildpropertygroup.h
index 60bdb008e..ac9b2d9e0 100644
--- a/src/lib/msbuild/msbuild/msbuildpropertygroup.h
+++ b/src/lib/msbuild/msbuild/msbuildpropertygroup.h
@@ -31,11 +31,13 @@
#ifndef MSBUILDPROPERTYGROUP_H
#define MSBUILDPROPERTYGROUP_H
-#include "imsbuildgroup.h"
#include "imsbuildnode.h"
+#include <QtCore/qvariant.h>
+
namespace qbs {
+class MSBuildProperty;
class MSBuildProject;
class MSBuildPropertyGroupPrivate;
@@ -44,14 +46,15 @@ class MSBuildPropertyGroupPrivate;
*
* https://msdn.microsoft.com/en-us/library/t4w159bs.aspx
*/
-class MSBuildPropertyGroup : public IMSBuildGroup, public IMSBuildNode
+class MSBuildPropertyGroup : public MSBuildNode<MSBuildProperty>
{
- Q_OBJECT
- Q_DISABLE_COPY(MSBuildPropertyGroup)
public:
- explicit MSBuildPropertyGroup(MSBuildProject *parent = nullptr);
+ MSBuildPropertyGroup();
~MSBuildPropertyGroup() override;
+ QString condition() const;
+ void setCondition(const QString &condition);
+
QString label() const;
void setLabel(const QString &label);
diff --git a/src/plugins/generator/visualstudio/msbuildfiltersproject.cpp b/src/plugins/generator/visualstudio/msbuildfiltersproject.cpp
index 127d6a438..b324c91d8 100644
--- a/src/plugins/generator/visualstudio/msbuildfiltersproject.cpp
+++ b/src/plugins/generator/visualstudio/msbuildfiltersproject.cpp
@@ -102,7 +102,8 @@ const std::vector<FilterInfo> & getDefaultFilterInfo()
MSBuildFilter * makeBuildFilter(const FilterInfo &filterInfo,
MSBuildItemGroup *itemFiltersGroup)
{
- const auto filter = new MSBuildFilter(filterInfo.name, filterInfo.extensions, itemFiltersGroup);
+ const auto filter = itemFiltersGroup->makeChild<MSBuildFilter>(
+ filterInfo.name, filterInfo.extensions);
filter->appendProperty(QStringLiteral("ParseFiles"), filterInfo.parseFiles);
filter->appendProperty(QStringLiteral("SourceControlFiles"), filterInfo.sourceControlFiles);
return filter;
@@ -128,12 +129,12 @@ MSBuildFileItem * makeFileItem(const QString& filePath,
MSBuildItemGroup *itemGroup)
{
if (isHeaderFile(filePath))
- return new MSBuildClInclude(itemGroup);
+ return itemGroup->makeChild<MSBuildClInclude>();
if (isSourceFile(filePath))
- return new MSBuildClCompile(itemGroup);
+ return itemGroup->makeChild<MSBuildClCompile>();
- return new MSBuildNone(itemGroup);
+ return itemGroup->makeChild<MSBuildNone>();
}
@@ -144,7 +145,7 @@ public:
ProductProcessor(MSBuildProject *parent)
: m_parent(parent)
- , m_itemFiltersGroup(new MSBuildItemGroup(m_parent))
+ , m_itemFiltersGroup(m_parent->makeChild<MSBuildItemGroup>())
{
}
@@ -174,12 +175,12 @@ public:
if (filterInfo.name == QStringLiteral("Header Files")) {
if (!m_headerFilesGroup)
- m_headerFilesGroup = new MSBuildItemGroup(m_parent);
- fileItem = new MSBuildClInclude(m_headerFilesGroup);
+ m_headerFilesGroup = m_parent->makeChild<MSBuildItemGroup>();
+ fileItem = m_headerFilesGroup->makeChild<MSBuildClInclude>();
} else if (filterInfo.name == QStringLiteral("Source Files")) {
if (!m_sourceFilesGroup)
- m_sourceFilesGroup = new MSBuildItemGroup(m_parent);
- fileItem = new MSBuildClCompile(m_sourceFilesGroup);
+ m_sourceFilesGroup = m_parent->makeChild<MSBuildItemGroup>();
+ fileItem = m_sourceFilesGroup->makeChild<MSBuildClCompile>();
}
if (fileItem) {
@@ -191,10 +192,10 @@ public:
if (!fileItem) {
if (!m_filesGroup) {
- m_filesGroup = new MSBuildItemGroup(m_parent);
+ m_filesGroup = m_parent->makeChild<MSBuildItemGroup>();
}
- fileItem = new MSBuildNone(m_filesGroup);
+ fileItem = m_filesGroup->makeChild<MSBuildNone>();
}
fileItem->setFilePath(filePath);
@@ -205,7 +206,7 @@ public:
{
makeFilter({groupData.name(), QStringList() << QStringLiteral("*")});
- auto *itemGroup = new MSBuildItemGroup(m_parent);
+ auto *itemGroup = m_parent->makeChild<MSBuildItemGroup>();
const auto &files = groupData.allFilePaths();
for (const auto &filePath : files) {
auto *fileItem = makeFileItem(filePath, itemGroup);
@@ -233,9 +234,7 @@ private:
} // namespace
-MSBuildFiltersProject::MSBuildFiltersProject(const GeneratableProductData &product,
- QObject *parent)
- : MSBuildProject(parent)
+MSBuildFiltersProject::MSBuildFiltersProject(const GeneratableProductData &product)
{
// Normally this would be versionInfo.toolsVersion() but for some reason it seems
// filters projects are always v4.0
diff --git a/src/plugins/generator/visualstudio/msbuildfiltersproject.h b/src/plugins/generator/visualstudio/msbuildfiltersproject.h
index 5d67bfaa8..834360f78 100644
--- a/src/plugins/generator/visualstudio/msbuildfiltersproject.h
+++ b/src/plugins/generator/visualstudio/msbuildfiltersproject.h
@@ -42,11 +42,8 @@ class MSBuildFilter;
class MSBuildFiltersProject : public MSBuildProject
{
- Q_OBJECT
- Q_DISABLE_COPY(MSBuildFiltersProject)
public:
- explicit MSBuildFiltersProject(const GeneratableProductData &product,
- QObject *parent = nullptr);
+ explicit MSBuildFiltersProject(const GeneratableProductData &product);
};
} // namespace qbs
diff --git a/src/plugins/generator/visualstudio/msbuildqbsgenerateproject.cpp b/src/plugins/generator/visualstudio/msbuildqbsgenerateproject.cpp
index 3a92e168f..32a7e8460 100644
--- a/src/plugins/generator/visualstudio/msbuildqbsgenerateproject.cpp
+++ b/src/plugins/generator/visualstudio/msbuildqbsgenerateproject.cpp
@@ -41,15 +41,13 @@
namespace qbs {
MSBuildQbsGenerateProject::MSBuildQbsGenerateProject(
- const GeneratableProject &project,
- const Internal::VisualStudioVersionInfo &versionInfo,
- VisualStudioGenerator *parent)
- : MSBuildTargetProject(project, versionInfo, parent)
+ const GeneratableProject &project, const Internal::VisualStudioVersionInfo &versionInfo)
+ : MSBuildTargetProject(project, versionInfo)
{
- const auto cppDefaultProps = new MSBuildImport(this);
+ const auto cppDefaultProps = makeChild<MSBuildImport>();
cppDefaultProps->setProject(QStringLiteral("$(VCTargetsPath)\\Microsoft.Cpp.Default.props"));
- const auto group = new MSBuildPropertyGroup(this);
+ const auto group = makeChild<MSBuildPropertyGroup>();
group->setLabel(QStringLiteral("Configuration"));
group->appendProperty(QStringLiteral("PlatformToolset"),
versionInfo.platformToolsetVersion());
@@ -61,10 +59,10 @@ MSBuildQbsGenerateProject::MSBuildQbsGenerateProject(
QStringLiteral("NMakeBuildCommandLine"),
QString(QStringLiteral("$(QbsGenerateCommandLine) ") + params));
- const auto cppProps = new MSBuildImport(this);
+ const auto cppProps = makeChild<MSBuildImport>();
cppProps->setProject(QStringLiteral("$(VCTargetsPath)\\Microsoft.Cpp.props"));
- const auto import = new MSBuildImport(this);
+ const auto import = makeChild<MSBuildImport>();
import->setProject(QStringLiteral("$(VCTargetsPath)\\Microsoft.Cpp.targets"));
}
diff --git a/src/plugins/generator/visualstudio/msbuildqbsgenerateproject.h b/src/plugins/generator/visualstudio/msbuildqbsgenerateproject.h
index 8c5ef80c4..d47ad16c2 100644
--- a/src/plugins/generator/visualstudio/msbuildqbsgenerateproject.h
+++ b/src/plugins/generator/visualstudio/msbuildqbsgenerateproject.h
@@ -40,12 +40,9 @@ namespace qbs {
class MSBuildQbsGenerateProject : public MSBuildTargetProject
{
- Q_OBJECT
- Q_DISABLE_COPY(MSBuildQbsGenerateProject)
public:
- MSBuildQbsGenerateProject(const GeneratableProject &project,
- const Internal::VisualStudioVersionInfo &versionInfo,
- VisualStudioGenerator *parent = nullptr);
+ MSBuildQbsGenerateProject(
+ const GeneratableProject &project, const Internal::VisualStudioVersionInfo &versionInfo);
};
} // namespace qbs
diff --git a/src/plugins/generator/visualstudio/msbuildqbsproductproject.cpp b/src/plugins/generator/visualstudio/msbuildqbsproductproject.cpp
index b089bf049..637579597 100644
--- a/src/plugins/generator/visualstudio/msbuildqbsproductproject.cpp
+++ b/src/plugins/generator/visualstudio/msbuildqbsproductproject.cpp
@@ -59,11 +59,10 @@ namespace qbs {
using namespace Internal;
MSBuildQbsProductProject::MSBuildQbsProductProject(
- const GeneratableProject &project,
- const GeneratableProductData &product,
- const Internal::VisualStudioVersionInfo &versionInfo,
- VisualStudioGenerator *parent)
- : MSBuildTargetProject(project, versionInfo, parent)
+ const GeneratableProject &project,
+ const GeneratableProductData &product,
+ const Internal::VisualStudioVersionInfo &versionInfo)
+ : MSBuildTargetProject(project, versionInfo)
{
Q_ASSERT(project.projects.size() == project.commandLines.size());
Q_ASSERT(project.projects.size() == product.data.size());
@@ -72,7 +71,7 @@ MSBuildQbsProductProject::MSBuildQbsProductProject(
globalsPropertyGroup()->appendProperty(QStringLiteral("QbsProductName"), product.name());
- const auto cppDefaultProps = new MSBuildImport(this);
+ const auto cppDefaultProps = makeChild<MSBuildImport>();
cppDefaultProps->setProject(QStringLiteral("$(VCTargetsPath)\\Microsoft.Cpp.Default.props"));
for (int i = 0; i < count; ++i) {
@@ -83,7 +82,7 @@ MSBuildQbsProductProject::MSBuildQbsProductProject(
project.commandLines.values().at(i));
}
- const auto cppProps = new MSBuildImport(this);
+ const auto cppProps = makeChild<MSBuildImport>();
cppProps->setProject(QStringLiteral("$(VCTargetsPath)\\Microsoft.Cpp.props"));
for (int i = 0; i < count; ++i)
@@ -142,7 +141,7 @@ void MSBuildQbsProductProject::addConfiguration(const GeneratableProject &projec
const auto sep = Internal::HostOsInfo::pathListSeparator(Internal::HostOsInfo::HostOsWindows);
- const auto propertyGroup1 = new MSBuildPropertyGroup(this);
+ const auto propertyGroup1 = makeChild<MSBuildPropertyGroup>();
propertyGroup1->setCondition(MSBuildUtils::buildTaskCondition(buildTask));
propertyGroup1->setLabel(QStringLiteral("Configuration"));
propertyGroup1->appendProperty(QStringLiteral("UseDebugLibraries"),
@@ -276,10 +275,10 @@ void MSBuildQbsProductProject::addItemDefGroup(const Project &project,
const auto sep = Internal::HostOsInfo::pathListSeparator(Internal::HostOsInfo::HostOsWindows);
- const auto itemDefGroup = new MSBuildItemDefinitionGroup(this);
+ const auto itemDefGroup = makeChild<MSBuildItemDefinitionGroup>();
itemDefGroup->setCondition(MSBuildUtils::buildTaskCondition(project));
- const auto compile = new MSBuildClCompile(itemDefGroup);
+ const auto compile = itemDefGroup->makeChild<MSBuildClCompile>();
// C++ - General
compile->appendProperty(
@@ -311,7 +310,7 @@ void MSBuildQbsProductProject::addItemDefGroup(const Project &project,
? QStringLiteral("MultiThreadedDebugDLL")
: QStringLiteral("MultiThreadedDLL"));
- const auto link = new MSBuildLink(itemDefGroup);
+ const auto link = itemDefGroup->makeChild<MSBuildLink>();
// Linker - General
link->appendProperty(QStringLiteral("AdditionalLibraryDirectories"),
@@ -346,20 +345,20 @@ void MSBuildQbsProductProject::addItemDefGroup(const Project &project,
debugBuild ? QStringLiteral("false") : QStringLiteral("true"));
}
-static MSBuildFileItem *fileItemForFileTags(const QList<QString> &fileTags,
- IMSBuildItemGroup *parent = nullptr)
+static MSBuildFileItem *fileItemForFileTags(
+ const QList<QString> &fileTags, MSBuildItemGroup *parent)
{
if (fileTags.contains(QStringLiteral("hpp")))
- return new MSBuildClInclude(parent);
+ return parent->makeChild<MSBuildClInclude>();
if (fileTags.contains(QStringLiteral("c")) || fileTags.contains(QStringLiteral("cpp")))
- return new MSBuildClCompile(parent);
- return new MSBuildNone(parent);
+ return parent->makeChild<MSBuildClCompile>();
+ return parent->makeChild<MSBuildNone>();
}
void MSBuildQbsProductProject::addFiles(const GeneratableProject &project,
const GeneratableProductData &product)
{
- const auto itemGroup = new MSBuildItemGroup(this);
+ const auto itemGroup = makeChild<MSBuildItemGroup>();
addQbsFile(project, product, itemGroup);
@@ -400,10 +399,8 @@ void MSBuildQbsProductProject::addFiles(const GeneratableProject &project,
for (const auto &sourceFileNode : sourceFileNodes) {
for (auto it = project.projects.cbegin(), end = project.projects.cend(); it != end; ++it) {
if (!sourceFileEnabledConfigurations[sourceFileNode.first].contains(it.key())) {
- const auto metadata = new MSBuildItemMetadata(
- QStringLiteral("ExcludedFromBuild"),
- QStringLiteral("true"),
- sourceFileNode.second);
+ const auto metadata = sourceFileNode.second->makeChild<MSBuildItemMetadata>(
+ QStringLiteral("ExcludedFromBuild"), QStringLiteral("true"));
metadata->setCondition(
QStringLiteral("'$(Configuration)|$(Platform)'=='")
+ MSBuildUtils::fullName(it.value()) + QStringLiteral("'"));
@@ -411,7 +408,7 @@ void MSBuildQbsProductProject::addFiles(const GeneratableProject &project,
}
}
- const auto import = new MSBuildImport(this);
+ const auto import = makeChild<MSBuildImport>();
import->setProject(QStringLiteral("$(VCTargetsPath)\\Microsoft.Cpp.targets"));
}
@@ -419,7 +416,7 @@ void MSBuildQbsProductProject::addQbsFile(const GeneratableProject &project,
const GeneratableProductData &product,
MSBuildItemGroup *itemGroup)
{
- const auto fileItem = new MSBuildNone(itemGroup);
+ const auto fileItem = itemGroup->makeChild<MSBuildNone>();
QString path = project.baseBuildDirectory().relativeFilePath(product.location().filePath());
// The path still might not be relative (for example if the file item is
// located on a different drive)
diff --git a/src/plugins/generator/visualstudio/msbuildqbsproductproject.h b/src/plugins/generator/visualstudio/msbuildqbsproductproject.h
index f1a815f36..9e6582197 100644
--- a/src/plugins/generator/visualstudio/msbuildqbsproductproject.h
+++ b/src/plugins/generator/visualstudio/msbuildqbsproductproject.h
@@ -48,13 +48,11 @@ class VisualStudioGenerator;
class MSBuildQbsProductProject : public MSBuildTargetProject
{
- Q_OBJECT
- Q_DISABLE_COPY(MSBuildQbsProductProject)
public:
- MSBuildQbsProductProject(const GeneratableProject &project,
- const GeneratableProductData &product,
- const Internal::VisualStudioVersionInfo &versionInfo,
- VisualStudioGenerator *parent = nullptr);
+ MSBuildQbsProductProject(
+ const GeneratableProject &project,
+ const GeneratableProductData &product,
+ const Internal::VisualStudioVersionInfo &versionInfo);
private:
using ProjectConfigurations = QHash<QString, std::set<Project>>;
diff --git a/src/plugins/generator/visualstudio/msbuildsharedsolutionpropertiesproject.cpp b/src/plugins/generator/visualstudio/msbuildsharedsolutionpropertiesproject.cpp
index 228ba1983..8d0f7f5e0 100644
--- a/src/plugins/generator/visualstudio/msbuildsharedsolutionpropertiesproject.cpp
+++ b/src/plugins/generator/visualstudio/msbuildsharedsolutionpropertiesproject.cpp
@@ -108,7 +108,7 @@ MSBuildSharedSolutionPropertiesProject::MSBuildSharedSolutionPropertiesProject(
setDefaultTargets(QStringLiteral("Build"));
setToolsVersion(versionInfo.toolsVersion());
- const auto group = new MSBuildPropertyGroup(this);
+ const auto group = makeChild<MSBuildPropertyGroup>();
group->setLabel(QStringLiteral("UserMacros"));
// Order's important here... a variable must be listed before one that uses it
diff --git a/src/plugins/generator/visualstudio/msbuildsharedsolutionpropertiesproject.h b/src/plugins/generator/visualstudio/msbuildsharedsolutionpropertiesproject.h
index f3848ce24..dd10ef79b 100644
--- a/src/plugins/generator/visualstudio/msbuildsharedsolutionpropertiesproject.h
+++ b/src/plugins/generator/visualstudio/msbuildsharedsolutionpropertiesproject.h
@@ -40,8 +40,6 @@ namespace qbs {
class MSBuildSharedSolutionPropertiesProject : public MSBuildProject
{
- Q_OBJECT
- Q_DISABLE_COPY(MSBuildSharedSolutionPropertiesProject)
public:
MSBuildSharedSolutionPropertiesProject(const Internal::VisualStudioVersionInfo &versionInfo,
const GeneratableProject &project,
diff --git a/src/plugins/generator/visualstudio/msbuildsolutionpropertiesproject.cpp b/src/plugins/generator/visualstudio/msbuildsolutionpropertiesproject.cpp
index dd63571a9..fa60876a0 100644
--- a/src/plugins/generator/visualstudio/msbuildsolutionpropertiesproject.cpp
+++ b/src/plugins/generator/visualstudio/msbuildsolutionpropertiesproject.cpp
@@ -47,7 +47,7 @@ MSBuildSolutionPropertiesProject::MSBuildSolutionPropertiesProject(
setDefaultTargets(QStringLiteral("Build"));
setToolsVersion(versionInfo.toolsVersion());
- const auto group = new MSBuildPropertyGroup(this);
+ const auto group = makeChild<MSBuildPropertyGroup>();
group->setLabel(QStringLiteral("UserMacros"));
static const auto win = Internal::HostOsInfo::HostOsWindows;
diff --git a/src/plugins/generator/visualstudio/msbuildsolutionpropertiesproject.h b/src/plugins/generator/visualstudio/msbuildsolutionpropertiesproject.h
index 1c49f7901..959aa2e11 100644
--- a/src/plugins/generator/visualstudio/msbuildsolutionpropertiesproject.h
+++ b/src/plugins/generator/visualstudio/msbuildsolutionpropertiesproject.h
@@ -42,8 +42,6 @@ namespace qbs {
class MSBuildSolutionPropertiesProject : public MSBuildProject
{
- Q_OBJECT
- Q_DISABLE_COPY(MSBuildSolutionPropertiesProject)
public:
MSBuildSolutionPropertiesProject(const Internal::VisualStudioVersionInfo &versionInfo,
const GeneratableProject &project,
diff --git a/src/plugins/generator/visualstudio/msbuildtargetproject.cpp b/src/plugins/generator/visualstudio/msbuildtargetproject.cpp
index 27b0f21eb..e60c04248 100644
--- a/src/plugins/generator/visualstudio/msbuildtargetproject.cpp
+++ b/src/plugins/generator/visualstudio/msbuildtargetproject.cpp
@@ -51,31 +51,28 @@ public:
const Internal::VisualStudioVersionInfo &versionInfo;
};
-MSBuildTargetProject::MSBuildTargetProject(const GeneratableProject &project,
- const Internal::VisualStudioVersionInfo &versionInfo,
- VisualStudioGenerator *parent)
- : MSBuildProject(parent)
- , d(new MSBuildTargetProjectPrivate(versionInfo))
+MSBuildTargetProject::MSBuildTargetProject(
+ const GeneratableProject &project, const Internal::VisualStudioVersionInfo &versionInfo)
+ : d(new MSBuildTargetProjectPrivate(versionInfo))
{
setDefaultTargets(QStringLiteral("Build"));
setToolsVersion(versionInfo.toolsVersion());
- const auto projectConfigurationsGroup = new MSBuildItemGroup(this);
+ const auto projectConfigurationsGroup = makeChild<MSBuildItemGroup>();
projectConfigurationsGroup->setLabel(QStringLiteral("ProjectConfigurations"));
for (auto it = project.projects.cbegin(), end = project.projects.cend(); it != end; ++it) {
- const auto item = new MSBuildItem(QStringLiteral("ProjectConfiguration"),
- projectConfigurationsGroup);
+ const auto item = projectConfigurationsGroup->makeChild<MSBuildItem>(
+ QStringLiteral("ProjectConfiguration"));
item->setInclude(MSBuildUtils::fullName(it.value()));
item->appendProperty(QStringLiteral("Configuration"), it.key());
item->appendProperty(QStringLiteral("Platform"), MSBuildUtils::platform(it.value()));
}
- d->globalsPropertyGroup = new MSBuildPropertyGroup(this);
+ d->globalsPropertyGroup = makeChild<MSBuildPropertyGroup>();
d->globalsPropertyGroup->setLabel(QStringLiteral("Globals"));
- d->projectGuidProperty = new MSBuildProperty(QStringLiteral("ProjectGuid"),
- QUuid::createUuid().toString(),
- d->globalsPropertyGroup);
+ d->projectGuidProperty = d->globalsPropertyGroup->makeChild<MSBuildProperty>(
+ QStringLiteral("ProjectGuid"), QUuid::createUuid().toString());
// Trigger creation of the property sheets ImportGroup
propertySheetsImportGroup();
@@ -107,7 +104,7 @@ MSBuildImportGroup *MSBuildTargetProject::propertySheetsImportGroup()
{
MSBuildImportGroup *importGroup = nullptr;
for (const auto &child : children()) {
- if (auto group = qobject_cast<MSBuildImportGroup *>(child)) {
+ if (auto group = dynamic_cast<MSBuildImportGroup *>(child.get())) {
if (group->label() == QStringLiteral("PropertySheets")) {
importGroup = group;
break;
@@ -116,7 +113,7 @@ MSBuildImportGroup *MSBuildTargetProject::propertySheetsImportGroup()
}
if (!importGroup) {
- importGroup = new MSBuildImportGroup(this);
+ importGroup = makeChild<MSBuildImportGroup>();
importGroup->setLabel(QStringLiteral("PropertySheets"));
}
@@ -125,7 +122,7 @@ MSBuildImportGroup *MSBuildTargetProject::propertySheetsImportGroup()
void MSBuildTargetProject::appendPropertySheet(const QString &path, bool optional)
{
- const auto import = new MSBuildImport(propertySheetsImportGroup());
+ const auto import = propertySheetsImportGroup()->makeChild<MSBuildImport>();
import->setProject(path);
if (optional)
import->setCondition(QStringLiteral("Exists('%1')").arg(path));
diff --git a/src/plugins/generator/visualstudio/msbuildtargetproject.h b/src/plugins/generator/visualstudio/msbuildtargetproject.h
index 496441a88..e725bddc3 100644
--- a/src/plugins/generator/visualstudio/msbuildtargetproject.h
+++ b/src/plugins/generator/visualstudio/msbuildtargetproject.h
@@ -45,12 +45,9 @@ class VisualStudioGenerator;
class MSBuildTargetProject : public MSBuildProject
{
- Q_OBJECT
- Q_DISABLE_COPY(MSBuildTargetProject)
protected:
- MSBuildTargetProject(const GeneratableProject &project,
- const Internal::VisualStudioVersionInfo &versionInfo,
- VisualStudioGenerator *parent = nullptr);
+ MSBuildTargetProject(
+ const GeneratableProject &project, const Internal::VisualStudioVersionInfo &versionInfo);
public:
~MSBuildTargetProject() override;