diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2009-09-30 18:52:19 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2009-09-30 18:52:42 +0200 |
commit | ae43149c97b8bdaabbf66a25ef0e678ed2f9c1d2 (patch) | |
tree | 9a0d186989a68df7116c63f87acd4b97704390df /src/libs/cplusplus/FastPreprocessor.cpp | |
parent | 06bba1dc780533bac37fe2a19970faf3cfb3efab (diff) | |
download | qt-creator-ae43149c97b8bdaabbf66a25ef0e678ed2f9c1d2.tar.gz |
Cache the macros.
Diffstat (limited to 'src/libs/cplusplus/FastPreprocessor.cpp')
-rw-r--r-- | src/libs/cplusplus/FastPreprocessor.cpp | 57 |
1 files changed, 24 insertions, 33 deletions
diff --git a/src/libs/cplusplus/FastPreprocessor.cpp b/src/libs/cplusplus/FastPreprocessor.cpp index 1f5838f7a6..1b66ecac79 100644 --- a/src/libs/cplusplus/FastPreprocessor.cpp +++ b/src/libs/cplusplus/FastPreprocessor.cpp @@ -30,39 +30,40 @@ #include "FastPreprocessor.h" #include <Literals.h> #include <TranslationUnit.h> +#include <QtCore/QDebug> using namespace CPlusPlus; -FastMacroResolver::FastMacroResolver(const Snapshot &snapshot) - : _snapshot(snapshot) -{ } + TranslationUnit *_previousUnit; +FastMacroResolver::FastMacroResolver(TranslationUnit *unit, const Snapshot &snapshot) + : _unit(unit), _snapshot(snapshot) +{ + const QString fileName = QString::fromUtf8(unit->fileName(), unit->fileNameLength()); + + QSet<QString> processed; + updateCache(fileName, &processed); +} bool FastMacroResolver::isMacro(TranslationUnit *unit, unsigned tokenIndex) const { + if (unit != _unit){ + qWarning() << Q_FUNC_INFO << "unexpected translation unit:" << unit->fileName(); + return false; + } + const Token &tk = unit->tokenAt(tokenIndex); if (tk.isNot(T_IDENTIFIER)) return false; Identifier *id = tk.identifier; const QByteArray macroName = QByteArray::fromRawData(id->chars(), id->size()); - const QString fileName = QString::fromUtf8(unit->fileName(), unit->fileNameLength()); - - bool done = false; - QSet<QString> processed; - - if (isMacro_helper(macroName, fileName, &processed, &done)) - return true; - - return false; + return _cachedMacros.contains(macroName); } -bool FastMacroResolver::isMacro_helper(const QByteArray ¯oName, - const QString &fileName, - QSet<QString> *processed, - bool *done) const +void FastMacroResolver::updateCache(const QString &fileName, QSet<QString> *processed) { if (processed->contains(fileName)) - return false; + return; processed->insert(fileName); @@ -72,25 +73,15 @@ bool FastMacroResolver::isMacro_helper(const QByteArray ¯oName, for (int i = definedMacros.size() - 1; i != -1; --i) { const Macro ¯o = definedMacros.at(i); - if (macro.name() == macroName) { // ### handle line numbers. - if (macro.isHidden()) { - *done = true; - return false; - } - - return true; - } + if (macro.isHidden()) + _cachedMacros.remove(macro.name()); + else + _cachedMacros.insert(macro.name()); } - foreach (const Document::Include &incl, doc->includes()) { - if (isMacro_helper(macroName, incl.fileName(), processed, done)) - return true; - else if (*done) - return false; - } + foreach (const Document::Include &incl, doc->includes()) + updateCache(incl.fileName(), processed); } - - return false; } FastPreprocessor::FastPreprocessor(const Snapshot &snapshot) |