diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-05-07 12:24:02 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2018-05-16 07:28:50 +0000 |
commit | a0d3454e7b8d816f5bb5c76ed2e9d50ff6550485 (patch) | |
tree | 924065974118f0591475ec6271cbb7485ca860df /src/lib/corelib/language/moduleloader.h | |
parent | be8432fac97e701d3c7b7b45171f773ab33b9aae (diff) |
Make Depends.productTypes in Export items work
Change-Id: I441c0454ee7a4b928c132052c49db1cddc34d3c9
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/lib/corelib/language/moduleloader.h')
-rw-r--r-- | src/lib/corelib/language/moduleloader.h | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/src/lib/corelib/language/moduleloader.h b/src/lib/corelib/language/moduleloader.h index dc33171f1..7e551b5c2 100644 --- a/src/lib/corelib/language/moduleloader.h +++ b/src/lib/corelib/language/moduleloader.h @@ -151,6 +151,24 @@ private: typedef std::vector<ModuleLoaderResult::ProductInfo::Dependency> ProductDependencies; + // This is the data we need to store at the point where a dependency is deferred + // in order to properly resolve the dependency in pass 2. + struct DeferredDependsContext { + DeferredDependsContext(Item *exportingProduct, Item *parent) + : exportingProductItem(exportingProduct), parentItem(parent) {} + Item *exportingProductItem = nullptr; + Item *parentItem = nullptr; + bool operator==(const DeferredDependsContext &other) const + { + return exportingProductItem == other.exportingProductItem + && parentItem == other.parentItem; + } + bool operator<(const DeferredDependsContext &other) const + { + return parentItem < other.parentItem; + } + }; + class ProductContext : public ContextBase { public: @@ -162,7 +180,10 @@ private: QVariantMap moduleProperties; std::map<QString, ProductDependencies> productModuleDependencies; std::unordered_map<const Item *, std::vector<ErrorInfo>> unknownProfilePropertyErrors; - QList<Item *> deferredDependsItems; + + // The key corresponds to DeferredDependsContext.exportingProductItem, which is the + // only value from that data structure that we still need here. + std::unordered_map<Item *, std::vector<Item *>> deferredDependsItems; QString uniqueName() const; }; @@ -229,13 +250,15 @@ private: static MultiplexTable combine(const MultiplexTable &table, const MultiplexRow &values); MultiplexInfo extractMultiplexInfo(Item *productItem, Item *qbsModuleItem); QList<Item *> multiplexProductItem(ProductContext *dummyContext, Item *productItem); - void normalizeDependencies(ProductContext &product); + void normalizeDependencies(ProductContext *product, + const DeferredDependsContext &dependsContext); void adjustDependenciesForMultiplexing(const TopLevelProjectContext &tlp); void adjustDependenciesForMultiplexing(const ProductContext &product); void adjustDependenciesForMultiplexing(const ProductContext &product, Item *dependsItem); void prepareProduct(ProjectContext *projectContext, Item *productItem); - void setupProductDependencies(ProductContext *productContext); + void setupProductDependencies(ProductContext *productContext, + const Set<DeferredDependsContext> &deferredDependsContext); void handleProduct(ProductContext *productContext); void checkDependencyParameterDeclarations(const ProductContext *productContext) const; void handleModuleSetupError(ProductContext *productContext, const Item::Module &module, @@ -390,7 +413,10 @@ private: QVariantMap m_localProfiles; std::multimap<QString, const ProductContext *> m_productsByName; std::multimap<FileTag, const ProductContext *> m_productsByType; - Set<ProductContext *> m_productsWithDeferredDependsItems; + + std::unordered_map<ProductContext *, Set<DeferredDependsContext>> m_productsWithDeferredDependsItems; + Set<Item *> m_exportsWithDeferredDependsItems; + SetupProjectParameters m_parameters; std::unique_ptr<Settings> m_settings; Version m_qbsVersion; |