aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2013-11-13 17:01:37 +0100
committerChristian Kandeler <christian.kandeler@digia.com>2013-11-14 10:31:21 +0100
commit42c835bd8716a8f0a986eed47088998e0c297b18 (patch)
treef84aa1fd9d7b329ade321e84385c3c68459f01b8
parent753b1e224f1d5811a621e8bc49b11fd11d5e035a (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.cpp5
-rw-r--r--src/lib/language/builtindeclarations.h1
-rw-r--r--src/lib/language/moduleloader.cpp16
-rw-r--r--src/lib/language/projectresolver.cpp5
-rw-r--r--src/lib/language/testdata/erroneous/unknown_item_type.qbs3
-rw-r--r--src/lib/language/tst_language.cpp2
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()