diff options
| author | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-03-22 12:36:43 +0100 |
|---|---|---|
| committer | Christian Kandeler <christian.kandeler@digia.com> | 2013-03-28 13:55:42 +0100 |
| commit | 613a424a325d93fb3f4bc144c6c8ea0fda9c0f4d (patch) | |
| tree | 85bcfe26a344d0cb179b2e4e3158d8786504ab32 | |
| parent | 3473687f4283107caf07616ae818bc685ea7458f (diff) | |
| download | qbs-613a424a325d93fb3f4bc144c6c8ea0fda9c0f4d.tar.gz | |
yield error if loops in qbs imports are detected
Task-number: QBS-234
Change-Id: I3768cf7578426092895e992b6179fbf9fa119325
Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
| -rw-r--r-- | src/lib/language/itemreader.cpp | 12 | ||||
| -rw-r--r-- | src/lib/language/testdata/erroneous/importloop1.qbs | 5 | ||||
| -rw-r--r-- | src/lib/language/testdata/erroneous/importloop2.qbs | 5 | ||||
| -rw-r--r-- | src/lib/language/tst_language.cpp | 2 |
4 files changed, 23 insertions, 1 deletions
diff --git a/src/lib/language/itemreader.cpp b/src/lib/language/itemreader.cpp index 3d1fd8c05..27c63da0b 100644 --- a/src/lib/language/itemreader.cpp +++ b/src/lib/language/itemreader.cpp @@ -50,12 +50,14 @@ class ASTCacheValueData : public QSharedData public: ASTCacheValueData() : ast(0) + , processing(false) { } QString code; QbsQmlJS::Engine engine; QbsQmlJS::AST::UiProgram *ast; + bool processing; }; class ASTCacheValue @@ -71,6 +73,9 @@ public: { } + void setProcessingFlag(bool b) { d->processing = b; } + bool isProcessing() const { return d->processing; } + void setCode(const QString &code) { d->code = code; } QString code() const { return d->code; } @@ -112,7 +117,10 @@ ItemPtr ItemReader::readFile(const QString &filePath) ItemReaderResult ItemReader::internalReadFile(const QString &filePath) { ASTCacheValue &cacheValue = (*m_astCache)[filePath]; - if (!cacheValue.isValid()) { + if (cacheValue.isValid()) { + if (cacheValue.isProcessing()) + throw Error(Tr::tr("Loop detected when importing '%1'.").arg(filePath)); + } else { QFile file(filePath); if (!file.open(QFile::ReadOnly)) throw Error(Tr::tr("Couldn't open '%1'.").arg(filePath)); @@ -141,7 +149,9 @@ ItemReaderResult ItemReader::internalReadFile(const QString &filePath) ItemReaderASTVisitor itemReader(this, &result); itemReader.setFilePath(QFileInfo(filePath).absoluteFilePath()); itemReader.setSourceCode(cacheValue.code()); + cacheValue.setProcessingFlag(true); cacheValue.ast()->accept(&itemReader); + cacheValue.setProcessingFlag(false); return result; } diff --git a/src/lib/language/testdata/erroneous/importloop1.qbs b/src/lib/language/testdata/erroneous/importloop1.qbs new file mode 100644 index 000000000..91e8f620f --- /dev/null +++ b/src/lib/language/testdata/erroneous/importloop1.qbs @@ -0,0 +1,5 @@ +import qbs 1.0 +import "importloop2.qbs" as X + +X {} + diff --git a/src/lib/language/testdata/erroneous/importloop2.qbs b/src/lib/language/testdata/erroneous/importloop2.qbs new file mode 100644 index 000000000..c41fe7e9f --- /dev/null +++ b/src/lib/language/testdata/erroneous/importloop2.qbs @@ -0,0 +1,5 @@ +import qbs 1.0 +import "importloop1.qbs" as X + +X {} + diff --git a/src/lib/language/tst_language.cpp b/src/lib/language/tst_language.cpp index b595773d0..84bd96981 100644 --- a/src/lib/language/tst_language.cpp +++ b/src/lib/language/tst_language.cpp @@ -227,6 +227,8 @@ void TestLanguage::erroneousFiles_data() << "Depends.submodules cannot be used if name contains a dot"; QTest::newRow("multiple_productmodules") << "Multiple ProductModule items in one product are prohibited."; + QTest::newRow("importloop1") + << "Loop detected when importing"; } void TestLanguage::erroneousFiles() |
