Keep the original encoded text around while preprocessing.

This commit is contained in:
Roberto Raggi
2009-06-15 15:38:20 +02:00
parent dbba0ff8d7
commit e2a0a4d7c5
12 changed files with 67 additions and 46 deletions

View File

@@ -356,7 +356,7 @@ void Snapshot::insert(Document::Ptr doc)
insert(doc->fileName(), doc);
}
QByteArray Snapshot::preprocessedCode(const QByteArray &source, const QString &fileName) const
QByteArray Snapshot::preprocessedCode(const QString &source, const QString &fileName) const
{
FastPreprocessor pp(*this);
return pp.run(fileName, source);

View File

@@ -272,7 +272,7 @@ public:
Snapshot();
~Snapshot();
QByteArray preprocessedCode(const QByteArray &source,
QByteArray preprocessedCode(const QString &source,
const QString &fileName) const;
Document::Ptr documentFromSource(const QByteArray &preprocessedCode,

View File

@@ -36,7 +36,7 @@ FastPreprocessor::FastPreprocessor(const Snapshot &snapshot)
_preproc(this, &_env)
{ }
QByteArray FastPreprocessor::run(QString fileName, const QByteArray &source)
QByteArray FastPreprocessor::run(QString fileName, const QString &source)
{
const QByteArray preprocessed = _preproc(fileName, source);
return preprocessed;

View File

@@ -51,7 +51,7 @@ class CPLUSPLUS_EXPORT FastPreprocessor: public Client
public:
FastPreprocessor(const Snapshot &snapshot);
QByteArray run(QString fileName, const QByteArray &source);
QByteArray run(QString fileName, const QString &source);
// CPlusPlus::Client
virtual void sourceNeeded(QString &fileName, IncludeType, unsigned)

View File

@@ -564,11 +564,21 @@ void Preprocessor::popState()
_savedStates.removeLast();
}
QByteArray Preprocessor::operator()(const QString &filename,
QByteArray Preprocessor::operator()(const QString &fileName, const QString &source)
{
const QString previousOriginalSource = _originalSource;
_originalSource = source;
const QByteArray bytes = source.toLatin1();
const QByteArray preprocessedCode = operator()(fileName, bytes);
_originalSource = previousOriginalSource;
return preprocessedCode;
}
QByteArray Preprocessor::operator()(const QString &fileName,
const QByteArray &source)
{
QByteArray preprocessed;
preprocess(filename, source, &preprocessed);
preprocess(fileName, source, &preprocessed);
return preprocessed;
}
@@ -1098,7 +1108,7 @@ void Preprocessor::processInclude(bool, TokenIterator firstToken,
const char *beginOfPath = endOfToken(*start);
const char *endOfPath = startOfToken(*tk);
QString fn = QString::fromUtf8(beginOfPath, endOfPath - beginOfPath);
QString fn = string(beginOfPath, endOfPath - beginOfPath);
client->sourceNeeded(fn, Client::IncludeGlobal, firstToken->lineno);
} else if (tk->is(T_ANGLE_STRING_LITERAL) || tk->is(T_STRING_LITERAL)) {
@@ -1111,7 +1121,7 @@ void Preprocessor::processInclude(bool, TokenIterator firstToken,
if (beginOfPath + 1 != endOfPath && ((quote == '"' && endOfPath[-1] == '"') ||
(quote == '<' && endOfPath[-1] == '>'))) {
QString fn = QString::fromUtf8(beginOfPath + 1, spell.length() - 2);
QString fn = string(beginOfPath + 1, spell.length() - 2);
client->sourceNeeded(fn, Client::IncludeLocal, firstToken->lineno);
}
}
@@ -1422,3 +1432,12 @@ bool Preprocessor::isQtReservedWord(const QByteArray &macroId) const
return true;
return false;
}
QString Preprocessor::string(const char *first, int length) const
{
if (_originalSource.isEmpty())
return QString::fromUtf8(first, length);
const int position = first - _source.constData();
return _originalSource.mid(position, length);
}

View File

@@ -50,25 +50,23 @@
#define CPLUSPLUS_PP_ENGINE_H
#include "PreprocessorClient.h"
#include "pp-macro-expander.h"
#include <Token.h>
#include <QVector>
namespace CPlusPlus {
class Token;
}
namespace CPlusPlus {
struct Value;
class Environment;
class CPLUSPLUS_EXPORT Preprocessor
{
public:
Preprocessor(Client *client, Environment *env);
QByteArray operator()(const QString &filename,
const QByteArray &source);
QByteArray operator()(const QString &filename, const QString &source);
QByteArray operator()(const QString &filename, const QByteArray &source);
void preprocess(const QString &filename,
const QByteArray &source,
@@ -169,6 +167,8 @@ private:
void out(char ch);
void out(const char *s);
QString string(const char *first, int len) const;
private:
Client *client;
Environment *env;
@@ -186,6 +186,8 @@ private:
QByteArray *_result;
bool _markGeneratedTokens;
QString _originalSource;
};
} // namespace CPlusPlus