diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-07-31 13:31:19 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2018-07-31 11:42:54 +0000 |
commit | 27a174eb70490f1d40637dfe4031e73c8f0f0c3c (patch) | |
tree | 27461b8471f5f2414eb170edeaa22191ed88c704 /src/lib/corelib/language/moduleloader.cpp | |
parent | 24796796bdec74ce71f6db931280ebd4c3e908e9 (diff) |
ModuleLoader: Suppress bogus subsequent errors
This is only relevant for relaxed mode (used by IDEs). We try hard not
to cause bogus subsequent errors in the first place (see cadb0864c9),
but in some edge cases we still run into them, and will drop them now.
Change-Id: I0a12086c29f9e9f6b647902eaaf634c8ea0a094d
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 | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp index 6449655fb..ac6d756b8 100644 --- a/src/lib/corelib/language/moduleloader.cpp +++ b/src/lib/corelib/language/moduleloader.cpp @@ -3796,11 +3796,33 @@ Item *ModuleLoader::createNonPresentModule(const QString &name, const QString &r void ModuleLoader::handleProductError(const ErrorInfo &error, ModuleLoader::ProductContext *productContext) { - if (!productContext->info.delayedError.hasError()) { + const bool alreadyHadError = productContext->info.delayedError.hasError(); + if (!alreadyHadError) { productContext->info.delayedError.append(Tr::tr("Error while handling product '%1':") .arg(productContext->name), productContext->item->location()); } + if (error.isInternalError()) { + if (alreadyHadError) { + qCDebug(lcModuleLoader()) << "ignoring subsequent internal error" << error.toString() + << "in product" << productContext->name; + return; + } + const auto &deps = productContext->productModuleDependencies; + for (auto it = deps.cbegin(); it != deps.cend(); ++it) { + const auto rangeForName = m_productsByName.equal_range(it->first); + for (auto rangeIt = rangeForName.first; rangeIt != rangeForName.second; ++rangeIt) { + const ProductContext * const dep = rangeIt->second; + if (dep->info.delayedError.hasError()) { + qCDebug(lcModuleLoader()) << "ignoring internal error" << error.toString() + << "in product" << productContext->name + << "assumed to be caused by erroneous dependency" + << dep->name; + return; + } + } + } + } for (const ErrorItem &ei : error.items()) productContext->info.delayedError.append(ei.description(), ei.codeLocation()); productContext->project->result->productInfos.insert(productContext->item, |