forked from qt-creator/qt-creator
C++: Use more direct approach to recognize special Qt tokens
Change-Id: I45399a196500cbc6aecedfaa94a50890914906f1 Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
This commit is contained in:
@@ -58,12 +58,7 @@ public:
|
|||||||
ByteArrayRef(const QByteArray *ref, int offset, int length)
|
ByteArrayRef(const QByteArray *ref, int offset, int length)
|
||||||
: m_start(ref->constData() + offset)
|
: m_start(ref->constData() + offset)
|
||||||
, m_length(length)
|
, m_length(length)
|
||||||
{
|
{}
|
||||||
Q_ASSERT(ref);
|
|
||||||
Q_ASSERT(offset >= 0);
|
|
||||||
Q_ASSERT(length >= 0);
|
|
||||||
Q_ASSERT(offset + length <= ref->size());
|
|
||||||
}
|
|
||||||
|
|
||||||
inline const char *start() const
|
inline const char *start() const
|
||||||
{ return m_start; }
|
{ return m_start; }
|
||||||
|
@@ -101,6 +101,63 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
typedef ScopedSwap<bool> ScopedBoolSwap;
|
typedef ScopedSwap<bool> ScopedBoolSwap;
|
||||||
|
|
||||||
|
static bool same(const char *a, const char *b, int size)
|
||||||
|
{
|
||||||
|
return strncmp(a, b, size) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool isQtReservedWord(const char *name, int size)
|
||||||
|
{
|
||||||
|
if (size < 4)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const char c = name[0];
|
||||||
|
if (c == 'Q') {
|
||||||
|
if (name[1] == '_') {
|
||||||
|
name += 2;
|
||||||
|
size -= 2;
|
||||||
|
switch (size) {
|
||||||
|
case 1:
|
||||||
|
return name[2] == 'D' || name[2] == 'Q';
|
||||||
|
case 4:
|
||||||
|
return same(name, "SLOT", size) || same(name, "EMIT", size);
|
||||||
|
case 5:
|
||||||
|
return same(name, "SLOTS", size) || same(name, "ENUMS", size)
|
||||||
|
|| same(name, "FLAGS", size);
|
||||||
|
case 6:
|
||||||
|
return same(name, "SIGNAL", size);
|
||||||
|
case 7:
|
||||||
|
return same(name, "SIGNALS", size) || same(name, "FOREACH", size);
|
||||||
|
case 8:
|
||||||
|
return same(name, "PROPERTY", size);
|
||||||
|
case 9:
|
||||||
|
return same(name, "INVOKABLE", size);
|
||||||
|
case 10:
|
||||||
|
return same(name, "INTERFACES", size);
|
||||||
|
case 16:
|
||||||
|
return same(name, "PRIVATE_PROPERTY", size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == 'S')
|
||||||
|
return (size == 6 && same(name, "SIGNAL", size)) || (size == 4 && same(name, "SLOT", size));
|
||||||
|
|
||||||
|
if (c == 's')
|
||||||
|
return (size == 7 && same(name, "signals", size)) || (size == 5 && same(name, "slots", size));
|
||||||
|
|
||||||
|
if (c == 'f')
|
||||||
|
return size == 7 && same(name, "foreach", size);
|
||||||
|
|
||||||
|
if (c == 'e')
|
||||||
|
return size == 4 && same(name, "emit", size);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
|
||||||
namespace CPlusPlus {
|
namespace CPlusPlus {
|
||||||
@@ -821,7 +878,7 @@ _Lclassify:
|
|||||||
lex(tk);
|
lex(tk);
|
||||||
} while (isContinuationToken(*tk));
|
} while (isContinuationToken(*tk));
|
||||||
goto _Lclassify;
|
goto _Lclassify;
|
||||||
} else if (tk->is(T_IDENTIFIER) && !isQtReservedWord(tk->asByteArrayRef())) {
|
} else if (tk->is(T_IDENTIFIER) && !isQtReservedWord(tk->tokenStart(), tk->length())) {
|
||||||
m_state.updateIncludeGuardState(State::IncludeGuardStateHint_OtherToken);
|
m_state.updateIncludeGuardState(State::IncludeGuardStateHint_OtherToken);
|
||||||
if (m_state.m_inCondition && tk->asByteArrayRef() == "defined") {
|
if (m_state.m_inCondition && tk->asByteArrayRef() == "defined") {
|
||||||
handleDefined(tk);
|
handleDefined(tk);
|
||||||
@@ -1669,7 +1726,7 @@ void Preprocessor::handleDefineDirective(PPToken *tk)
|
|||||||
lex(tk);
|
lex(tk);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isQtReservedWord(ByteArrayRef(¯oName))) {
|
if (isQtReservedWord(macroName.data(), macroName.size())) {
|
||||||
QByteArray macroId = macro.name();
|
QByteArray macroId = macro.name();
|
||||||
|
|
||||||
if (macro.isFunctionLike()) {
|
if (macro.isFunctionLike()) {
|
||||||
@@ -1920,53 +1977,6 @@ void Preprocessor::handleUndefDirective(PPToken *tk)
|
|||||||
#endif // NO_DEBUG
|
#endif // NO_DEBUG
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Preprocessor::isQtReservedWord(const ByteArrayRef ¯oId)
|
|
||||||
{
|
|
||||||
const int size = macroId.size();
|
|
||||||
if (size == 9 && macroId.at(0) == 'Q' && macroId == "Q_SIGNALS")
|
|
||||||
return true;
|
|
||||||
else if (size == 9 && macroId.at(0) == 'Q' && macroId == "Q_FOREACH")
|
|
||||||
return true;
|
|
||||||
else if (size == 7 && macroId.at(0) == 'Q' && macroId == "Q_SLOTS")
|
|
||||||
return true;
|
|
||||||
else if (size == 8 && macroId.at(0) == 'Q' && macroId == "Q_SIGNAL")
|
|
||||||
return true;
|
|
||||||
else if (size == 6 && macroId.at(0) == 'Q' && macroId == "Q_SLOT")
|
|
||||||
return true;
|
|
||||||
else if (size == 3 && macroId.at(0) == 'Q' && macroId == "Q_D")
|
|
||||||
return true;
|
|
||||||
else if (size == 3 && macroId.at(0) == 'Q' && macroId == "Q_Q")
|
|
||||||
return true;
|
|
||||||
else if (size == 10 && macroId.at(0) == 'Q' && macroId == "Q_PROPERTY")
|
|
||||||
return true;
|
|
||||||
else if (size == 18 && macroId.at(0) == 'Q' && macroId == "Q_PRIVATE_PROPERTY")
|
|
||||||
return true;
|
|
||||||
else if (size == 7 && macroId.at(0) == 'Q' && macroId == "Q_ENUMS")
|
|
||||||
return true;
|
|
||||||
else if (size == 7 && macroId.at(0) == 'Q' && macroId == "Q_FLAGS")
|
|
||||||
return true;
|
|
||||||
else if (size == 12 && macroId.at(0) == 'Q' && macroId == "Q_INTERFACES")
|
|
||||||
return true;
|
|
||||||
else if (size == 11 && macroId.at(0) == 'Q' && macroId == "Q_INVOKABLE")
|
|
||||||
return true;
|
|
||||||
else if (size == 6 && macroId.at(0) == 'S' && macroId == "SIGNAL")
|
|
||||||
return true;
|
|
||||||
else if (size == 4 && macroId.at(0) == 'S' && macroId == "SLOT")
|
|
||||||
return true;
|
|
||||||
else if (size == 7 && macroId.at(0) == 's' && macroId == "signals")
|
|
||||||
return true;
|
|
||||||
else if (size == 7 && macroId.at(0) == 'f' && macroId == "foreach")
|
|
||||||
return true;
|
|
||||||
else if (size == 5 && macroId.at(0) == 's' && macroId == "slots")
|
|
||||||
return true;
|
|
||||||
else if (size == 4 && macroId.at(0) == 'e' && macroId == "emit")
|
|
||||||
return true;
|
|
||||||
else if (size == 6 && macroId.at(0) == 'Q' && macroId == "Q_EMIT")
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
PPToken Preprocessor::generateToken(enum Kind kind,
|
PPToken Preprocessor::generateToken(enum Kind kind,
|
||||||
const char *content, int length,
|
const char *content, int length,
|
||||||
unsigned lineno,
|
unsigned lineno,
|
||||||
|
@@ -230,9 +230,6 @@ private:
|
|||||||
void handleEndIfDirective(PPToken *tk, const PPToken £Token);
|
void handleEndIfDirective(PPToken *tk, const PPToken £Token);
|
||||||
void handleIfDefDirective(bool checkUndefined, PPToken *tk);
|
void handleIfDefDirective(bool checkUndefined, PPToken *tk);
|
||||||
void handleUndefDirective(PPToken *tk);
|
void handleUndefDirective(PPToken *tk);
|
||||||
|
|
||||||
static bool isQtReservedWord(const ByteArrayRef &name);
|
|
||||||
|
|
||||||
void trackExpansionCycles(PPToken *tk);
|
void trackExpansionCycles(PPToken *tk);
|
||||||
|
|
||||||
QByteArray ¤tOutputBuffer() { return *m_state.m_currentExpansion; }
|
QByteArray ¤tOutputBuffer() { return *m_state.m_currentExpansion; }
|
||||||
|
Reference in New Issue
Block a user