summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2013-08-27 09:55:58 +0200
committerJoerg Bornemann <joerg.bornemann@digia.com>2013-08-27 15:06:15 +0200
commit33a91f7af18d8703cc63ef640d24b417a9e3cdf2 (patch)
tree28da22e6a3c6cc765e6924f495ea4045ff2c31ae /src
parenteb7287fb0263f24978e090025fb137f706f5237c (diff)
downloadqbs-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.cpp56
-rw-r--r--src/lib/buildgraph/automoc.h9
-rw-r--r--src/lib/buildgraph/inputartifactscanner.cpp2
-rw-r--r--src/plugins/scanner/cpp/cppscanner.cpp42
-rw-r--r--src/plugins/scanner/qt/qtscanner.cpp5
-rw-r--r--src/plugins/scanner/scanner.h11
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.