aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/language/moduleloader.cpp
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2018-07-31 13:31:19 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2018-07-31 11:42:54 +0000
commit27a174eb70490f1d40637dfe4031e73c8f0f0c3c (patch)
tree27461b8471f5f2414eb170edeaa22191ed88c704 /src/lib/corelib/language/moduleloader.cpp
parent24796796bdec74ce71f6db931280ebd4c3e908e9 (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.cpp24
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,