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