diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-05-08 15:55:41 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2018-05-09 07:05:51 +0000 |
commit | 03d1b289e4f2dd8021b57a070e97092034ffa6ac (patch) | |
tree | 324ff6ce60ac9947c4f1de95be3439c9f22460f8 | |
parent | 9ce75e086cc2cd22cbcc0541024fb9044f3cd7ec (diff) |
Show location of invalid Project.references values
Change-Id: I8e55d065603521473190f2b8da332caa25956e3b
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
-rw-r--r-- | src/lib/corelib/language/moduleloader.cpp | 20 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleloader.h | 2 | ||||
-rw-r--r-- | tests/auto/language/testdata/erroneous/invalid-references.qbs | 5 | ||||
-rw-r--r-- | tests/auto/language/tst_language.cpp | 2 |
4 files changed, 22 insertions, 7 deletions
diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp index e9320aba9..3ebfb38d3 100644 --- a/src/lib/corelib/language/moduleloader.cpp +++ b/src/lib/corelib/language/moduleloader.cpp @@ -327,7 +327,7 @@ ModuleLoaderResult ModuleLoader::load(const SetupProjectParameters ¶meters) Item *root; { SearchPathsManager searchPathsManager(m_reader, topLevelSearchPaths); - root = loadItemFromFile(parameters.projectFilePath()); + root = loadItemFromFile(parameters.projectFilePath(), CodeLocation()); if (!root) return ModuleLoaderResult(); } @@ -1473,7 +1473,7 @@ void ModuleLoader::handleSubProject(ModuleLoader::ProjectContext *projectContext if (referencedFilePaths.contains(subProjectFilePath)) throw ErrorInfo(Tr::tr("Cycle detected while loading subproject file '%1'.") .arg(relativeFilePath), projectItem->location()); - loadedItem = loadItemFromFile(subProjectFilePath); + loadedItem = loadItemFromFile(subProjectFilePath, projectItem->location()); } catch (const ErrorInfo &error) { if (m_parameters.productErrorMode() == ErrorHandlingMode::Strict) throw; @@ -1528,7 +1528,7 @@ QList<Item *> ModuleLoader::loadReferencedFile(const QString &relativePath, if (referencedFilePaths.contains(absReferencePath)) throw ErrorInfo(Tr::tr("Cycle detected while referencing file '%1'.").arg(relativePath), referencingLocation); - Item * const subItem = loadItemFromFile(absReferencePath); + Item * const subItem = loadItemFromFile(absReferencePath, referencingLocation); if (subItem->type() != ItemType::Project && subItem->type() != ItemType::Product) { ErrorInfo error(Tr::tr("Item type should be 'Product' or 'Project', but is '%1'.") .arg(subItem->typeName())); @@ -1863,9 +1863,17 @@ bool ModuleLoader::mergeExportItems(const ProductContext &productContext) return exportItems.size() > 0; } -Item *ModuleLoader::loadItemFromFile(const QString &filePath) +Item *ModuleLoader::loadItemFromFile(const QString &filePath, + const CodeLocation &referencingLocation) { - Item * const item = m_reader->readFile(filePath); + Item *item; + try { + item = m_reader->readFile(filePath); + } catch (const ErrorInfo &e) { + if (e.hasLocation()) + throw; + throw ErrorInfo(e.toString(), referencingLocation); + } handleAllPropertyOptionsItems(item); return item; } @@ -2997,7 +3005,7 @@ Item *ModuleLoader::loadModuleFile(ProductContext *productContext, const QString qCDebug(lcModuleLoader) << "loadModuleFile cache hit"; return cacheValue.enabled ? cacheValue.module : 0; } - Item * const module = loadItemFromFile(filePath); + Item * const module = loadItemFromFile(filePath, CodeLocation()); if (module->type() != ItemType::Module) { qCDebug(lcModuleLoader).nospace() << "Alleged module " << fullModuleName << " has type '" diff --git a/src/lib/corelib/language/moduleloader.h b/src/lib/corelib/language/moduleloader.h index c4b94102b..306d791c1 100644 --- a/src/lib/corelib/language/moduleloader.h +++ b/src/lib/corelib/language/moduleloader.h @@ -339,7 +339,7 @@ private: void printProfilingInfo(); void handleProductError(const ErrorInfo &error, ProductContext *productContext); QualifiedIdSet gatherModulePropertiesSetInGroup(const Item *group); - Item *loadItemFromFile(const QString &filePath); + Item *loadItemFromFile(const QString &filePath, const CodeLocation &referencingLocation); void collectProductsByName(const TopLevelProjectContext &topLevelProject); void collectProductsByType(const TopLevelProjectContext &topLevelProject); diff --git a/tests/auto/language/testdata/erroneous/invalid-references.qbs b/tests/auto/language/testdata/erroneous/invalid-references.qbs new file mode 100644 index 000000000..b224a45ac --- /dev/null +++ b/tests/auto/language/testdata/erroneous/invalid-references.qbs @@ -0,0 +1,5 @@ +import qbs + +Project { + references: "nosuchproject.qbs" +} diff --git a/tests/auto/language/tst_language.cpp b/tests/auto/language/tst_language.cpp index ec2580732..e19eef7c0 100644 --- a/tests/auto/language/tst_language.cpp +++ b/tests/auto/language/tst_language.cpp @@ -837,6 +837,8 @@ void TestLanguage::erroneousFiles_data() << "mismatching-multiplex-dependency.qbs:9:5.*Dependency from product " "'b \\{\"architecture\":\"mips\"\\}' to product 'a \\{\"architecture\":\"mips\"\\}'" " not fulfilled."; + QTest::newRow("invalid-references") + << "invalid-references.qbs:4:17.*Cannot open '.*nosuchproject.qbs'"; } void TestLanguage::erroneousFiles() |