aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/language
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@theqtcompany.com>2016-07-26 17:37:02 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2016-07-27 15:45:55 +0000
commitf774243a13782bc3903ff617c6c0ee23d058b3a7 (patch)
treee51cca7c286038cecea067aec5a0b2f1c2eeefdc /src/lib/corelib/language
parent3918ce36015971c1bdf3248e822d743d852ffd16 (diff)
Move item type check from ModuleLoader to ItemReaderASTVisitor
That's more reliable, since we tweak some item types later on. Task-number: QBS-950 Change-Id: I85edbfa52c6b1da710d990e6b6c080052ad9b9cf Reviewed-by: Jake Petroules <jake.petroules@qt.io>
Diffstat (limited to 'src/lib/corelib/language')
-rw-r--r--src/lib/corelib/language/itemreaderastvisitor.cpp12
-rw-r--r--src/lib/corelib/language/itemreaderastvisitor.h2
-rw-r--r--src/lib/corelib/language/itemreadervisitorstate.cpp1
-rw-r--r--src/lib/corelib/language/moduleloader.cpp17
-rw-r--r--src/lib/corelib/language/moduleloader.h1
5 files changed, 15 insertions, 18 deletions
diff --git a/src/lib/corelib/language/itemreaderastvisitor.cpp b/src/lib/corelib/language/itemreaderastvisitor.cpp
index 4ca923747..b6263e1a8 100644
--- a/src/lib/corelib/language/itemreaderastvisitor.cpp
+++ b/src/lib/corelib/language/itemreaderastvisitor.cpp
@@ -349,5 +349,17 @@ void ItemReaderASTVisitor::checkDeprecationStatus(ItemType itemType, const QStri
m_logger.printWarning(error);
}
+void ItemReaderASTVisitor::doCheckItemTypes(const Item *item)
+{
+ const ItemDeclaration decl = BuiltinDeclarations::instance().declarationsForType(item->type());
+ foreach (const Item * const child, item->children()) {
+ if (!decl.isChildTypeAllowed(child->type())) {
+ throw ErrorInfo(Tr::tr("Items of type '%1' cannot contain items of type '%2'.")
+ .arg(item->typeName(), child->typeName()), child->location());
+ }
+ doCheckItemTypes(child);
+ }
+}
+
} // namespace Internal
} // namespace qbs
diff --git a/src/lib/corelib/language/itemreaderastvisitor.h b/src/lib/corelib/language/itemreaderastvisitor.h
index 9c6a4fcc2..0cb863b42 100644
--- a/src/lib/corelib/language/itemreaderastvisitor.h
+++ b/src/lib/corelib/language/itemreaderastvisitor.h
@@ -53,6 +53,7 @@ class ItemReaderASTVisitor : public QbsQmlJS::AST::Visitor
public:
ItemReaderASTVisitor(ItemReaderVisitorState &visitorState, const FileContextPtr &file,
ItemPool *itemPool, Logger logger);
+ void checkItemTypes() { doCheckItemTypes(rootItem()); }
Item *rootItem() const { return m_item; }
@@ -71,6 +72,7 @@ private:
static void inheritItem(Item *dst, const Item *src);
void checkDeprecationStatus(ItemType itemType, const QString &itemName,
const CodeLocation &itemLocation);
+ void doCheckItemTypes(const Item *item);
ItemReaderVisitorState &m_visitorState;
const FileContextPtr m_file;
diff --git a/src/lib/corelib/language/itemreadervisitorstate.cpp b/src/lib/corelib/language/itemreadervisitorstate.cpp
index 85ec53e14..1ad6ccd77 100644
--- a/src/lib/corelib/language/itemreadervisitorstate.cpp
+++ b/src/lib/corelib/language/itemreadervisitorstate.cpp
@@ -150,6 +150,7 @@ Item *ItemReaderVisitorState::readFile(const QString &filePath, const QStringLis
cacheValue.setProcessingFlag(true);
cacheValue.ast()->accept(&astVisitor);
cacheValue.setProcessingFlag(false);
+ astVisitor.checkItemTypes();
return astVisitor.rootItem();
}
diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp
index baf3ddde1..ff082f87d 100644
--- a/src/lib/corelib/language/moduleloader.cpp
+++ b/src/lib/corelib/language/moduleloader.cpp
@@ -381,7 +381,6 @@ void ModuleLoader::handleTopLevelProject(ModuleLoaderResult *loadResult, Item *p
handleProduct(p);
m_reader->clearExtraSearchPathsStack();
- checkItemTypes(projectItem);
PropertyDeclarationCheck check(m_disabledItems, m_parameters, m_logger);
check(projectItem);
}
@@ -1767,22 +1766,6 @@ bool ModuleLoader::checkItemCondition(Item *item)
return false;
}
-void ModuleLoader::checkItemTypes(Item *item)
-{
- const ItemDeclaration decl = BuiltinDeclarations::instance().declarationsForType(item->type());
- foreach (Item *child, item->children()) {
- if (child->type() > ItemType::LastActualItem)
- continue;
- checkItemTypes(child);
- if (!decl.isChildTypeAllowed(child->type()))
- throw ErrorInfo(Tr::tr("Items of type '%1' cannot contain items of type '%2'.")
- .arg(item->typeName(), child->typeName()), item->location());
- }
-
- foreach (const Item::Module &m, item->modules())
- checkItemTypes(m.item);
-}
-
QStringList ModuleLoader::readExtraSearchPaths(Item *item, bool *wasSet)
{
QStringList result;
diff --git a/src/lib/corelib/language/moduleloader.h b/src/lib/corelib/language/moduleloader.h
index d69b11856..efc825826 100644
--- a/src/lib/corelib/language/moduleloader.h
+++ b/src/lib/corelib/language/moduleloader.h
@@ -227,7 +227,6 @@ private:
void resolveProbe(ProductContext *productContext, Item *parent, Item *probe);
void checkCancelation() const;
bool checkItemCondition(Item *item);
- void checkItemTypes(Item *item);
QStringList readExtraSearchPaths(Item *item, bool *wasSet = 0);
void copyProperties(const Item *sourceProject, Item *targetProject);
Item *wrapInProjectIfNecessary(Item *item);