aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/scanner
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2013-12-03 10:29:57 +0100
committerChristian Kandeler <christian.kandeler@digia.com>2013-12-03 11:39:42 +0100
commit253675be64fe7b3efdca7d895640e41750b16f73 (patch)
treed7655a274cb770b7f6693c8c6204562260801f8b /src/plugins/scanner
parent0ef833421303dcd4802412cec0a3e6b0f9d55c4c (diff)
correct equality checks in C++ scanner
Instead of checking whether an identifier starts with a literal, we're checking for the exactly matching string. Change-Id: I944e0e204b977e661f68debb3a47aad76da69363 Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
Diffstat (limited to 'src/plugins/scanner')
-rw-r--r--src/plugins/scanner/cpp/cppscanner.cpp32
1 files changed, 19 insertions, 13 deletions
diff --git a/src/plugins/scanner/cpp/cppscanner.cpp b/src/plugins/scanner/cpp/cppscanner.cpp
index c87074876..5ea4f0fb5 100644
--- a/src/plugins/scanner/cpp/cppscanner.cpp
+++ b/src/plugins/scanner/cpp/cppscanner.cpp
@@ -103,10 +103,21 @@ struct Opaq
int currentResultIndex;
};
-inline bool equals(const char *identifier, const QLatin1Literal &literal)
+class TokenComparator
{
- return strncmp(identifier, literal.data(), literal.size()) == 0;
-}
+ const char * const m_fileContent;
+public:
+ TokenComparator(const char *fileContent)
+ : m_fileContent(fileContent)
+ {
+ }
+
+ bool equals(const Token &tk, const QLatin1Literal &literal) const
+ {
+ return static_cast<int>(tk.length()) == literal.size()
+ && strncmp(m_fileContent + tk.begin(), literal.data(), literal.size()) == 0;
+ }
+};
static void scanCppFile(void *opaq, Lexer &yylex, bool scanForFileTags, bool scanForDependencies)
{
@@ -117,6 +128,7 @@ static void scanCppFile(void *opaq, Lexer &yylex, bool scanForFileTags, bool sca
const QLatin1Literal qgadgetLiteral("Q_GADGET");
const QLatin1Literal pluginMetaDataLiteral("Q_PLUGIN_METADATA");
Opaq *opaque = static_cast<Opaq *>(opaq);
+ const TokenComparator tc(opaque->fileContent);
Token tk;
Token oldTk;
ScanResult scanResult;
@@ -128,10 +140,7 @@ static void scanCppFile(void *opaq, Lexer &yylex, bool scanForFileTags, bool sca
yylex(&tk);
if (scanForDependencies && !tk.newline() && tk.is(T_IDENTIFIER)) {
- if ((static_cast<int>(tk.length()) >= includeLiteral.size()
- && equals(opaque->fileContent + tk.begin(), includeLiteral))
- || (static_cast<int>(tk.length()) >= importLiteral.size()
- && equals(opaque->fileContent + tk.begin(), importLiteral)))
+ if (tc.equals(tk, includeLiteral) || tc.equals(tk, importLiteral))
{
yylex.setScanAngleStringLiteralTokens(true);
yylex(&tk);
@@ -150,18 +159,15 @@ static void scanCppFile(void *opaq, Lexer &yylex, bool scanForFileTags, bool sca
}
} else if (tk.is(T_IDENTIFIER)) {
if (scanForFileTags) {
- if (oldTk.is(T_IDENTIFIER)
- && equals(opaque->fileContent + oldTk.begin(), defineLiteral)) {
+ if (oldTk.is(T_IDENTIFIER) && tc.equals(oldTk, defineLiteral)) {
// Someone was clever and redefined Q_OBJECT or Q_PLUGIN_METADATA.
// Example: iplugin.h in Qt Creator.
} else {
- const char *identifier = opaque->fileContent + tk.begin();
- if (equals(identifier, qobjectLiteral)
- || equals(identifier, qgadgetLiteral))
+ if (tc.equals(tk, qobjectLiteral) || tc.equals(tk, qgadgetLiteral))
{
opaque->hasQObjectMacro = true;
} else if (opaque->fileType == Opaq::FT_HPP
- && equals(identifier, pluginMetaDataLiteral))
+ && tc.equals(tk, pluginMetaDataLiteral))
{
opaque->hasPluginMetaDataMacro = true;
}