diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2009-03-04 14:00:56 +0100 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2009-03-04 14:36:47 +0100 |
commit | 064201ff85e94f8efb8a77538c9ecbb87ab1b0e0 (patch) | |
tree | 7786d7f9925ec7952d8022d502d7043ab6e5a663 /src/libs/cplusplus/pp-engine.cpp | |
parent | e4c0d293a692e9951e7a7b9b5979988767f36d3e (diff) | |
download | qt-creator-064201ff85e94f8efb8a77538c9ecbb87ab1b0e0.tar.gz |
Mark the generated regions of text.
Diffstat (limited to 'src/libs/cplusplus/pp-engine.cpp')
-rw-r--r-- | src/libs/cplusplus/pp-engine.cpp | 59 |
1 files changed, 55 insertions, 4 deletions
diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index d3ffabe341..107ed20b90 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -530,7 +530,8 @@ Preprocessor::Preprocessor(Client *client, Environment *env) : client(client), env(env), _expand(env), - _result(0) + _result(0), + _markGeneratedTokens(false) { resetIfLevel (); } @@ -603,12 +604,12 @@ Preprocessor::State Preprocessor::createStateFromSource(const QByteArray &source return state; } -void Preprocessor::processNewline() +void Preprocessor::processNewline(bool force) { - if (env->currentLine == _dot->lineno) + if (! force && env->currentLine == _dot->lineno) return; - if (env->currentLine > _dot->lineno) { + if (force || env->currentLine > _dot->lineno) { _result->append("\n# "); _result->append(QByteArray::number(_dot->lineno)); _result->append(' '); @@ -648,6 +649,50 @@ void Preprocessor::processSkippingBlocks(bool skippingBlocks, } } +bool Preprocessor::markGeneratedTokens(bool markGeneratedTokens, + TokenIterator dot) +{ + bool previous = _markGeneratedTokens; + _markGeneratedTokens = markGeneratedTokens; + + if (previous != _markGeneratedTokens) { + if (! dot) + dot = _dot; + + if (_markGeneratedTokens) + _result->append("\n#pragma push(gen)"); + else + _result->append("\n#pragma pop(gen)"); + + processNewline(/*force = */ true); + + const char *begin = _source.constBegin(); + const char *end = begin; + + if (markGeneratedTokens) + end += dot->begin(); + else + end += (dot - 1)->end(); + + const char *it = end - 1; + for (; it != begin - 1; --it) { + if (*it == '\n') + break; + } + ++it; + + for (; it != end; ++it) { + if (! std::isspace(*it)) + _result->append(' '); + + else + _result->append(*it); + } + } + + return previous; +} + void Preprocessor::preprocess(const QByteArray &fileName, const QByteArray &source, QByteArray *result) { @@ -846,7 +891,9 @@ Macro *Preprocessor::processObjectLikeMacro(TokenIterator identifierToken, return m; } + const bool was = markGeneratedTokens(true, identifierToken); _result->append(tmp); + (void) markGeneratedTokens(was); return 0; } @@ -859,7 +906,9 @@ void Preprocessor::expandBuiltinMacro(TokenIterator identifierToken, client->startExpandingMacro(identifierToken->offset, trivial, spell); + const bool was = markGeneratedTokens(true, identifierToken); expand(spell, _result); + (void) markGeneratedTokens(was); if (client) client->stopExpandingMacro(_dot->offset, trivial); @@ -899,7 +948,9 @@ void Preprocessor::expandFunctionLikeMacro(TokenIterator identifierToken, *m, text, actuals); } + const bool was = markGeneratedTokens(true, identifierToken); expand(beginOfText, endOfText, _result); + (void) markGeneratedTokens(was); if (client) client->stopExpandingMacro(_dot->offset, *m); |