diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-11-13 17:01:37 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@digia.com> | 2013-11-14 10:31:21 +0100 |
commit | 42c835bd8716a8f0a986eed47088998e0c297b18 (patch) | |
tree | f84aa1fd9d7b329ade321e84385c3c68459f01b8 | |
parent | 753b1e224f1d5811a621e8bc49b11fd11d5e035a (diff) |
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 <christian.kandeler@digia.com>
-rw-r--r-- | src/lib/language/builtindeclarations.cpp | 5 | ||||
-rw-r--r-- | src/lib/language/builtindeclarations.h | 1 | ||||
-rw-r--r-- | src/lib/language/moduleloader.cpp | 16 | ||||
-rw-r--r-- | src/lib/language/projectresolver.cpp | 5 | ||||
-rw-r--r-- | src/lib/language/testdata/erroneous/unknown_item_type.qbs | 3 | ||||
-rw-r--r-- | src/lib/language/tst_language.cpp | 2 |
6 files changed, 25 insertions, 7 deletions
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<PropertyDeclaration> 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<PropertyDeclaration> 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<Item *, QSet<QString> > &m_validItemPropertyNamesPerItem; const QSet<Item *> &m_disabledItems; Item *m_parentItem; QString m_currentName; public: - PropertyDeclarationCheck(const QHash<Item *, QSet<QString> > &validItemPropertyNamesPerItem, + PropertyDeclarationCheck(const BuiltinDeclarations *builtins, + const QHash<Item *, QSet<QString> > &validItemPropertyNamesPerItem, const QSet<Item *> &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() |