From ae04679373510e76eb7ee470dbe7801873705bf6 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Tue, 3 Mar 2009 10:27:02 +0100 Subject: [PATCH] Introduced processNewline() and processSkippingBlocks(). --- src/libs/cplusplus/pp-engine.cpp | 86 +++++++++++++++++++++----------- src/libs/cplusplus/pp-engine.h | 4 ++ 2 files changed, 60 insertions(+), 30 deletions(-) diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index 2ddbb027a4e..dfe4a487a2a 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -526,6 +526,51 @@ Preprocessor::State Preprocessor::createStateFromSource(const QByteArray &source return state; } +void Preprocessor::processNewline() +{ + if (env.currentLine == _dot->lineno) + return; + + if (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'); + } else { + for (unsigned i = env.currentLine; i < _dot->lineno; ++i) + _result->append('\n'); + } + + env.currentLine = _dot->lineno; +} + +void Preprocessor::processSkippingBlocks(bool skippingBlocks, + TokenIterator start, TokenIterator /*end*/) +{ + if (! client) + return; + + if (skippingBlocks != _skipping[iflevel]) { + unsigned offset = start->offset; + + if (_skipping[iflevel]) { + if (_dot->newline) + ++offset; + + client->startSkippingBlocks(offset); + + } else { + if (offset) + --offset; + + client->stopSkippingBlocks(offset); + } + } +} + void Preprocessor::preprocess(const QByteArray &fileName, const QByteArray &source, QByteArray *result) { @@ -541,62 +586,43 @@ void Preprocessor::preprocess(const QByteArray &fileName, const QByteArray &sour env.currentLine = 0; while (true) { - if (env.currentLine != _dot->lineno) { - if (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'); - } else { - for (unsigned i = env.currentLine; i < _dot->lineno; ++i) - _result->append('\n'); - } - env.currentLine = _dot->lineno; - } + processNewline(); if (_dot->is(T_EOF_SYMBOL)) { break; + } else if (_dot->is(T_POUND) && (! _dot->joined && _dot->newline)) { + // handle the preprocessor directive + TokenIterator start = _dot; do { ++_dot; } while (_dot->isNot(T_EOF_SYMBOL) && (_dot->joined || ! _dot->newline)); - //qDebug() << QByteArray(first + beginPP.offset, - //tokens.last().end() - beginPP.offset); - const bool skippingBlocks = _skipping[iflevel]; processDirective(start, _dot); + processSkippingBlocks(skippingBlocks, start, _dot); - if (client && skippingBlocks != _skipping[iflevel]) { - unsigned offset = start->offset; - if (_skipping[iflevel]) { - if (_dot->newline) - ++offset; - client->startSkippingBlocks(offset); - } else { - if (offset) - --offset; - client->stopSkippingBlocks(offset); - } - } } else if (skipping()) { + // skip the current line + do { ++_dot; } while (_dot->isNot(T_EOF_SYMBOL) && (_dot->joined || ! _dot->newline)); + } else { + if (_dot->joined) _result->append("\\\n"); + else if (_dot->whitespace) _result->append(' '); if (_dot->isNot(T_IDENTIFIER)) { _result->append(tokenSpell(*_dot)); ++_dot; + } else { const TokenIterator identifierToken = _dot; ++_dot; // skip T_IDENTIFIER diff --git a/src/libs/cplusplus/pp-engine.h b/src/libs/cplusplus/pp-engine.h index ae6b10e00e9..1b51c88d347 100644 --- a/src/libs/cplusplus/pp-engine.h +++ b/src/libs/cplusplus/pp-engine.h @@ -191,6 +191,10 @@ private: QByteArray tokenSpell(const CPlusPlus::Token &token) const; QByteArray tokenText(const CPlusPlus::Token &token) const; // does a deep copy + void processNewline(); + void processSkippingBlocks(bool skippingBlocks, + TokenIterator dot, TokenIterator lastToken); + void processDirective(TokenIterator dot, TokenIterator lastToken); void processInclude(bool skipCurrentPath, TokenIterator dot, TokenIterator lastToken, -- GitLab