diff options
author | Christian Kandeler <christian.kandeler@theqtcompany.com> | 2016-07-26 17:37:02 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2016-07-27 15:45:55 +0000 |
commit | f774243a13782bc3903ff617c6c0ee23d058b3a7 (patch) | |
tree | e51cca7c286038cecea067aec5a0b2f1c2eeefdc /src/lib/corelib/language | |
parent | 3918ce36015971c1bdf3248e822d743d852ffd16 (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.cpp | 12 | ||||
-rw-r--r-- | src/lib/corelib/language/itemreaderastvisitor.h | 2 | ||||
-rw-r--r-- | src/lib/corelib/language/itemreadervisitorstate.cpp | 1 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleloader.cpp | 17 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleloader.h | 1 |
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); |