C++: Also expand first token after macro define

It was previously beeing skipped.

Change-Id: Iadd9b03acbcf0ee0fb4db537b8597661cb93af3f
Reviewed-by: hjk <qthjk@ovi.com>
This commit is contained in:
Leandro Melo
2012-05-29 15:27:56 +02:00
committed by hjk
parent 809a4ed91a
commit d90264d6c2
2 changed files with 27 additions and 16 deletions

View File

@@ -1257,17 +1257,23 @@ void Preprocessor::handleDefineDirective(PPToken *tk)
QVector<PPToken> bodyTokens; QVector<PPToken> bodyTokens;
PPToken firstBodyToken = *tk; PPToken firstBodyToken = *tk;
while (isValidToken(*tk)) { while (isValidToken(*tk)) {
tk->f.generated = true; if (eagerExpansion) {
bodyTokens.push_back(*tk); PPToken idTk = *tk;
lex(tk);
if (eagerExpansion)
while (tk->is(T_IDENTIFIER) while (tk->is(T_IDENTIFIER)
&& (!tk->newline() || tk->joined()) && (!tk->newline() || tk->joined())
&& !isQtReservedWord(tk->asByteArrayRef()) && !isQtReservedWord(tk->asByteArrayRef())
&& handleIdentifier(tk)) { && handleIdentifier(tk)) {
lex(tk); lex(tk);
if (tk->asByteArrayRef() == macroName) {
*tk = idTk;
break;
} }
} }
}
tk->f.generated = true;
bodyTokens.push_back(*tk);
lex(tk);
}
if (isQtReservedWord(ByteArrayRef(&macroName))) { if (isQtReservedWord(ByteArrayRef(&macroName))) {
QByteArray macroId = macro.name(); QByteArray macroId = macro.name();

View File

@@ -125,7 +125,7 @@ public:
{ {
m_expandedMacros.append(QByteArray(originalText.start(), originalText.length())); m_expandedMacros.append(QByteArray(originalText.start(), originalText.length()));
m_expandedMacrosOffset.append(offset); m_expandedMacrosOffset.append(offset);
m_macroUsesLine.insert(macro.name(), m_env->currentLine); m_macroUsesLine[macro.name()].append(m_env->currentLine);
} }
virtual void stopExpandingMacro(unsigned /*offset*/, const Macro &/*macro*/) {} virtual void stopExpandingMacro(unsigned /*offset*/, const Macro &/*macro*/) {}
@@ -229,7 +229,7 @@ public:
QList<unsigned> definedMacrosLine() const QList<unsigned> definedMacrosLine() const
{ return m_definedMacrosLine; } { return m_definedMacrosLine; }
QHash<QByteArray, unsigned> macroUsesLine() const QHash<QByteArray, QList<unsigned> > macroUsesLine() const
{ return m_macroUsesLine; } { return m_macroUsesLine; }
private: private:
@@ -244,7 +244,7 @@ private:
QList<unsigned> m_expandedMacrosOffset; QList<unsigned> m_expandedMacrosOffset;
QList<QByteArray> m_definedMacros; QList<QByteArray> m_definedMacros;
QList<unsigned> m_definedMacrosLine; QList<unsigned> m_definedMacrosLine;
QHash<QByteArray, unsigned> m_macroUsesLine; QHash<QByteArray, QList<unsigned> > m_macroUsesLine;
}; };
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@@ -495,7 +495,9 @@ void tst_Preprocessor::macro_uses_lines()
"#if ENABLE(COOL)\n" "#if ENABLE(COOL)\n"
"class Cool {};\n" "class Cool {};\n"
"#endif\n" "#endif\n"
"int cool = ENABLE_COOL;\n"); "int cool = ENABLE_COOL;\n"
"#define OTHER_ENABLE(FEATURE) ENABLE(FEATURE)\n"
"#define MORE(LESS) FOO ENABLE(LESS)\n");
QByteArray output; QByteArray output;
Environment env; Environment env;
@@ -503,19 +505,22 @@ void tst_Preprocessor::macro_uses_lines()
Preprocessor preprocess(&client, &env); Preprocessor preprocess(&client, &env);
preprocess.run(QLatin1String("<stdin>"), buffer); preprocess.run(QLatin1String("<stdin>"), buffer);
QCOMPARE(client.macroUsesLine().value("FOO"), 2U); QCOMPARE(client.macroUsesLine().value("FOO"), QList<unsigned>() << 2U << 23U);
QCOMPARE(client.macroUsesLine().value("HEADER"), 5U); QCOMPARE(client.macroUsesLine().value("HEADER"), QList<unsigned>() << 5U);
QCOMPARE(client.macroUsesLine().value("DECLARE"), 9U); QCOMPARE(client.macroUsesLine().value("DECLARE"), QList<unsigned>() << 9U);
QCOMPARE(client.macroUsesLine().value("NOTHING"), 13U); QCOMPARE(client.macroUsesLine().value("NOTHING"), QList<unsigned>() << 13U);
QCOMPARE(client.macroUsesLine().value("ENABLE"), 18U); QCOMPARE(client.macroUsesLine().value("ENABLE"), QList<unsigned>() << 18U << 22U << 23U);
QCOMPARE(client.macroUsesLine().value("ENABLE_COOL"), 21U); QCOMPARE(client.macroUsesLine().value("ENABLE_COOL"), QList<unsigned>() << 21U);
QCOMPARE(client.expandedMacrosOffset(), QList<unsigned>() QCOMPARE(client.expandedMacrosOffset(), QList<unsigned>()
<< buffer.lastIndexOf("FOO") << buffer.lastIndexOf("FOO\n")
<< buffer.lastIndexOf("HEADER") << buffer.lastIndexOf("HEADER")
<< buffer.lastIndexOf("DECLARE") << buffer.lastIndexOf("DECLARE")
<< buffer.lastIndexOf("NOTHING") << buffer.lastIndexOf("NOTHING")
<< buffer.lastIndexOf("ENABLE(COOL)") << buffer.lastIndexOf("ENABLE(COOL)")
<< buffer.lastIndexOf("ENABLE_COOL")); << buffer.lastIndexOf("ENABLE_COOL")
<< buffer.lastIndexOf("ENABLE(FEATURE)")
<< buffer.lastIndexOf("FOO ")
<< buffer.lastIndexOf("ENABLE(LESS)"));
} }
void tst_Preprocessor::macro_definition_lineno() void tst_Preprocessor::macro_definition_lineno()