diff options
51 files changed, 283 insertions, 295 deletions
@@ -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; |