forked from qt-creator/qt-creator
Added macro expanding events and some initial on the macro highlighting support.
This commit is contained in:
@@ -153,6 +153,11 @@ void Document::appendMacro(const QByteArray ¯oName, 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;
|
||||||
|
|||||||
@@ -68,6 +68,8 @@ public:
|
|||||||
|
|
||||||
void appendMacro(const QByteArray ¯oName, const QByteArray &text);
|
void appendMacro(const QByteArray ¯oName, 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
|
||||||
|
|||||||
@@ -253,6 +253,25 @@ protected:
|
|||||||
m_currentDoc->appendMacro(macroName, macroText);
|
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)
|
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);
|
||||||
|
|||||||
@@ -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 ¯oId, const QByteArray &text) = 0;
|
virtual void macroAdded(const QByteArray ¯oId, 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 ¯o,
|
||||||
|
const QByteArray &originalTextt) = 0;
|
||||||
|
|
||||||
|
virtual void stopExpandingMacro(unsigned offset,
|
||||||
|
const Macro ¯o) = 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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user