forked from qt-creator/qt-creator
Added macro expanding events and some initial on the macro highlighting support.
This commit is contained in:
@@ -253,6 +253,25 @@ protected:
|
||||
m_currentDoc->appendMacro(macroName, macroText);
|
||||
}
|
||||
|
||||
virtual void startExpandingMacro(unsigned offset,
|
||||
const rpp::Macro ¯o,
|
||||
const QByteArray &originalText)
|
||||
{
|
||||
if (! m_currentDoc)
|
||||
return;
|
||||
|
||||
//qDebug() << "start expanding:" << macro.name << "text:" << originalText;
|
||||
m_currentDoc->addMacroUse(offset, originalText.length());
|
||||
}
|
||||
|
||||
virtual void stopExpandingMacro(unsigned offset, const rpp::Macro ¯o)
|
||||
{
|
||||
if (! m_currentDoc)
|
||||
return;
|
||||
|
||||
//qDebug() << "stop expanding:" << macro.name;
|
||||
}
|
||||
|
||||
void mergeEnvironment(Document::Ptr doc)
|
||||
{
|
||||
QSet<QString> processed;
|
||||
@@ -595,6 +614,22 @@ void CppModelManager::onDocumentUpdated(Document::Ptr doc)
|
||||
|
||||
QList<QTextEdit::ExtraSelection> selections;
|
||||
|
||||
#ifdef QTCREATOR_WITH_MACRO_HIGHLIGHTING
|
||||
// set up the format for the macros
|
||||
QTextCharFormat macroFormat;
|
||||
macroFormat.setUnderlineStyle(QTextCharFormat::SingleUnderline);
|
||||
|
||||
QTextCursor c = ed->textCursor();
|
||||
foreach (const Document::Block block, doc->macroUses()) {
|
||||
QTextEdit::ExtraSelection sel;
|
||||
sel.cursor = c;
|
||||
sel.cursor.setPosition(block.begin());
|
||||
sel.cursor.setPosition(block.end(), QTextCursor::KeepAnchor);
|
||||
sel.format = macroFormat;
|
||||
selections.append(sel);
|
||||
}
|
||||
#endif // QTCREATOR_WITH_MACRO_HIGHLIGHTING
|
||||
|
||||
// set up the format for the errors
|
||||
QTextCharFormat errorFormat;
|
||||
errorFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline);
|
||||
|
||||
@@ -40,6 +40,8 @@
|
||||
|
||||
namespace rpp {
|
||||
|
||||
class Macro;
|
||||
|
||||
class Client
|
||||
{
|
||||
Client(const Client &other);
|
||||
@@ -61,6 +63,13 @@ public:
|
||||
virtual void macroAdded(const QByteArray ¯oId, const QByteArray &text) = 0;
|
||||
virtual void sourceNeeded(QString &fileName, IncludeType mode) = 0; // ### FIX the signature.
|
||||
|
||||
virtual void startExpandingMacro(unsigned offset,
|
||||
const Macro ¯o,
|
||||
const QByteArray &originalTextt) = 0;
|
||||
|
||||
virtual void stopExpandingMacro(unsigned offset,
|
||||
const Macro ¯o) = 0;
|
||||
|
||||
virtual void startSkippingBlocks(unsigned offset) = 0;
|
||||
virtual void stopSkippingBlocks(unsigned offset) = 0;
|
||||
};
|
||||
|
||||
@@ -575,7 +575,17 @@ void pp::operator()(const QByteArray &source, QByteArray *result)
|
||||
|
||||
const QByteArray spell = tokenSpell(*identifierToken);
|
||||
if (env.isBuiltinMacro(spell)) {
|
||||
const Macro trivial;
|
||||
|
||||
if (client)
|
||||
client->startExpandingMacro(identifierToken->offset,
|
||||
trivial, spell);
|
||||
|
||||
expand(spell.constBegin(), spell.constEnd(), result);
|
||||
|
||||
if (client)
|
||||
client->stopExpandingMacro(_dot->offset, trivial);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -585,10 +595,19 @@ void pp::operator()(const QByteArray &source, QByteArray *result)
|
||||
} else {
|
||||
if (! m->function_like) {
|
||||
if (_dot->isNot(T_LPAREN)) {
|
||||
if (client)
|
||||
client->startExpandingMacro(identifierToken->offset,
|
||||
*m, spell);
|
||||
|
||||
m->hidden = true;
|
||||
|
||||
expand(m->definition.constBegin(),
|
||||
m->definition.constEnd(),
|
||||
result);
|
||||
|
||||
if (client)
|
||||
client->stopExpandingMacro(_dot->offset, *m);
|
||||
|
||||
m->hidden = false;
|
||||
continue;
|
||||
} else {
|
||||
@@ -640,9 +659,20 @@ void pp::operator()(const QByteArray &source, QByteArray *result)
|
||||
const char *beginOfText = startOfToken(*identifierToken);
|
||||
const char *endOfText = endOfToken(*_dot);
|
||||
++_dot; // skip T_RPAREN
|
||||
//m->hidden = true;
|
||||
|
||||
if (client) {
|
||||
const QByteArray text =
|
||||
QByteArray::fromRawData(beginOfText,
|
||||
endOfText - beginOfText);
|
||||
|
||||
client->startExpandingMacro(identifierToken->offset,
|
||||
*m, text);
|
||||
}
|
||||
|
||||
expand(beginOfText, endOfText, result);
|
||||
//m->hidden = false;
|
||||
|
||||
if (client)
|
||||
client->stopExpandingMacro(_dot->offset, *m);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user