From 310d50fd0760eed3558d56709b49dca9ffc74530 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <qtc-committer@nokia.com> Date: Mon, 8 Dec 2008 12:59:33 +0100 Subject: [PATCH] Use Macros. --- src/libs/cplusplus/CppDocument.cpp | 19 +-------- src/libs/cplusplus/CppDocument.h | 15 +++++--- src/libs/cplusplus/pp-cctype.h | 10 +++-- src/libs/cplusplus/pp-client.h | 6 ++- src/libs/cplusplus/pp-engine.cpp | 21 +++------- src/libs/cplusplus/pp-engine.h | 2 +- src/libs/cplusplus/pp-environment.cpp | 4 +- src/libs/cplusplus/pp-environment.h | 8 ++-- src/libs/cplusplus/pp-macro.h | 45 +++++++++++----------- src/plugins/cpptools/cppcodecompletion.cpp | 4 +- src/plugins/cpptools/cppmodelmanager.cpp | 20 +++++----- 11 files changed, 69 insertions(+), 85 deletions(-) diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 3a280416d9b..45ad1f569a5 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -138,19 +138,9 @@ void Document::addIncludeFile(const QString &fileName) _includedFiles.append(fileName); } -QByteArray Document::definedMacros() const +void Document::appendMacro(const Macro ¯o) { - return _definedMacros; -} - -void Document::appendMacro(const QByteArray ¯oName, const QByteArray &text) -{ - int index = macroName.indexOf('('); - if (index == -1) - _macroNames.insert(macroName); - else - _macroNames.insert(macroName.left(index)); - _definedMacros += text; + _definedMacros.append(macro); } void Document::addMacroUse(unsigned offset, unsigned length) @@ -251,11 +241,6 @@ void Document::stopSkippingBlocks(unsigned stop) _skippedBlocks.back() = Block(start, stop); } -QSet<QByteArray> Document::macroNames() const -{ - return _macroNames; -} - bool Document::parse(ParseMode mode) { TranslationUnit::ParseMode m = TranslationUnit::ParseTranlationUnit; diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h index e952913a07b..d289c579e9c 100644 --- a/src/libs/cplusplus/CppDocument.h +++ b/src/libs/cplusplus/CppDocument.h @@ -36,6 +36,8 @@ #include <CPlusPlusForwardDeclarations.h> +#include "pp-macro.h" + #include <QByteArray> #include <QList> #include <QSet> @@ -45,6 +47,8 @@ namespace CPlusPlus { +class Macro; + class CPLUSPLUS_EXPORT Document { Document(const Document &other); @@ -63,10 +67,7 @@ public: QStringList includedFiles() const; void addIncludeFile(const QString &fileName); - QByteArray definedMacros() const; - QSet<QByteArray> macroNames() const; - - void appendMacro(const QByteArray ¯oName, const QByteArray &text); + void appendMacro(const Macro ¯o); void addMacroUse(unsigned offset, unsigned length); @@ -81,6 +82,9 @@ public: Scope *globalSymbols() const; // ### deprecate? Namespace *globalNamespace() const; + QList<Macro> definedMacros() const + { return _definedMacros; } + Symbol *findSymbolAt(unsigned line, unsigned column) const; void setSource(const QByteArray &source); @@ -191,8 +195,7 @@ private: TranslationUnit *_translationUnit; Namespace *_globalNamespace; QList<DiagnosticMessage> _diagnosticMessages; - QByteArray _definedMacros; - QSet<QByteArray> _macroNames; + QList<Macro> _definedMacros; QList<Block> _skippedBlocks; QList<Block> _macroUses; }; diff --git a/src/libs/cplusplus/pp-cctype.h b/src/libs/cplusplus/pp-cctype.h index bec9c25aef1..b7558ae5050 100644 --- a/src/libs/cplusplus/pp-cctype.h +++ b/src/libs/cplusplus/pp-cctype.h @@ -53,20 +53,22 @@ #ifndef PP_CCTYPE_H #define PP_CCTYPE_H +#include <CPlusPlusForwardDeclarations.h> + #include <cctype> namespace CPlusPlus { -inline bool pp_isalpha (int __ch) +inline bool CPLUSPLUS_EXPORT pp_isalpha (int __ch) { return std::isalpha ((unsigned char) __ch) != 0; } -inline bool pp_isalnum (int __ch) +inline bool CPLUSPLUS_EXPORT pp_isalnum (int __ch) { return std::isalnum ((unsigned char) __ch) != 0; } -inline bool pp_isdigit (int __ch) +inline bool CPLUSPLUS_EXPORT pp_isdigit (int __ch) { return std::isdigit ((unsigned char) __ch) != 0; } -inline bool pp_isspace (int __ch) +inline bool CPLUSPLUS_EXPORT pp_isspace (int __ch) { return std::isspace ((unsigned char) __ch) != 0; } } // namespace CPlusPlus diff --git a/src/libs/cplusplus/pp-client.h b/src/libs/cplusplus/pp-client.h index 35df6497331..2fc781f22f5 100644 --- a/src/libs/cplusplus/pp-client.h +++ b/src/libs/cplusplus/pp-client.h @@ -34,6 +34,8 @@ #ifndef PP_CLIENT_H #define PP_CLIENT_H +#include <CPlusPlusForwardDeclarations.h> + #include <QByteArray> #include <QString> #include <QFile> @@ -42,7 +44,7 @@ namespace CPlusPlus { class Macro; -class Client +class CPLUSPLUS_EXPORT Client { Client(const Client &other); void operator=(const Client &other); @@ -60,7 +62,7 @@ public: virtual ~Client() { } - virtual void macroAdded(const QByteArray ¯oId, const QByteArray &text) = 0; + virtual void macroAdded(const Macro ¯o) = 0; virtual void sourceNeeded(QString &fileName, IncludeType mode) = 0; // ### FIX the signature. virtual void startExpandingMacro(unsigned offset, diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index f2e1d4908eb..7bdc9b95d69 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -906,16 +906,8 @@ void pp::processDefine(TokenIterator firstToken, TokenIterator lastToken) env.bind(macro); - QByteArray macroText; - macroText.reserve(64); - macroText += "#define "; - - macroText += macroId; - macroText += ' '; - macroText += macro.definition; - macroText += '\n'; - - client->macroAdded(macroId, macroText); + if (client) + client->macroAdded(macro); } void pp::processIf(TokenIterator firstToken, TokenIterator lastToken) @@ -1019,13 +1011,10 @@ void pp::processUndef(TokenIterator firstToken, TokenIterator lastToken) if (tk->is(T_IDENTIFIER)) { const QByteArray macroName = tokenText(*tk); - env.remove(macroName); + const Macro *macro = env.remove(macroName); - QByteArray macroText; - macroText += "#undef "; - macroText += macroName; - macroText += '\n'; - client->macroAdded(macroName, macroText); + if (client && macro) + client->macroAdded(*macro); } } diff --git a/src/libs/cplusplus/pp-engine.h b/src/libs/cplusplus/pp-engine.h index d0729b3715b..c909ffab3a7 100644 --- a/src/libs/cplusplus/pp-engine.h +++ b/src/libs/cplusplus/pp-engine.h @@ -134,7 +134,7 @@ namespace CPlusPlus { #undef PP_DEFINE_BIN_OP }; - class pp + class CPLUSPLUS_EXPORT pp { Client *client; Environment &env; diff --git a/src/libs/cplusplus/pp-environment.cpp b/src/libs/cplusplus/pp-environment.cpp index b06d41757dd..a1ade3b189a 100644 --- a/src/libs/cplusplus/pp-environment.cpp +++ b/src/libs/cplusplus/pp-environment.cpp @@ -115,12 +115,12 @@ Macro *Environment::bind(const Macro &__macro) return m; } -void Environment::remove (const QByteArray &name) +Macro *Environment::remove (const QByteArray &name) { Macro macro; macro.name = name; macro.hidden = true; - bind(macro); + return bind(macro); } bool Environment::isBuiltinMacro(const QByteArray &s) const diff --git a/src/libs/cplusplus/pp-environment.h b/src/libs/cplusplus/pp-environment.h index e3d130871ba..e2a75d29b81 100644 --- a/src/libs/cplusplus/pp-environment.h +++ b/src/libs/cplusplus/pp-environment.h @@ -53,14 +53,16 @@ #ifndef PP_ENVIRONMENT_H #define PP_ENVIRONMENT_H +#include "CPlusPlusForwardDeclarations.h" + #include <QVector> #include <QByteArray> namespace CPlusPlus { -struct Macro; +class Macro; -class Environment +class CPLUSPLUS_EXPORT Environment { public: Environment(); @@ -70,7 +72,7 @@ public: Macro *macroAt(unsigned index) const; Macro *bind(const Macro ¯o); - void remove(const QByteArray &name); + Macro *remove(const QByteArray &name); Macro *resolve(const QByteArray &name) const; bool isBuiltinMacro(const QByteArray &name) const; diff --git a/src/libs/cplusplus/pp-macro.h b/src/libs/cplusplus/pp-macro.h index b091abd6184..494b7a4de7f 100644 --- a/src/libs/cplusplus/pp-macro.h +++ b/src/libs/cplusplus/pp-macro.h @@ -53,42 +53,43 @@ #ifndef PP_MACRO_H #define PP_MACRO_H +#include <CPlusPlusForwardDeclarations.h> + #include <QByteArray> #include <QVector> namespace CPlusPlus { - struct Macro +class CPLUSPLUS_EXPORT Macro +{ +public: + QByteArray name; + QByteArray definition; + QVector<QByteArray> formals; + QByteArray fileName; + int line; + Macro *next; + unsigned hashcode; + + union { - QByteArray name; - QByteArray definition; - QVector<QByteArray> formals; - QByteArray fileName; - int line; - int lines; - Macro *next; - unsigned hashcode; + unsigned state; - union + struct { - unsigned state; - - struct - { - unsigned hidden: 1; - unsigned function_like: 1; - unsigned variadics: 1; - }; + unsigned hidden: 1; + unsigned function_like: 1; + unsigned variadics: 1; }; + }; - inline Macro(): + inline Macro(): line(0), - lines(0), next(0), hashcode(0), state(0) - { } - }; + { } +}; } // namespace CPlusPlus diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 7568d2c8877..47ac5c57678 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -699,7 +699,9 @@ void CppCodeCompletion::addMacros(const LookupContext &context) continue; processed.insert(fn); if (Document::Ptr doc = context.document(fn)) { - macroNames += doc->macroNames(); + foreach (const Macro macro, doc->definedMacros()) { + macroNames.insert(macro.name); + } todo += doc->includedFiles(); } } diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index af885de622f..e8359da2b5b 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -31,7 +31,7 @@ ** ***************************************************************************/ -#include "pp.h" +#include <cplusplus/pp.h> #include "cppmodelmanager.h" #include "cpphoverhandler.h" @@ -129,8 +129,7 @@ protected: void mergeEnvironment(CPlusPlus::Document::Ptr doc); void mergeEnvironment(CPlusPlus::Document::Ptr doc, QSet<QString> *processed); - virtual void macroAdded(const QByteArray ¯oName, - const QByteArray ¯oText); + virtual void macroAdded(const Macro ¯o); virtual void startExpandingMacro(unsigned offset, const Macro ¯o, const QByteArray &originalText); @@ -295,12 +294,12 @@ QByteArray CppPreprocessor::tryIncludeFile(QString &fileName, IncludeType type) return QByteArray(); } -void CppPreprocessor::macroAdded(const QByteArray ¯oName, const QByteArray ¯oText) +void CppPreprocessor::macroAdded(const Macro ¯o) { if (! m_currentDoc) return; - m_currentDoc->appendMacro(macroName, macroText); + m_currentDoc->appendMacro(macro); } void CppPreprocessor::startExpandingMacro(unsigned offset, @@ -340,14 +339,13 @@ void CppPreprocessor::mergeEnvironment(Document::Ptr doc, QSet<QString> *process processed->insert(fn); - foreach (QString includedFile, doc->includedFiles()) + foreach (QString includedFile, doc->includedFiles()) { mergeEnvironment(m_documents.value(includedFile), processed); + } - const QByteArray macros = doc->definedMacros(); - QByteArray localFileName = doc->fileName().toUtf8(); - - QByteArray dummy; - m_proc(localFileName, macros, &dummy); + foreach (const Macro macro, doc->definedMacros()) { + env.bind(macro); + } } void CppPreprocessor::startSkippingBlocks(unsigned offset) -- GitLab