diff options
| author | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-08-27 09:55:58 +0200 |
|---|---|---|
| committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-08-27 15:06:15 +0200 |
| commit | 33a91f7af18d8703cc63ef640d24b417a9e3cdf2 (patch) | |
| tree | 28da22e6a3c6cc765e6924f495ea4045ff2c31ae /src | |
| parent | eb7287fb0263f24978e090025fb137f706f5237c (diff) | |
| download | qbs-33a91f7af18d8703cc63ef640d24b417a9e3cdf2.tar.gz | |
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 <christian.kandeler@digia.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/buildgraph/automoc.cpp | 56 | ||||
| -rw-r--r-- | src/lib/buildgraph/automoc.h | 9 | ||||
| -rw-r--r-- | src/lib/buildgraph/inputartifactscanner.cpp | 2 | ||||
| -rw-r--r-- | src/plugins/scanner/cpp/cppscanner.cpp | 42 | ||||
| -rw-r--r-- | src/plugins/scanner/qt/qtscanner.cpp | 5 | ||||
| -rw-r--r-- | src/plugins/scanner/scanner.h | 11 |
6 files changed, 56 insertions, 69 deletions
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<QString> &includedMocCppFiles) +void AutoMoc::scan(Artifact *artifact, FileType fileType, bool &hasQObjectMacro, + QSet<QString> &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<QString> &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<QString> &inc } } } - - freeCFileTags(cFileTags, numFileTags); } static FileTags provideMocHeaderFileTags() @@ -357,12 +331,20 @@ void AutoMoc::unmoc(Artifact *artifact, const FileTag &mocFileTag) delete generatedMocArtifact; } -QList<ScannerPlugin *> AutoMoc::scanners() const +const QList<ScannerPlugin *> &AutoMoc::cppScanners() const +{ + if (m_cppScanners.isEmpty()) + m_cppScanners = ScannerPluginManager::scannersForFileTag("cpp"); + + return m_cppScanners; +} + +const QList<ScannerPlugin *> &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<QString> &includedMocCppFiles); + void scan(Artifact *artifact, FileType fileType, bool &hasQObjectMacro, + QSet<QString> &includedMocCppFiles); bool isVictimOfMoc(Artifact *artifact, FileType fileType, FileTag &foundMocFileTag); void unmoc(Artifact *artifact, const FileTag &mocFileTag); - QList<ScannerPlugin *> scanners() const; + const QList<ScannerPlugin *> &cppScanners() const; + const QList<ScannerPlugin *> &hppScanners() const; - mutable QList<ScannerPlugin *> m_scanners; + mutable QList<ScannerPlugin *> m_cppScanners; + mutable QList<ScannerPlugin *> 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) { diff --git a/src/plugins/scanner/cpp/cppscanner.cpp b/src/plugins/scanner/cpp/cppscanner.cpp index 399feba4c..ede98cb0e 100644 --- a/src/plugins/scanner/cpp/cppscanner.cpp +++ b/src/plugins/scanner/cpp/cppscanner.cpp @@ -60,7 +60,7 @@ struct Opaq { enum FileType { - FT_UNKNOWN, FT_HPP, FT_CPP + FT_UNKNOWN, FT_HPP, FT_CPP, FT_C, FT_OBJC, FT_OBJCPP, FT_RC }; Opaq() @@ -103,7 +103,7 @@ struct Opaq int currentResultIndex; }; -static void scanCppFile(void *opaq, Lexer &yylex, bool scanForFileTags) +static void scanCppFile(void *opaq, Lexer &yylex, bool scanForFileTags, bool scanForDependencies) { const QLatin1Literal includeLiteral("include"); const QLatin1Literal importLiteral("import"); @@ -120,7 +120,7 @@ static void scanCppFile(void *opaq, Lexer &yylex, bool scanForFileTags) if (tk.newline() && tk.is(T_POUND)) { yylex(&tk); - if (!scanForFileTags && !tk.newline() && tk.is(T_IDENTIFIER)) { + if (scanForDependencies && !tk.newline() && tk.is(T_IDENTIFIER)) { if ((static_cast<int>(tk.length()) >= includeLiteral.size() && (strncmp(opaque->fileContent + tk.begin(), includeLiteral.data(), includeLiteral.size()) == 0)) || (static_cast<int>(tk.length()) >= importLiteral.size() @@ -164,7 +164,7 @@ static void scanCppFile(void *opaq, Lexer &yylex, bool scanForFileTags) } } -static void *openScanner(const unsigned short *filePath, char **fileTags, int numFileTags) +static Opaq *openScanner(const unsigned short *filePath, int flags) { QScopedPointer<Opaq> opaque(new Opaq); opaque->fileName = QString::fromUtf16(filePath); @@ -200,19 +200,19 @@ static void *openScanner(const unsigned short *filePath, char **fileTags, int nu if (!vmap) return 0; - for (int i=0; i < numFileTags; ++i) { - const char *fileTag = fileTags[i]; - if (strncmp("cpp", fileTag, 3) == 0) - opaque->fileType = Opaq::FT_CPP; - else if (strncmp("hpp", fileTag, 3) == 0) - opaque->fileType = Opaq::FT_HPP; - } - opaque->fileContent = reinterpret_cast<char *>(vmap); Lexer lex(opaque->fileContent, opaque->fileContent + mapl); - const bool scanForFileTags = fileTags && numFileTags; - scanCppFile(opaque.data(), lex, scanForFileTags); - return static_cast<void *>(opaque.take()); + scanCppFile(opaque.data(), lex, flags & ScanForFileTagsFlag, flags & ScanForDependenciesFlag); + return opaque.take(); +} + +template <typename Opaq::FileType t> +static void *openScannerT(const unsigned short *filePath, int flags) +{ + Opaq *opaq = openScanner(filePath, flags); + if (opaq) + opaq->fileType = t; + return opaq; } static void closeScanner(void *ptr) @@ -264,7 +264,7 @@ ScannerPlugin hppScanner = { "include_scanner", "hpp", - openScanner, + openScannerT<Opaq::FT_HPP>, closeScanner, next, additionalFileTags, @@ -275,7 +275,7 @@ ScannerPlugin cppScanner = { "include_scanner", "cpp", - openScanner, + openScannerT<Opaq::FT_CPP>, closeScanner, next, additionalFileTags, @@ -286,7 +286,7 @@ ScannerPlugin cScanner = { "include_scanner", "c", - openScanner, + openScannerT<Opaq::FT_C>, closeScanner, next, 0, @@ -297,7 +297,7 @@ ScannerPlugin objcppScanner = { "include_scanner", "objcpp", - openScanner, + openScannerT<Opaq::FT_OBJCPP>, closeScanner, next, additionalFileTags, @@ -308,7 +308,7 @@ ScannerPlugin objcScanner = { "include_scanner", "objc", - openScanner, + openScannerT<Opaq::FT_OBJC>, closeScanner, next, additionalFileTags, @@ -319,7 +319,7 @@ ScannerPlugin rcScanner = { "include_scanner", "rc", - openScanner, + openScannerT<Opaq::FT_RC>, closeScanner, next, 0, diff --git a/src/plugins/scanner/qt/qtscanner.cpp b/src/plugins/scanner/qt/qtscanner.cpp index 0374357e1..66c473421 100644 --- a/src/plugins/scanner/qt/qtscanner.cpp +++ b/src/plugins/scanner/qt/qtscanner.cpp @@ -87,10 +87,9 @@ struct Opaq } }; -static void *openScanner(const unsigned short *filePath, char **fileTags, int numFileTags) +static void *openScanner(const unsigned short *filePath, int flags) { - Q_UNUSED(fileTags); - Q_UNUSED(numFileTags); + Q_UNUSED(flags); QScopedPointer<Opaq> opaque(new Opaq); #ifdef Q_OS_UNIX diff --git a/src/plugins/scanner/scanner.h b/src/plugins/scanner/scanner.h index e78cb87f1..c961853dc 100644 --- a/src/plugins/scanner/scanner.h +++ b/src/plugins/scanner/scanner.h @@ -37,16 +37,19 @@ extern "C" { #define SC_LOCAL_INCLUDE_FLAG 0x1 #define SC_GLOBAL_INCLUDE_FLAG 0x2 +enum OpenScannerFlags +{ + ScanForDependenciesFlag = 0x01, + ScanForFileTagsFlag = 0x02 +}; + /** * Open a file that's going to be scanned. * The file path encoding is UTF-16 on all platforms. * - * If the scanner is used for more than one type hint (e.g. C++ header / source) - * the scanner can read the parameter fileTag which file type it is going to scan. - * * Returns a scanner handle. */ -typedef void *(*scanOpen_f) (const unsigned short *filePath, char **fileTags, int numFileTags); +typedef void *(*scanOpen_f) (const unsigned short *filePath, int flags); /** * Closes the given scanner handle. |
