diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-05-14 10:26:58 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2018-05-15 07:37:15 +0000 |
commit | 979b2524818fa0b618ac8308c608c6a593e5f521 (patch) | |
tree | dc794a877864ca39df6a1a76e502ec8fc1fc4876 /src/lib/corelib/language/moduleloader.cpp | |
parent | 20d261df437c9c08462735909e9c62c2b7615a55 (diff) |
Allow module instances with the same priority in different search paths
The search path order provides additional prioritization. Conflicts can
now only occur between candidates in the same directory. This is needed
e.g. to allow distributions to provide global search paths.
Change-Id: I698a96e8943041fb0c4536901f75394bacd7fb40
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/lib/corelib/language/moduleloader.cpp')
-rw-r--r-- | src/lib/corelib/language/moduleloader.cpp | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp index 3810a824a..b5f5a255a 100644 --- a/src/lib/corelib/language/moduleloader.cpp +++ b/src/lib/corelib/language/moduleloader.cpp @@ -2839,13 +2839,14 @@ Item *ModuleLoader::loadModule(ProductContext *productContext, Item *exportingPr struct PrioritizedItem { - PrioritizedItem(Item *item, int priority) - : item(item), priority(priority) + PrioritizedItem(Item *item, int priority, int searchPathIndex) + : item(item), priority(priority), searchPathIndex(searchPathIndex) { } Item *item = nullptr; int priority = 0; + int searchPathIndex = 0; }; static Item *chooseModuleCandidate(const std::vector<PrioritizedItem> &candidates, @@ -2853,13 +2854,16 @@ static Item *chooseModuleCandidate(const std::vector<PrioritizedItem> &candidate { auto maxIt = std::max_element(candidates.begin(), candidates.end(), [] (const PrioritizedItem &a, const PrioritizedItem &b) { - return a.priority < b.priority; + if (a.priority < b.priority) + return true; + if (a.priority > b.priority) + return false; + return a.searchPathIndex > b.searchPathIndex; }); - int maxPriority = maxIt->priority; size_t nmax = std::count_if(candidates.begin(), candidates.end(), - [maxPriority] (const PrioritizedItem &i) { - return i.priority == maxPriority; + [maxIt] (const PrioritizedItem &i) { + return i.priority == maxIt->priority && i.searchPathIndex == maxIt->searchPathIndex; }); if (nmax > 1) { @@ -2867,7 +2871,7 @@ static Item *chooseModuleCandidate(const std::vector<PrioritizedItem> &candidate .arg(moduleName)); for (size_t i = 0; i < candidates.size(); ++i) { const auto candidate = candidates.at(i); - if (candidate.priority == maxPriority) { + if (candidate.priority == maxIt->priority) { //: The %1 denotes the number of the candidate. e.append(Tr::tr("candidate %1").arg(i + 1), candidates.at(i).item->location()); } @@ -2886,7 +2890,8 @@ Item *ModuleLoader::searchAndLoadModuleFile(ProductContext *productContext, const QString fullName = moduleName.toString(); std::vector<PrioritizedItem> candidates; const QStringList &searchPaths = m_reader->allSearchPaths(); - for (const QString &path : searchPaths) { + for (int i = 0; i < searchPaths.size(); ++i) { + const QString &path = searchPaths.at(i); const QString dirPath = findExistingModulePath(path, moduleName); if (dirPath.isEmpty()) continue; @@ -2903,7 +2908,7 @@ Item *ModuleLoader::searchAndLoadModuleFile(ProductContext *productContext, Item *module = loadModuleFile(productContext, fullName, isBaseModule(moduleName), filePath, &triedToLoadModule, moduleInstance); if (module) - candidates.emplace_back(module, 0); + candidates.emplace_back(module, 0, i); if (!triedToLoadModule) m_moduleDirListCache[dirPath].removeOne(filePath); } |