diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2009-09-30 17:15:31 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2009-09-30 17:17:11 +0200 |
commit | 9a2114338432cfc883b29f514daa847205184833 (patch) | |
tree | 8fd96ff0d0944b55b805c13579d262d7af63e975 /src/libs/cplusplus/FastPreprocessor.cpp | |
parent | e50d60ac97bb0080ee055574eada5a51a5bb907c (diff) | |
download | qt-creator-9a2114338432cfc883b29f514daa847205184833.tar.gz |
Implemented a simple(fast?) strategy to resolve macro references.
Diffstat (limited to 'src/libs/cplusplus/FastPreprocessor.cpp')
-rw-r--r-- | src/libs/cplusplus/FastPreprocessor.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/libs/cplusplus/FastPreprocessor.cpp b/src/libs/cplusplus/FastPreprocessor.cpp index a0ad81521e..1f5838f7a6 100644 --- a/src/libs/cplusplus/FastPreprocessor.cpp +++ b/src/libs/cplusplus/FastPreprocessor.cpp @@ -28,9 +28,71 @@ **************************************************************************/ #include "FastPreprocessor.h" +#include <Literals.h> +#include <TranslationUnit.h> using namespace CPlusPlus; +FastMacroResolver::FastMacroResolver(const Snapshot &snapshot) + : _snapshot(snapshot) +{ } + +bool FastMacroResolver::isMacro(TranslationUnit *unit, unsigned tokenIndex) const +{ + 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; +} + +bool FastMacroResolver::isMacro_helper(const QByteArray ¯oName, + const QString &fileName, + QSet<QString> *processed, + bool *done) const +{ + if (processed->contains(fileName)) + return false; + + processed->insert(fileName); + + if (Document::Ptr doc = _snapshot.value(fileName)) { + const QList<Macro> definedMacros = doc->definedMacros(); + + 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; + } + } + + foreach (const Document::Include &incl, doc->includes()) { + if (isMacro_helper(macroName, incl.fileName(), processed, done)) + return true; + else if (*done) + return false; + } + } + + return false; +} + FastPreprocessor::FastPreprocessor(const Snapshot &snapshot) : _snapshot(snapshot), _preproc(this, &_env) |