From 20e36cc364d5dce2bf5c5a91e2144d8ad289f6d2 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Tue, 9 Dec 2008 15:23:47 +0100 Subject: [PATCH 1/2] tooltip for macro definitions. --- src/libs/cplusplus/CppDocument.cpp | 4 ++-- src/libs/cplusplus/CppDocument.h | 25 +++++++++++++++++---- src/libs/cplusplus/pp-engine.cpp | 9 ++++---- src/libs/cplusplus/pp-macro.h | 28 ++++++++++++++++++++++++ src/plugins/cpptools/cpphoverhandler.cpp | 25 ++++++++++++--------- src/plugins/cpptools/cppmodelmanager.cpp | 4 ++-- 6 files changed, 73 insertions(+), 22 deletions(-) diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index aac0664f7e4..3e619548a23 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -146,9 +146,9 @@ void Document::appendMacro(const Macro ¯o) _definedMacros.append(macro); } -void Document::addMacroUse(unsigned offset, unsigned length) +void Document::addMacroUse(const Macro ¯o, unsigned offset, unsigned length) { - _macroUses.append(Block(offset, offset + length)); + _macroUses.append(MacroUse(macro, offset, offset + length)); } TranslationUnit *Document::translationUnit() const diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h index d289c579e9c..aaca36c18ee 100644 --- a/src/libs/cplusplus/CppDocument.h +++ b/src/libs/cplusplus/CppDocument.h @@ -68,8 +68,7 @@ public: void addIncludeFile(const QString &fileName); void appendMacro(const Macro ¯o); - - void addMacroUse(unsigned offset, unsigned length); + void addMacroUse(const Macro ¯o, unsigned offset, unsigned length); Control *control() const; TranslationUnit *translationUnit() const; @@ -177,12 +176,30 @@ public: inline unsigned end() const { return _end; } + + bool contains(unsigned pos) const + { return pos >= _begin && pos < _end; } + }; + + class MacroUse: public Block { + Macro _macro; + + public: + inline MacroUse(const Macro ¯o, + unsigned begin = 0, + unsigned end = 0) + : Block(begin, end), + _macro(macro) + { } + + const Macro ¯o() const + { return _macro; } }; QList skippedBlocks() const { return _skippedBlocks; } - QList macroUses() const + QList macroUses() const { return _macroUses; } private: @@ -197,7 +214,7 @@ private: QList _diagnosticMessages; QList _definedMacros; QList _skippedBlocks; - QList _macroUses; + QList _macroUses; }; } // end of namespace CPlusPlus diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index 7bdc9b95d69..fd618d27065 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -604,28 +604,29 @@ void pp::operator()(const QByteArray &source, QByteArray *result) m->definition.constEnd(), result); + m->hidden = false; + if (client) client->stopExpandingMacro(_dot->offset, *m); - m->hidden = false; continue; } else { QByteArray tmp; - m->hidden = true; if (client) client->startExpandingMacro(identifierToken->offset, *m, spell); + m->hidden = true; expand(m->definition.constBegin(), m->definition.constEnd(), &tmp); + m->hidden = false; + if (client) client->stopExpandingMacro(_dot->offset, *m); - m->hidden = false; - m = 0; // reset the active the macro pushState(createStateFromSource(tmp)); diff --git a/src/libs/cplusplus/pp-macro.h b/src/libs/cplusplus/pp-macro.h index 494b7a4de7f..73cdab7e3a0 100644 --- a/src/libs/cplusplus/pp-macro.h +++ b/src/libs/cplusplus/pp-macro.h @@ -57,6 +57,7 @@ #include #include +#include namespace CPlusPlus { @@ -89,6 +90,33 @@ public: hashcode(0), state(0) { } + + QString toString() const + { + QString text; + if (hidden) + text += QLatin1String("#undef "); + else + text += QLatin1String("#define "); + text += QString::fromUtf8(name.constData(), name.size()); + if (function_like) { + text += QLatin1Char('('); + bool first = true; + foreach (const QByteArray formal, formals) { + if (! first) + text += QLatin1String(", "); + else + first = false; + text += QString::fromUtf8(formal.constData(), formal.size()); + } + if (variadics) + text += QLatin1String("..."); + text += QLatin1Char(' '); + } + text += QLatin1Char(' '); + text += QString::fromUtf8(definition.constData(), definition.size()); + return text; + } }; } // namespace CPlusPlus diff --git a/src/plugins/cpptools/cpphoverhandler.cpp b/src/plugins/cpptools/cpphoverhandler.cpp index 16ed8a92150..1265ef9da7f 100644 --- a/src/plugins/cpptools/cpphoverhandler.cpp +++ b/src/plugins/cpptools/cpphoverhandler.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -51,13 +52,13 @@ #include #include -#include #include #include #include #include using namespace CppTools::Internal; +using namespace CPlusPlus; CppHoverHandler::CppHoverHandler(CppModelManager *manager, QObject *parent) : QObject(parent), m_manager(manager), m_helpEngineNeedsSetup(false) @@ -104,11 +105,9 @@ void CppHoverHandler::showToolTip(TextEditor::ITextEditor *editor, const QPoint } } -static QString buildHelpId(const CPlusPlus::FullySpecifiedType &type, - const CPlusPlus::Symbol *symbol) +static QString buildHelpId(const FullySpecifiedType &type, + const Symbol *symbol) { - using namespace CPlusPlus; - Name *name = 0; Scope *scope = 0; @@ -156,12 +155,10 @@ static QString buildHelpId(const CPlusPlus::FullySpecifiedType &type, void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, int pos) { - using namespace CPlusPlus; - m_helpId.clear(); m_toolTip.clear(); - QPlainTextEdit *edit = qobject_cast(editor->widget()); + TextEditor::BaseTextEditor *edit = qobject_cast(editor->widget()); if (!edit) return; @@ -169,8 +166,7 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in tc.setPosition(pos); const int lineNumber = tc.block().blockNumber() + 1; - - QString fileName = editor->file()->fileName(); + const QString fileName = editor->file()->fileName(); Document::Ptr doc = m_manager->document(fileName); if (doc) { foreach (Document::DiagnosticMessage m, doc->diagnosticMessages()) { @@ -179,6 +175,15 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in break; } } + + if (m_toolTip.isEmpty()) { + foreach (const Document::MacroUse use, doc->macroUses()) { + if (use.contains(pos)) { + m_toolTip = use.macro().toString(); + break; + } + } + } } if (m_toolTip.isEmpty()) { diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 71838142298..5111aa31996 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -302,14 +302,14 @@ void CppPreprocessor::macroAdded(const Macro ¯o) } void CppPreprocessor::startExpandingMacro(unsigned offset, - const Macro &, + const Macro ¯o, const QByteArray &originalText) { if (! m_currentDoc) return; //qDebug() << "start expanding:" << macro.name << "text:" << originalText; - m_currentDoc->addMacroUse(offset, originalText.length()); + m_currentDoc->addMacroUse(macro, offset, originalText.length()); } void CppPreprocessor::stopExpandingMacro(unsigned, const Macro &) From b3f0f33b39bc1505257e7fccf9a2bd58b9941db4 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Tue, 9 Dec 2008 15:42:48 +0100 Subject: [PATCH 2/2] oops! fixed a typo --- src/libs/cplusplus/pp-macro.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/cplusplus/pp-macro.h b/src/libs/cplusplus/pp-macro.h index 73cdab7e3a0..887fff53b0a 100644 --- a/src/libs/cplusplus/pp-macro.h +++ b/src/libs/cplusplus/pp-macro.h @@ -111,7 +111,7 @@ public: } if (variadics) text += QLatin1String("..."); - text += QLatin1Char(' '); + text += QLatin1Char(')'); } text += QLatin1Char(' '); text += QString::fromUtf8(definition.constData(), definition.size());