From e50d60ac97bb0080ee055574eada5a51a5bb907c Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Wed, 30 Sep 2009 16:25:20 +0200
Subject: [PATCH] Introduced MacroResolver.

---
 src/plugins/cpptools/cppfindreferences.cpp       |  1 +
 .../cplusplus/CPlusPlusForwardDeclarations.h     |  1 +
 src/shared/cplusplus/Control.cpp                 | 16 +++++++++++++++-
 src/shared/cplusplus/Control.h                   | 15 +++++++++++++++
 src/shared/cplusplus/Parser.cpp                  |  8 ++++++++
 src/shared/cplusplus/Parser.h                    |  2 ++
 6 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp
index 8489b0c9092..bbee65f767c 100644
--- a/src/plugins/cpptools/cppfindreferences.cpp
+++ b/src/plugins/cpptools/cppfindreferences.cpp
@@ -432,6 +432,7 @@ static void find_helper(QFutureInterface<Core::Utils::FileSearchResult> &future,
         Document::Ptr previousDoc = snapshot.value(fileName);
         if (previousDoc) {
             Control *control = previousDoc->control();
+            previousDoc->control();
             Identifier *id = control->findIdentifier(symbolId->chars(), symbolId->size());
             if (! id)
                 continue; // skip this document, it's not using symbolId.
diff --git a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
index 9e2380ae0ba..eaa49eb173e 100644
--- a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
+++ b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
@@ -83,6 +83,7 @@ class Semantic;
 class Control;
 class MemoryPool;
 class DiagnosticClient;
+class MacroResolver;
 
 class Identifier;
 class Literal;
diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp
index fda1c3b32b7..07e46fd1ae2 100644
--- a/src/shared/cplusplus/Control.cpp
+++ b/src/shared/cplusplus/Control.cpp
@@ -59,6 +59,12 @@
 
 CPLUSPLUS_BEGIN_NAMESPACE
 
+MacroResolver::MacroResolver()
+{ }
+
+MacroResolver::~MacroResolver()
+{ }
+
 template <typename _Iterator>
 static void delete_map_entries(_Iterator first, _Iterator last)
 {
@@ -87,7 +93,8 @@ public:
     Data(Control *control)
         : control(control),
           translationUnit(0),
-          diagnosticClient(0)
+          diagnosticClient(0),
+          macroResolver(0)
     { }
 
     ~Data()
@@ -516,6 +523,7 @@ public:
     Control *control;
     TranslationUnit *translationUnit;
     DiagnosticClient *diagnosticClient;
+    MacroResolver *macroResolver;
     LiteralTable<Identifier> identifiers;
     LiteralTable<StringLiteral> stringLiterals;
     LiteralTable<NumericLiteral> numericLiterals;
@@ -576,6 +584,12 @@ TranslationUnit *Control::switchTranslationUnit(TranslationUnit *unit)
     return previousTranslationUnit;
 }
 
+MacroResolver *Control::macroResolver() const
+{ return d->macroResolver; }
+
+void Control::setMacroResolver(MacroResolver *macroResolver)
+{ d->macroResolver = macroResolver; }
+
 DiagnosticClient *Control::diagnosticClient() const
 { return d->diagnosticClient; }
 
diff --git a/src/shared/cplusplus/Control.h b/src/shared/cplusplus/Control.h
index beb18aab4fe..323740b7422 100644
--- a/src/shared/cplusplus/Control.h
+++ b/src/shared/cplusplus/Control.h
@@ -55,6 +55,18 @@
 CPLUSPLUS_BEGIN_HEADER
 CPLUSPLUS_BEGIN_NAMESPACE
 
+class CPLUSPLUS_EXPORT MacroResolver
+{
+    MacroResolver(const MacroResolver &other);
+    void operator = (const MacroResolver &other);
+
+public:
+    MacroResolver();
+    virtual ~MacroResolver();
+
+    virtual bool isMacro(TranslationUnit *unit, unsigned tokenIndex) const = 0;
+};
+
 class CPLUSPLUS_EXPORT Control
 {
 public:
@@ -64,6 +76,9 @@ public:
     TranslationUnit *translationUnit() const;
     TranslationUnit *switchTranslationUnit(TranslationUnit *unit);
 
+    MacroResolver *macroResolver() const;
+    void setMacroResolver(MacroResolver *macroResolver);
+
     DiagnosticClient *diagnosticClient() const;
     void setDiagnosticClient(DiagnosticClient *diagnosticClient);
 
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 663ec333a41..86f805b054a 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -244,6 +244,14 @@ void Parser::match(int kind, unsigned *token)
     }
 }
 
+bool Parser::isMacro(unsigned tokenIndex) const
+{
+    if (MacroResolver *r = _control->macroResolver())
+        return r->isMacro(_translationUnit, tokenIndex);
+
+    return false;
+}
+
 bool Parser::parseClassOrNamespaceName(NameAST *&node)
 {
     if (LA() == T_IDENTIFIER) {
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index 2f274e93ab5..1bd6700f537 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -286,6 +286,8 @@ private:
     inline void rewind(unsigned cursor)
     { _tokenIndex = cursor; }
 
+    bool isMacro(unsigned tokenIndex) const;
+
 private:
     TranslationUnit *_translationUnit;
     Control *_control;
-- 
GitLab