summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/FastPreprocessor.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2009-09-30 17:15:31 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2009-09-30 17:17:11 +0200
commit9a2114338432cfc883b29f514daa847205184833 (patch)
tree8fd96ff0d0944b55b805c13579d262d7af63e975 /src/libs/cplusplus/FastPreprocessor.cpp
parente50d60ac97bb0080ee055574eada5a51a5bb907c (diff)
downloadqt-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.cpp62
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 &macroName,
+ 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 &macro = 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)