From 2f649be1464e1ba6857f28cfb6c362f8fb0a8ca4 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Sat, 4 Jul 2009 20:54:31 +0200
Subject: [PATCH] Disable macro expansion when preprocessing in fast-mode.

---
 src/libs/cplusplus/FastPreprocessor.cpp |  4 ++--
 src/libs/cplusplus/pp-engine.cpp        | 19 +++++++++++++++++--
 src/libs/cplusplus/pp-engine.h          |  4 ++++
 3 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/src/libs/cplusplus/FastPreprocessor.cpp b/src/libs/cplusplus/FastPreprocessor.cpp
index 00b6f8eedab..087679aeeab 100644
--- a/src/libs/cplusplus/FastPreprocessor.cpp
+++ b/src/libs/cplusplus/FastPreprocessor.cpp
@@ -38,14 +38,14 @@ FastPreprocessor::FastPreprocessor(const Snapshot &snapshot)
 
 QByteArray FastPreprocessor::run(QString fileName, const QString &source)
 {
-#ifdef QTCREATOR_WITH_MERGED_ENVIRONMENT
+    _preproc.setExpandMacros(false);
+
     if (Document::Ptr doc = _snapshot.value(fileName)) {
         _merged.insert(fileName);
 
         foreach (const Document::Include &i, doc->includes())
             mergeEnvironment(i.fileName());
     }
-#endif
 
     const QByteArray preprocessed = _preproc(fileName, source);
     return preprocessed;
diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp
index c7688c986bd..370e3decb40 100644
--- a/src/libs/cplusplus/pp-engine.cpp
+++ b/src/libs/cplusplus/pp-engine.cpp
@@ -533,7 +533,8 @@ Preprocessor::Preprocessor(Client *client, Environment *env)
       env(env),
       _expand(env),
       _result(0),
-      _markGeneratedTokens(false)
+      _markGeneratedTokens(false),
+      _expandMacros(true)
 {
     resetIfLevel ();
 }
@@ -620,6 +621,16 @@ void Preprocessor::out(const char *s)
         _result->append(s);
 }
 
+bool Preprocessor::expandMacros() const
+{
+    return _expandMacros;
+}
+
+void Preprocessor::setExpandMacros(bool expandMacros)
+{
+    _expandMacros = expandMacros;
+}
+
 Preprocessor::State Preprocessor::createStateFromSource(const QByteArray &source) const
 {
     State state;
@@ -806,8 +817,12 @@ void Preprocessor::preprocess(const QString &fileName, const QByteArray &source,
                 ++_dot; // skip T_IDENTIFIER
 
                 const QByteArray spell = tokenSpell(*identifierToken);
+                if (! _expandMacros) {
+                    out(spell);
+                    continue;
+                }
 
-                if (env->isBuiltinMacro(spell))
+                else if (env->isBuiltinMacro(spell))
                     expandBuiltinMacro(identifierToken, spell);
 
                 else {
diff --git a/src/libs/cplusplus/pp-engine.h b/src/libs/cplusplus/pp-engine.h
index 1be7c9275d1..1ec8579cb83 100644
--- a/src/libs/cplusplus/pp-engine.h
+++ b/src/libs/cplusplus/pp-engine.h
@@ -72,6 +72,9 @@ public:
                     const QByteArray &source,
                     QByteArray *result);
 
+    bool expandMacros() const;
+    void setExpandMacros(bool expandMacros);
+
 private:
     enum { MAX_LEVEL = 512 };
 
@@ -188,6 +191,7 @@ private:
     bool _markGeneratedTokens;
 
     QString _originalSource;
+    bool _expandMacros;
 };
 
 } // namespace CPlusPlus
-- 
GitLab