diff options
Diffstat (limited to 'src/lib/language/itemreader.cpp')
| -rw-r--r-- | src/lib/language/itemreader.cpp | 12 |
1 files changed, 11 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; } |
