diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2016-12-12 13:10:33 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2016-12-19 15:07:34 +0000 |
commit | 21e82bbbe316f582ee11c8996e24e402f9342606 (patch) | |
tree | df3ac27e814e83f0cf914944bcf3f354fad64638 /src/plugins/scanner | |
parent | d3b1bf682181277e03299b1567631e144df12a67 (diff) |
Merge the C/C++ include scanners
We had one scanner for every type of file in the C family, all of which
collected the same set of includes, but under a different entry in the
scanner cache. Thus, lots of header files were unnecessarily re-scanned.
We fix this by making the scanner plugins declare a *list* of tags they
can handle and passing the currently active tags in the open() function.
========== Performance data for Rule Execution ==========
Old instruction count: 3775190973
New instruction count: 3441085735
Relative change: -9 %
Old peak memory usage: 18174216 Bytes
New peak memory usage: 17307600 Bytes
Relative change: -5 %
Change-Id: I222d1ec4bbfbc06ecd8c81faa55a500bc0da1ee6
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/plugins/scanner')
-rw-r--r-- | src/plugins/scanner/cpp/cppscanner.cpp | 131 | ||||
-rw-r--r-- | src/plugins/scanner/qt/qtscanner.cpp | 3 | ||||
-rw-r--r-- | src/plugins/scanner/scanner.h | 5 |
3 files changed, 22 insertions, 117 deletions
diff --git a/src/plugins/scanner/cpp/cppscanner.cpp b/src/plugins/scanner/cpp/cppscanner.cpp index b95abe3ad..53ce93e32 100644 --- a/src/plugins/scanner/cpp/cppscanner.cpp +++ b/src/plugins/scanner/cpp/cppscanner.cpp @@ -59,6 +59,8 @@ using namespace CPlusPlus; #include <QtCore/QString> #include <QtCore/QLatin1Literal> +#include <cstring> + struct ScanResult { char *fileName; @@ -198,11 +200,20 @@ static void scanCppFile(void *opaq, CPlusPlus::Lexer &yylex, bool scanForFileTag } } -static Opaq *openScanner(const unsigned short *filePath, Opaq::FileType fileType, int flags) +static void *openScanner(const unsigned short *filePath, const char *fileTags, int flags) { QScopedPointer<Opaq> opaque(new Opaq); opaque->fileName = QString::fromUtf16(filePath); - opaque->fileType = fileType; + const QList<QByteArray> &tagList = QByteArray::fromRawData(fileTags, + std::strlen(fileTags)).split(','); + if (tagList.contains("hpp")) + opaque->fileType = Opaq::FT_HPP; + else if (tagList.contains("cpp")) + opaque->fileType = Opaq::FT_CPP; + else if (tagList.contains("objcpp")) + opaque->fileType = Opaq::FT_OBJCPP; + else + opaque->fileType = Opaq::FT_UNKNOWN; size_t mapl = 0; #ifdef Q_OS_UNIX @@ -241,12 +252,6 @@ static Opaq *openScanner(const unsigned short *filePath, Opaq::FileType fileType return opaque.take(); } -template <typename Opaq::FileType t> -static void *openScannerT(const unsigned short *filePath, int flags) -{ - return openScanner(filePath, t, flags); -} - static void closeScanner(void *ptr) { Opaq *opaque = static_cast<Opaq *>(ptr); @@ -293,120 +298,18 @@ static const char **additionalFileTags(void *opaq, int *size) extern "C" { -ScannerPlugin hppScanner = -{ - "include_scanner", - "hpp", - openScannerT<Opaq::FT_HPP>, - closeScanner, - next, - additionalFileTags, - ScannerUsesCppIncludePaths | ScannerRecursiveDependencies -}; - -ScannerPlugin cppScanner = -{ - "include_scanner", - "cpp", - openScannerT<Opaq::FT_CPP>, - closeScanner, - next, - additionalFileTags, - ScannerUsesCppIncludePaths | ScannerRecursiveDependencies -}; - -ScannerPlugin pchCppScanner = +ScannerPlugin includeScanner = { "include_scanner", - "cpp_pch_src", - openScannerT<Opaq::FT_HPP>, + "hpp,cpp,cpp_pch_src,c,c_pch_src,objcpp,objcpp_pch_src,objc,objc_pch_src", + openScanner, closeScanner, next, additionalFileTags, ScannerUsesCppIncludePaths | ScannerRecursiveDependencies }; -ScannerPlugin cScanner = -{ - "include_scanner", - "c", - openScannerT<Opaq::FT_C>, - closeScanner, - next, - 0, - ScannerUsesCppIncludePaths | ScannerRecursiveDependencies -}; - -ScannerPlugin pchCScanner = -{ - "include_scanner", - "c_pch_src", - openScannerT<Opaq::FT_HPP>, - closeScanner, - next, - additionalFileTags, - ScannerUsesCppIncludePaths | ScannerRecursiveDependencies -}; - -ScannerPlugin objcppScanner = -{ - "include_scanner", - "objcpp", - openScannerT<Opaq::FT_OBJCPP>, - closeScanner, - next, - additionalFileTags, - ScannerUsesCppIncludePaths | ScannerRecursiveDependencies -}; - -ScannerPlugin pchObjcppScanner = -{ - "include_scanner", - "objcpp_pch_src", - openScannerT<Opaq::FT_HPP>, - closeScanner, - next, - additionalFileTags, - ScannerUsesCppIncludePaths | ScannerRecursiveDependencies -}; - -ScannerPlugin objcScanner = -{ - "include_scanner", - "objc", - openScannerT<Opaq::FT_OBJC>, - closeScanner, - next, - additionalFileTags, - ScannerUsesCppIncludePaths | ScannerRecursiveDependencies -}; - -ScannerPlugin pchObjcScanner = -{ - "include_scanner", - "objc_pch_src", - openScannerT<Opaq::FT_HPP>, - closeScanner, - next, - additionalFileTags, - ScannerUsesCppIncludePaths | ScannerRecursiveDependencies -}; - -ScannerPlugin rcScanner = -{ - "include_scanner", - "rc", - openScannerT<Opaq::FT_RC>, - closeScanner, - next, - 0, - ScannerUsesCppIncludePaths | ScannerRecursiveDependencies -}; - -ScannerPlugin *cppScanners[] = { - &hppScanner, &pchCppScanner, &pchCScanner, &pchObjcppScanner, &pchObjcScanner, - &cppScanner, &cScanner, &objcppScanner, &objcScanner, &rcScanner, NULL -}; +ScannerPlugin *cppScanners[] = { &includeScanner, NULL }; #ifndef QBS_STATIC_LIB CPPSCANNER_EXPORT ScannerPlugin **getScanners() diff --git a/src/plugins/scanner/qt/qtscanner.cpp b/src/plugins/scanner/qt/qtscanner.cpp index 4cd77b8af..0374fc373 100644 --- a/src/plugins/scanner/qt/qtscanner.cpp +++ b/src/plugins/scanner/qt/qtscanner.cpp @@ -97,9 +97,10 @@ struct OpaqQrc } }; -static void *openScannerQrc(const unsigned short *filePath, int flags) +static void *openScannerQrc(const unsigned short *filePath, const char *fileTags, int flags) { Q_UNUSED(flags); + Q_UNUSED(fileTags); QScopedPointer<OpaqQrc> opaque(new OpaqQrc); #ifdef Q_OS_UNIX diff --git a/src/plugins/scanner/scanner.h b/src/plugins/scanner/scanner.h index f97ebf81b..7843ceec5 100644 --- a/src/plugins/scanner/scanner.h +++ b/src/plugins/scanner/scanner.h @@ -56,10 +56,11 @@ enum OpenScannerFlags /** * Open a file that's going to be scanned. * The file path encoding is UTF-16 on all platforms. + * The file tags are in CSV format. * * Returns a scanner handle. */ -typedef void *(*scanOpen_f) (const unsigned short *filePath, int flags); +typedef void *(*scanOpen_f) (const unsigned short *filePath, const char *fileTags, int flags); /** * Closes the given scanner handle. @@ -91,7 +92,7 @@ class ScannerPlugin { public: const char *name; - const char *fileTag; + const char *fileTags; // CSV scanOpen_f open; scanClose_f close; scanNext_f next; |