diff options
Diffstat (limited to 'src/lib/corelib/language/projecttreebuilder.cpp')
-rw-r--r-- | src/lib/corelib/language/projecttreebuilder.cpp | 122 |
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: |