summaryrefslogtreecommitdiff
path: root/src/lib/corelib/language/projecttreebuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/corelib/language/projecttreebuilder.cpp')
-rw-r--r--src/lib/corelib/language/projecttreebuilder.cpp122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/lib/corelib/language/projecttreebuilder.cpp b/src/lib/corelib/language/projecttreebuilder.cpp
index 66cf34e81..42fc59717 100644
--- a/src/lib/corelib/language/projecttreebuilder.cpp
+++ b/src/lib/corelib/language/projecttreebuilder.cpp
@@ -42,6 +42,7 @@
#include "builtindeclarations.h"
#include "evaluator.h"
#include "filecontext.h"
+#include "filetags.h"
#include "groupshandler.h"
#include "itemreader.h"
#include "language.h"
@@ -66,6 +67,7 @@
#include <tools/settings.h>
#include <tools/setupprojectparameters.h>
#include <tools/stringconstants.h>
+#include <tools/version.h>
#include <QDir>
#include <QDirIterator>
@@ -75,11 +77,129 @@
#include <memory>
#include <optional>
#include <queue>
+#include <stack>
#include <utility>
#include <vector>
namespace qbs::Internal {
+namespace {
+
+class ContextBase
+{
+public:
+ Item *item = nullptr;
+ Item *scope = nullptr;
+ QString name;
+};
+
+class ProjectContext;
+
+class ProductContext : public ContextBase
+{
+public:
+ ProjectContext *project = nullptr;
+ Item *mergedExportItem = nullptr;
+ ProjectTreeBuilder::Result::ProductInfo info;
+ QString profileName;
+ QString multiplexConfigurationId;
+ QVariantMap profileModuleProperties; // Tree-ified module properties from profile.
+ QVariantMap moduleProperties; // Tree-ified module properties from profile + overridden values.
+ QVariantMap defaultParameters; // In Export item.
+ QStringList searchPaths;
+
+ std::optional<QVariantMap> theModuleProviderConfig;
+
+ struct ResolvedDependsItem {
+ Item *item = nullptr;
+ QualifiedId name;
+ QStringList subModules;
+ FileTags productTypes;
+ QStringList multiplexIds;
+ std::optional<QStringList> profiles;
+ VersionRange versionRange;
+ QVariantMap parameters;
+ bool limitToSubProject = false;
+ FallbackMode fallbackMode = FallbackMode::Enabled;
+ bool requiredLocally = true;
+ bool requiredGlobally = true;
+ };
+ struct ResolvedAndMultiplexedDependsItem {
+ ResolvedAndMultiplexedDependsItem(ProductContext *product,
+ const ResolvedDependsItem &dependency)
+ : product(product), item(dependency.item), name(product->name),
+ versionRange(dependency.versionRange), parameters(dependency.parameters),
+ fallbackMode(FallbackMode::Disabled), checkProduct(false) {}
+ ResolvedAndMultiplexedDependsItem(const ResolvedDependsItem &dependency,
+ const QualifiedId &name,
+ const QString &profile, const QString &multiplexId)
+ : item(dependency.item), name(name), profile(profile), multiplexId(multiplexId),
+ versionRange(dependency.versionRange), parameters(dependency.parameters),
+ limitToSubProject(dependency.limitToSubProject), fallbackMode(dependency.fallbackMode),
+ requiredLocally(dependency.requiredLocally),
+ requiredGlobally(dependency.requiredGlobally) {}
+ ResolvedAndMultiplexedDependsItem() = default;
+ static ResolvedAndMultiplexedDependsItem makeBaseDependency() {
+ ResolvedAndMultiplexedDependsItem item;
+ item.fallbackMode = FallbackMode::Disabled;
+ item.name = StringConstants::qbsModule();
+ return item;
+ }
+
+ QString id() const;
+ CodeLocation location() const;
+ QString displayName() const;
+
+ ProductContext *product = nullptr;
+ Item *item = nullptr;
+ QualifiedId name;
+ QString profile;
+ QString multiplexId;
+ VersionRange versionRange;
+ QVariantMap parameters;
+ bool limitToSubProject = false;
+ FallbackMode fallbackMode = FallbackMode::Enabled;
+ bool requiredLocally = true;
+ bool requiredGlobally = true;
+ bool checkProduct = true;
+ };
+ struct DependenciesResolvingState {
+ Item *loadingItem = nullptr;
+ ResolvedAndMultiplexedDependsItem loadingItemOrigin;
+ std::queue<Item *> pendingDependsItems;
+ std::optional<ResolvedDependsItem> currentDependsItem;
+ std::queue<ResolvedAndMultiplexedDependsItem> pendingResolvedDependencies;
+ bool requiredByLoadingItem = true;
+ };
+ std::list<DependenciesResolvingState> resolveDependenciesState;
+
+ QString uniqueName() const;
+};
+
+class TopLevelProjectContext
+{
+public:
+ TopLevelProjectContext() = default;
+ TopLevelProjectContext(const TopLevelProjectContext &) = delete;
+ TopLevelProjectContext &operator=(const TopLevelProjectContext &) = delete;
+ ~TopLevelProjectContext() { qDeleteAll(projects); }
+
+ std::vector<ProjectContext *> projects;
+ std::list<std::pair<ProductContext *, int>> productsToHandle;
+ std::vector<ProbeConstPtr> probes;
+ QString buildDirectory;
+};
+
+class ProjectContext : public ContextBase
+{
+public:
+ TopLevelProjectContext *topLevelProject = nullptr;
+ ProjectTreeBuilder::Result *result = nullptr;
+ std::vector<ProductContext> products;
+ std::vector<QStringList> searchPathsStack;
+};
+
+
using ShadowProductInfo = std::pair<bool, QString>;
enum class Deferral { Allowed, NotAllowed };
enum class HandleDependency { Use, Ignore, Defer };
@@ -108,6 +228,8 @@ public:
qint64 propertyChecking = 0;
};
+} // namespace
+
class ProjectTreeBuilder::Private
{
public: