From caad98ec4c6418e783d5e49c84433dd474aca8f3 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Wed, 13 May 2009 15:28:11 +0200 Subject: [PATCH] Refactored a bit the preprocessor so we can use it to generate file dependencies. --- src/libs/cplusplus/pp-engine.cpp | 54 +++++++++++++++++++++----------- src/libs/cplusplus/pp-engine.h | 12 ++++--- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index cc1cd5fff95..c362c6fcf53 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -590,6 +590,24 @@ void Preprocessor::expand(const char *first, const char *last, QByteArray *resul return expand(source, result); } +void Preprocessor::out(const QByteArray &text) +{ + if (_result) + _result->append(text); +} + +void Preprocessor::out(char ch) +{ + if (_result) + _result->append(ch); +} + +void Preprocessor::out(const char *s) +{ + if (_result) + _result->append(s); +} + Preprocessor::State Preprocessor::createStateFromSource(const QByteArray &source) const { State state; @@ -611,16 +629,16 @@ void Preprocessor::processNewline(bool force) return; if (force || env->currentLine > _dot->lineno) { - _result->append("\n# "); - _result->append(QByteArray::number(_dot->lineno)); - _result->append(' '); - _result->append('"'); - _result->append(env->currentFile); - _result->append('"'); - _result->append('\n'); + out("\n# "); + out(QByteArray::number(_dot->lineno)); + out(' '); + out('"'); + out(env->currentFile); + out('"'); + out('\n'); } else { for (unsigned i = env->currentLine; i < _dot->lineno; ++i) - _result->append('\n'); + out('\n'); } env->currentLine = _dot->lineno; @@ -661,9 +679,9 @@ bool Preprocessor::markGeneratedTokens(bool markGeneratedTokens, dot = _dot; if (_markGeneratedTokens) - _result->append("\n#gen true"); + out("\n#gen true"); else - _result->append("\n#gen false"); + out("\n#gen false"); processNewline(/*force = */ true); @@ -684,10 +702,10 @@ bool Preprocessor::markGeneratedTokens(bool markGeneratedTokens, for (; it != end; ++it) { if (! std::isspace(*it)) - _result->append(' '); + out(' '); else - _result->append(*it); + out(*it); } } @@ -737,7 +755,7 @@ void Preprocessor::preprocess(const QByteArray &fileName, const QByteArray &sour } else { if (_dot->joined) - _result->append("\\\n"); + out("\\\n"); else if (_dot->whitespace) { const unsigned endOfPreviousToken = (_dot - 1)->end(); @@ -755,15 +773,15 @@ void Preprocessor::preprocess(const QByteArray &fileName, const QByteArray &sour for (; it != end; ++it) { if (std::isspace(*it)) - _result->append(*it); + out(*it); else - _result->append(' '); + out(' '); } } if (_dot->isNot(T_IDENTIFIER)) { - _result->append(tokenSpell(*_dot)); + out(tokenSpell(*_dot)); ++_dot; } else { @@ -798,7 +816,7 @@ void Preprocessor::preprocess(const QByteArray &fileName, const QByteArray &sour } // it's not a function or object-like macro. - _result->append(spell); + out(spell); } } } @@ -893,7 +911,7 @@ Macro *Preprocessor::processObjectLikeMacro(TokenIterator identifierToken, } const bool was = markGeneratedTokens(true, identifierToken); - _result->append(tmp); + out(tmp); (void) markGeneratedTokens(was); return 0; } diff --git a/src/libs/cplusplus/pp-engine.h b/src/libs/cplusplus/pp-engine.h index 3b0e0d1b226..2895e2eddf3 100644 --- a/src/libs/cplusplus/pp-engine.h +++ b/src/libs/cplusplus/pp-engine.h @@ -70,6 +70,10 @@ public: QByteArray operator()(const QByteArray &filename, const QByteArray &source); + void preprocess(const QByteArray &filename, + const QByteArray &source, + QByteArray *result); + private: enum { MAX_LEVEL = 512 }; @@ -99,10 +103,6 @@ private: bool markGeneratedTokens(bool markGeneratedTokens, TokenIterator dot = 0); - void preprocess(const QByteArray &filename, - const QByteArray &source, - QByteArray *result); - QByteArray expand(const QByteArray &source); void expand(const QByteArray &source, QByteArray *result); void expand(const char *first, const char *last, QByteArray *result); @@ -165,6 +165,10 @@ private: State createStateFromSource(const QByteArray &source) const; + void out(const QByteArray &text); + void out(char ch); + void out(const char *s); + private: Client *client; Environment *env; -- GitLab