summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/FastPreprocessor.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2009-09-30 18:52:19 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2009-09-30 18:52:42 +0200
commitae43149c97b8bdaabbf66a25ef0e678ed2f9c1d2 (patch)
tree9a0d186989a68df7116c63f87acd4b97704390df /src/libs/cplusplus/FastPreprocessor.cpp
parent06bba1dc780533bac37fe2a19970faf3cfb3efab (diff)
downloadqt-creator-ae43149c97b8bdaabbf66a25ef0e678ed2f9c1d2.tar.gz
Cache the macros.
Diffstat (limited to 'src/libs/cplusplus/FastPreprocessor.cpp')
-rw-r--r--src/libs/cplusplus/FastPreprocessor.cpp57
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 &macroName,
- 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 &macroName,
for (int i = definedMacros.size() - 1; i != -1; --i) {
const Macro &macro = 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)