Added macro expanding events and some initial on the macro highlighting support.

This commit is contained in:
Roberto Raggi
2008-12-04 12:05:04 +01:00
parent 10053aa642
commit 3d3802d50f
5 changed files with 87 additions and 2 deletions
+5
View File
@@ -153,6 +153,11 @@ void Document::appendMacro(const QByteArray &macroName, const QByteArray &text)
_definedMacros += text; _definedMacros += text;
} }
void Document::addMacroUse(unsigned offset, unsigned length)
{
_macroUses.append(Block(offset, offset + length));
}
TranslationUnit *Document::translationUnit() const TranslationUnit *Document::translationUnit() const
{ {
return _translationUnit; return _translationUnit;
+6
View File
@@ -68,6 +68,8 @@ public:
void appendMacro(const QByteArray &macroName, const QByteArray &text); void appendMacro(const QByteArray &macroName, const QByteArray &text);
void addMacroUse(unsigned offset, unsigned length);
Control *control() const; Control *control() const;
TranslationUnit *translationUnit() const; TranslationUnit *translationUnit() const;
@@ -176,6 +178,9 @@ public:
QList<Block> skippedBlocks() const QList<Block> skippedBlocks() const
{ return _skippedBlocks; } { return _skippedBlocks; }
QList<Block> macroUses() const
{ return _macroUses; }
private: private:
Symbol *findSymbolAt(unsigned line, unsigned column, Scope *scope) const; Symbol *findSymbolAt(unsigned line, unsigned column, Scope *scope) const;
@@ -189,6 +194,7 @@ private:
QByteArray _definedMacros; QByteArray _definedMacros;
QSet<QByteArray> _macroNames; QSet<QByteArray> _macroNames;
QList<Block> _skippedBlocks; QList<Block> _skippedBlocks;
QList<Block> _macroUses;
}; };
} // end of namespace CPlusPlus } // end of namespace CPlusPlus
+35
View File
@@ -253,6 +253,25 @@ protected:
m_currentDoc->appendMacro(macroName, macroText); m_currentDoc->appendMacro(macroName, macroText);
} }
virtual void startExpandingMacro(unsigned offset,
const rpp::Macro &macro,
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 &macro)
{
if (! m_currentDoc)
return;
//qDebug() << "stop expanding:" << macro.name;
}
void mergeEnvironment(Document::Ptr doc) void mergeEnvironment(Document::Ptr doc)
{ {
QSet<QString> processed; QSet<QString> processed;
@@ -595,6 +614,22 @@ void CppModelManager::onDocumentUpdated(Document::Ptr doc)
QList<QTextEdit::ExtraSelection> selections; 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 // set up the format for the errors
QTextCharFormat errorFormat; QTextCharFormat errorFormat;
errorFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline); errorFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline);
+9
View File
@@ -40,6 +40,8 @@
namespace rpp { namespace rpp {
class Macro;
class Client class Client
{ {
Client(const Client &other); Client(const Client &other);
@@ -61,6 +63,13 @@ public:
virtual void macroAdded(const QByteArray &macroId, const QByteArray &text) = 0; virtual void macroAdded(const QByteArray &macroId, const QByteArray &text) = 0;
virtual void sourceNeeded(QString &fileName, IncludeType mode) = 0; // ### FIX the signature. virtual void sourceNeeded(QString &fileName, IncludeType mode) = 0; // ### FIX the signature.
virtual void startExpandingMacro(unsigned offset,
const Macro &macro,
const QByteArray &originalTextt) = 0;
virtual void stopExpandingMacro(unsigned offset,
const Macro &macro) = 0;
virtual void startSkippingBlocks(unsigned offset) = 0; virtual void startSkippingBlocks(unsigned offset) = 0;
virtual void stopSkippingBlocks(unsigned offset) = 0; virtual void stopSkippingBlocks(unsigned offset) = 0;
}; };
+32 -2
View File
@@ -575,7 +575,17 @@ void pp::operator()(const QByteArray &source, QByteArray *result)
const QByteArray spell = tokenSpell(*identifierToken); const QByteArray spell = tokenSpell(*identifierToken);
if (env.isBuiltinMacro(spell)) { if (env.isBuiltinMacro(spell)) {
const Macro trivial;
if (client)
client->startExpandingMacro(identifierToken->offset,
trivial, spell);
expand(spell.constBegin(), spell.constEnd(), result); expand(spell.constBegin(), spell.constEnd(), result);
if (client)
client->stopExpandingMacro(_dot->offset, trivial);
continue; continue;
} }
@@ -585,10 +595,19 @@ void pp::operator()(const QByteArray &source, QByteArray *result)
} else { } else {
if (! m->function_like) { if (! m->function_like) {
if (_dot->isNot(T_LPAREN)) { if (_dot->isNot(T_LPAREN)) {
if (client)
client->startExpandingMacro(identifierToken->offset,
*m, spell);
m->hidden = true; m->hidden = true;
expand(m->definition.constBegin(), expand(m->definition.constBegin(),
m->definition.constEnd(), m->definition.constEnd(),
result); result);
if (client)
client->stopExpandingMacro(_dot->offset, *m);
m->hidden = false; m->hidden = false;
continue; continue;
} else { } else {
@@ -640,9 +659,20 @@ void pp::operator()(const QByteArray &source, QByteArray *result)
const char *beginOfText = startOfToken(*identifierToken); const char *beginOfText = startOfToken(*identifierToken);
const char *endOfText = endOfToken(*_dot); const char *endOfText = endOfToken(*_dot);
++_dot; // skip T_RPAREN ++_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); expand(beginOfText, endOfText, result);
//m->hidden = false;
if (client)
client->stopExpandingMacro(_dot->offset, *m);
} }
} }
} }