From 33a91f7af18d8703cc63ef640d24b417a9e3cdf2 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Tue, 27 Aug 2013 09:55:58 +0200 Subject: don't pass file tags to scanner plugins The scanners already know the file tags they're responsible for. Change-Id: If5ed47bfc011357737df08e3fe834ec8fcf4318b Reviewed-by: Christian Kandeler --- src/lib/buildgraph/automoc.cpp | 56 ++++++++++------------------- src/lib/buildgraph/automoc.h | 9 +++-- src/lib/buildgraph/inputartifactscanner.cpp | 2 +- 3 files changed, 26 insertions(+), 41 deletions(-) (limited to 'src/lib/buildgraph') diff --git a/src/lib/buildgraph/automoc.cpp b/src/lib/buildgraph/automoc.cpp index a37f96fcf..1c9374be8 100644 --- a/src/lib/buildgraph/automoc.cpp +++ b/src/lib/buildgraph/automoc.cpp @@ -44,29 +44,6 @@ namespace qbs { namespace Internal { -static char **createCFileTags(const FileTags &fileTags) -{ - if (fileTags.isEmpty()) - return 0; - - char **buf = new char*[fileTags.count()]; - size_t i = 0; - foreach (const FileTag &fileTag, fileTags) { - buf[i] = qstrdup(fileTag.toString().toLocal8Bit().data()); - ++i; - } - return buf; -} - -static void freeCFileTags(char **cFileTags, int numFileTags) -{ - if (!cFileTags) - return; - for (int i = numFileTags; --i >= 0;) - delete[] cFileTags[i]; - delete[] cFileTags; -} - AutoMoc::AutoMoc(const Logger &logger, QObject *parent) : QObject(parent) , m_scanResultCache(0) @@ -81,7 +58,7 @@ void AutoMoc::setScanResultCache(ScanResultCache *scanResultCache) void AutoMoc::apply(const ResolvedProductPtr &product) { - if (scanners().isEmpty()) + if (cppScanners().isEmpty() || hppScanners().isEmpty()) throw ErrorInfo("C++ scanner cannot be loaded."); Artifact *pluginMetaDataFile = 0; @@ -119,7 +96,7 @@ void AutoMoc::apply(const ResolvedProductPtr &product) FileTag mocFileTag; bool alreadyMocced = isVictimOfMoc(artifact, fileType, mocFileTag); bool hasQObjectMacro; - scan(artifact, hasQObjectMacro, includedMocCppFiles); + scan(artifact, fileType, hasQObjectMacro, includedMocCppFiles); if (hasQObjectMacro && !alreadyMocced) { artifactsToMoc += qMakePair(artifact, fileType); } else if (!hasQObjectMacro && alreadyMocced) { @@ -202,17 +179,16 @@ AutoMoc::FileType AutoMoc::fileType(Artifact *artifact) return UnknownFileType; } -void AutoMoc::scan(Artifact *artifact, bool &hasQObjectMacro, QSet &includedMocCppFiles) +void AutoMoc::scan(Artifact *artifact, FileType fileType, bool &hasQObjectMacro, + QSet &includedMocCppFiles) { if (m_logger.traceEnabled()) m_logger.qbsTrace() << "[AUTOMOC] checks " << relativeArtifactFileName(artifact); hasQObjectMacro = false; - const int numFileTags = artifact->fileTags.count(); - char **cFileTags = createCFileTags(artifact->fileTags); - foreach (ScannerPlugin *scanner, scanners()) { - void *opaq = scanner->open(artifact->filePath().utf16(), cFileTags, numFileTags); + foreach (ScannerPlugin *scanner, fileType == HppFileType ? hppScanners() : cppScanners()) { + void *opaq = scanner->open(artifact->filePath().utf16(), ScanForFileTagsFlag); if (!opaq || !scanner->additionalFileTags) continue; @@ -239,7 +215,7 @@ void AutoMoc::scan(Artifact *artifact, bool &hasQObjectMacro, QSet &inc scanResult = m_scanResultCache->value(artifact->filePath()); if (!scanResult.valid) { scanResult.valid = true; - opaq = scanner->open(artifact->filePath().utf16(), 0, 0); + opaq = scanner->open(artifact->filePath().utf16(), ScanForDependenciesFlag); if (!opaq) continue; @@ -269,8 +245,6 @@ void AutoMoc::scan(Artifact *artifact, bool &hasQObjectMacro, QSet &inc } } } - - freeCFileTags(cFileTags, numFileTags); } static FileTags provideMocHeaderFileTags() @@ -357,12 +331,20 @@ void AutoMoc::unmoc(Artifact *artifact, const FileTag &mocFileTag) delete generatedMocArtifact; } -QList AutoMoc::scanners() const +const QList &AutoMoc::cppScanners() const +{ + if (m_cppScanners.isEmpty()) + m_cppScanners = ScannerPluginManager::scannersForFileTag("cpp"); + + return m_cppScanners; +} + +const QList &AutoMoc::hppScanners() const { - if (m_scanners.isEmpty()) - m_scanners = ScannerPluginManager::scannersForFileTag("hpp"); + if (m_hppScanners.isEmpty()) + m_hppScanners = ScannerPluginManager::scannersForFileTag("hpp"); - return m_scanners; + return m_hppScanners; } } // namespace Internal diff --git a/src/lib/buildgraph/automoc.h b/src/lib/buildgraph/automoc.h index a24e7320f..118202b17 100644 --- a/src/lib/buildgraph/automoc.h +++ b/src/lib/buildgraph/automoc.h @@ -76,12 +76,15 @@ private: private: static QString generateMocFileName(Artifact *artifact, FileType fileType); static FileType fileType(Artifact *artifact); - void scan(Artifact *artifact, bool &hasQObjectMacro, QSet &includedMocCppFiles); + void scan(Artifact *artifact, FileType fileType, bool &hasQObjectMacro, + QSet &includedMocCppFiles); bool isVictimOfMoc(Artifact *artifact, FileType fileType, FileTag &foundMocFileTag); void unmoc(Artifact *artifact, const FileTag &mocFileTag); - QList scanners() const; + const QList &cppScanners() const; + const QList &hppScanners() const; - mutable QList m_scanners; + mutable QList m_cppScanners; + mutable QList m_hppScanners; ScanResultCache *m_scanResultCache; Logger m_logger; }; diff --git a/src/lib/buildgraph/inputartifactscanner.cpp b/src/lib/buildgraph/inputartifactscanner.cpp index b54edd92e..e4f50322b 100644 --- a/src/lib/buildgraph/inputartifactscanner.cpp +++ b/src/lib/buildgraph/inputartifactscanner.cpp @@ -121,7 +121,7 @@ static bool scanWithScannerPlugin(ScannerPlugin *scannerPlugin, const QString &filePathToBeScanned, ScanResultCache::Result *scanResult) { - void *scannerHandle = scannerPlugin->open(filePathToBeScanned.utf16(), 0, 0); + void *scannerHandle = scannerPlugin->open(filePathToBeScanned.utf16(), ScanForDependenciesFlag); if (!scannerHandle) return false; while (true) { -- cgit v1.2.1