aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/scanner
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2016-12-12 13:10:33 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2016-12-19 15:07:34 +0000
commit21e82bbbe316f582ee11c8996e24e402f9342606 (patch)
treedf3ac27e814e83f0cf914944bcf3f354fad64638 /src/plugins/scanner
parentd3b1bf682181277e03299b1567631e144df12a67 (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.cpp131
-rw-r--r--src/plugins/scanner/qt/qtscanner.cpp3
-rw-r--r--src/plugins/scanner/scanner.h5
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;