summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/pp-engine.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2009-03-04 14:00:56 +0100
committerRoberto Raggi <roberto.raggi@nokia.com>2009-03-04 14:36:47 +0100
commit064201ff85e94f8efb8a77538c9ecbb87ab1b0e0 (patch)
tree7786d7f9925ec7952d8022d502d7043ab6e5a663 /src/libs/cplusplus/pp-engine.cpp
parente4c0d293a692e9951e7a7b9b5979988767f36d3e (diff)
downloadqt-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.cpp59
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);