From 42c835bd8716a8f0a986eed47088998e0c297b18 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Wed, 13 Nov 2013 17:01:37 +0100 Subject: fix 'Unexpected item type' error message The property declaration check shadowed this error. An erroneous file like Appliaction { // mis-spelled Application name: "foo" } Yielded the error "undeclared property 'name'", when it should say "I know nothing about Appliaction". Change-Id: I20d03b13a3fa02b6539950a50d7bae1c5acbfbac Reviewed-by: Christian Kandeler --- src/lib/language/builtindeclarations.cpp | 5 +++++ src/lib/language/builtindeclarations.h | 1 + src/lib/language/moduleloader.cpp | 16 +++++++++++++--- src/lib/language/projectresolver.cpp | 5 +---- .../language/testdata/erroneous/unknown_item_type.qbs | 3 +++ src/lib/language/tst_language.cpp | 2 ++ 6 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 src/lib/language/testdata/erroneous/unknown_item_type.qbs diff --git a/src/lib/language/builtindeclarations.cpp b/src/lib/language/builtindeclarations.cpp index 3af3f7fd2..385467a9c 100644 --- a/src/lib/language/builtindeclarations.cpp +++ b/src/lib/language/builtindeclarations.cpp @@ -124,6 +124,11 @@ QByteArray BuiltinDeclarations::qmlTypeInfo() const return result; } +bool BuiltinDeclarations::containsType(const QString &typeName) const +{ + return m_builtins.contains(typeName); +} + QList BuiltinDeclarations::declarationsForType(const QString &typeName) const { return m_builtins.value(typeName); diff --git a/src/lib/language/builtindeclarations.h b/src/lib/language/builtindeclarations.h index 1f0c26e69..4cbd352a7 100644 --- a/src/lib/language/builtindeclarations.h +++ b/src/lib/language/builtindeclarations.h @@ -47,6 +47,7 @@ public: QString languageVersion() const; QByteArray qmlTypeInfo() const; + bool containsType(const QString &typeName) const; QList declarationsForType(const QString &typeName) const; void setupItemForBuiltinType(qbs::Internal::Item *item) const; diff --git a/src/lib/language/moduleloader.cpp b/src/lib/language/moduleloader.cpp index 94786e3df..13c31cbcb 100644 --- a/src/lib/language/moduleloader.cpp +++ b/src/lib/language/moduleloader.cpp @@ -125,14 +125,17 @@ ModuleLoaderResult ModuleLoader::load(const QString &filePath, class PropertyDeclarationCheck : public ValueHandler { + const BuiltinDeclarations *m_builtins; const QHash > &m_validItemPropertyNamesPerItem; const QSet &m_disabledItems; Item *m_parentItem; QString m_currentName; public: - PropertyDeclarationCheck(const QHash > &validItemPropertyNamesPerItem, + PropertyDeclarationCheck(const BuiltinDeclarations *builtins, + const QHash > &validItemPropertyNamesPerItem, const QSet &disabledItems) - : m_validItemPropertyNamesPerItem(validItemPropertyNamesPerItem) + : m_builtins(builtins) + , m_validItemPropertyNamesPerItem(validItemPropertyNamesPerItem) , m_disabledItems(disabledItems) , m_parentItem(0) { @@ -169,6 +172,12 @@ private: void handleItem(Item *item) { + if (Q_UNLIKELY(!item->typeName().isEmpty() + && !m_builtins->containsType(item->typeName()))) { + const QString msg = Tr::tr("Unexpected item type '%1'."); + throw ErrorInfo(msg.arg(item->typeName()), item->location()); + } + if (m_disabledItems.contains(item) || item->typeName() == QLatin1String("SubProject")) return; @@ -250,7 +259,8 @@ void ModuleLoader::handleProject(ModuleLoaderResult *loadResult, Item *item, } } - PropertyDeclarationCheck check(m_validItemPropertyNamesPerItem, m_disabledItems); + PropertyDeclarationCheck check(m_reader->builtins(), m_validItemPropertyNamesPerItem, + m_disabledItems); check(item); m_reader->popExtraSearchPaths(); diff --git a/src/lib/language/projectresolver.cpp b/src/lib/language/projectresolver.cpp index ef6ecc94b..9e89016f9 100644 --- a/src/lib/language/projectresolver.cpp +++ b/src/lib/language/projectresolver.cpp @@ -960,10 +960,7 @@ void ProjectResolver::callItemFunction(const ItemFuncMap &mappings, Item *item, { const QByteArray typeName = item->typeName().toLocal8Bit(); ItemFuncPtr f = mappings.value(typeName); - if (Q_UNLIKELY(!f)) { - const QString msg = Tr::tr("Unexpected item type '%1'."); - throw ErrorInfo(msg.arg(item->typeName()), item->location()); - } + QBS_CHECK(f); if (typeName == "Project") { ProjectContext subProjectContext = createProjectContext(projectContext); (this->*f)(item, &subProjectContext); diff --git a/src/lib/language/testdata/erroneous/unknown_item_type.qbs b/src/lib/language/testdata/erroneous/unknown_item_type.qbs new file mode 100644 index 000000000..9e34e9243 --- /dev/null +++ b/src/lib/language/testdata/erroneous/unknown_item_type.qbs @@ -0,0 +1,3 @@ +Narf { + zort: 1 // This invalid binding should not hide the "Unexpected item type" error. +} diff --git a/src/lib/language/tst_language.cpp b/src/lib/language/tst_language.cpp index 45cb3a141..75089f2a7 100644 --- a/src/lib/language/tst_language.cpp +++ b/src/lib/language/tst_language.cpp @@ -329,6 +329,8 @@ void TestLanguage::erroneousFiles_data() << "Item 'cpp' is not declared."; QTest::newRow("undeclared_property") << "Property 'doesntexist' is not declared."; + QTest::newRow("unknown_item_type") + << "Unexpected item type 'Narf'"; } void TestLanguage::erroneousFiles() -- cgit v1.2.1