diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-12-03 10:29:57 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@digia.com> | 2013-12-03 11:39:42 +0100 |
commit | 253675be64fe7b3efdca7d895640e41750b16f73 (patch) | |
tree | d7655a274cb770b7f6693c8c6204562260801f8b /src/plugins/scanner | |
parent | 0ef833421303dcd4802412cec0a3e6b0f9d55c4c (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.cpp | 32 |
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; } |