diff options
| author | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-08-27 10:09:30 +0200 |
|---|---|---|
| committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-08-27 16:44:24 +0200 |
| commit | 92ae89a2f7aee0c857062ada2a82af55e9153070 (patch) | |
| tree | 7105357ae8cc81ffcf14cde49306b2f006f6bcac /src/lib/buildgraph | |
| parent | 33a91f7af18d8703cc63ef640d24b417a9e3cdf2 (diff) | |
| download | qbs-92ae89a2f7aee0c857062ada2a82af55e9153070.tar.gz | |
AutoMoc: do not scan files twice
We scanned files for the Q_OBJECT macro and then again to find
moc_XXX.cpp includes. This can be done in one pass.
Change-Id: I3b14be2a922ce244730b3ce21e7803c605ba59be
Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
Diffstat (limited to 'src/lib/buildgraph')
| -rw-r--r-- | src/lib/buildgraph/automoc.cpp | 50 | ||||
| -rw-r--r-- | src/lib/buildgraph/scanresultcache.h | 4 |
2 files changed, 24 insertions, 30 deletions
diff --git a/src/lib/buildgraph/automoc.cpp b/src/lib/buildgraph/automoc.cpp index 1c9374be8..40c798962 100644 --- a/src/lib/buildgraph/automoc.cpp +++ b/src/lib/buildgraph/automoc.cpp @@ -188,37 +188,21 @@ void AutoMoc::scan(Artifact *artifact, FileType fileType, bool &hasQObjectMacro, hasQObjectMacro = false; foreach (ScannerPlugin *scanner, fileType == HppFileType ? hppScanners() : cppScanners()) { - void *opaq = scanner->open(artifact->filePath().utf16(), ScanForFileTagsFlag); - if (!opaq || !scanner->additionalFileTags) - continue; - - // HACK: misuse the file dependency scanner as provider for file tags - int length = 0; - const char **szFileTagsFromScanner = scanner->additionalFileTags(opaq, &length); - if (szFileTagsFromScanner && length > 0) { - for (int i=length; --i >= 0;) { - artifact->fileTags.insert(szFileTagsFromScanner[i]); - if (m_logger.traceEnabled()) - m_logger.qbsTrace() << "[AUTOMOC] finds Q_OBJECT macro"; - const QByteArray fileTagFromScanner - = QByteArray::fromRawData(szFileTagsFromScanner[i], - qstrlen(szFileTagsFromScanner[i])); - if (fileTagFromScanner.startsWith("moc")) - hasQObjectMacro = true; - } - } - - scanner->close(opaq); - - ScanResultCache::Result scanResult; - if (m_scanResultCache) - scanResult = m_scanResultCache->value(artifact->filePath()); + ScanResultCache::Result scanResult = m_scanResultCache->value(artifact->filePath()); if (!scanResult.valid) { scanResult.valid = true; - opaq = scanner->open(artifact->filePath().utf16(), ScanForDependenciesFlag); - if (!opaq) + void *opaq = scanner->open(artifact->filePath().utf16(), + ScanForDependenciesFlag | ScanForFileTagsFlag); + if (!opaq || !scanner->additionalFileTags) continue; + int length = 0; + const char **szFileTagsFromScanner = scanner->additionalFileTags(opaq, &length); + if (szFileTagsFromScanner && length > 0) { + for (int i = length; --i >= 0;) + scanResult.additionalFileTags += szFileTagsFromScanner[i]; + } + forever { int flags = 0; const char *szOutFilePath = scanner->next(opaq, &length, &flags); @@ -232,8 +216,16 @@ void AutoMoc::scan(Artifact *artifact, FileType fileType, bool &hasQObjectMacro, } scanner->close(opaq); - if (m_scanResultCache) - m_scanResultCache->insert(artifact->filePath(), scanResult); + m_scanResultCache->insert(artifact->filePath(), scanResult); + } + + foreach (const FileTag &tag, scanResult.additionalFileTags) { + artifact->fileTags.insert(tag); + if (tag.name().startsWith("moc")) { + hasQObjectMacro = true; + if (m_logger.traceEnabled()) + m_logger.qbsTrace() << "[AUTOMOC] finds Q_OBJECT macro"; + } } foreach (const ScanResultCache::Dependency &dependency, scanResult.deps) { diff --git a/src/lib/buildgraph/scanresultcache.h b/src/lib/buildgraph/scanresultcache.h index 922141be5..d71f66ccf 100644 --- a/src/lib/buildgraph/scanresultcache.h +++ b/src/lib/buildgraph/scanresultcache.h @@ -30,8 +30,9 @@ #ifndef QBS_SCANRESULTCACHE_H #define QBS_SCANRESULTCACHE_H +#include <language/filetags.h> + #include <QHash> -#include <QSet> #include <QString> #include <QVector> @@ -68,6 +69,7 @@ public: {} QVector<Dependency> deps; + FileTags additionalFileTags; bool valid; }; |
