summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2013-03-22 12:36:43 +0100
committerChristian Kandeler <christian.kandeler@digia.com>2013-03-28 13:55:42 +0100
commit613a424a325d93fb3f4bc144c6c8ea0fda9c0f4d (patch)
tree85bcfe26a344d0cb179b2e4e3158d8786504ab32
parent3473687f4283107caf07616ae818bc685ea7458f (diff)
downloadqbs-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.cpp12
-rw-r--r--src/lib/language/testdata/erroneous/importloop1.qbs5
-rw-r--r--src/lib/language/testdata/erroneous/importloop2.qbs5
-rw-r--r--src/lib/language/tst_language.cpp2
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()