summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@qt.io>2018-01-12 12:29:43 +0100
committerNikolai Kosjar <nikolai.kosjar@qt.io>2018-01-16 15:32:15 +0000
commit76c25bcd6a97dda3921e8bc487e1c61f10938ad2 (patch)
tree7854480970b5290d9c3f225942c7780d355a2247 /src/plugins/cpptools
parent7872ddde4cbaba2c6e5f55f1d05184ba33ba326b (diff)
downloadqt-creator-76c25bcd6a97dda3921e8bc487e1c61f10938ad2.tar.gz
Clang: Provide tooltips
This includes also the query data for the help system (F1) for an identifier under cursor. Regressions (libclang changes necessary): - Function signatures do not contain default values. - Aliases are not resolved for/at: - template types - qualified name of a type Fixes/Improvements: - Resolve "auto" - On a template type, show also the template parameter. - For a typedef like typedef long long superlong; the tooltip was "long long superlong", which was confusing. Now, "long long" is shown. New: - Show first or \brief paragraph of a documentation comment. - Show size of a class at definition. - Show size of a field member in class definition. Task-number: QTCREATORBUG-11259 Change-Id: Ie1a07930d0e882015d07dc43e35bb81a685cdeb8 Reviewed-by: Marco Bubke <marco.bubke@qt.io>
Diffstat (limited to 'src/plugins/cpptools')
-rw-r--r--src/plugins/cpptools/baseeditordocumentprocessor.cpp7
-rw-r--r--src/plugins/cpptools/baseeditordocumentprocessor.h14
-rw-r--r--src/plugins/cpptools/cpphoverhandler.cpp118
-rw-r--r--src/plugins/cpptools/cpphoverhandler.h7
4 files changed, 50 insertions, 96 deletions
diff --git a/src/plugins/cpptools/baseeditordocumentprocessor.cpp b/src/plugins/cpptools/baseeditordocumentprocessor.cpp
index 5bffb51a38..20632289c6 100644
--- a/src/plugins/cpptools/baseeditordocumentprocessor.cpp
+++ b/src/plugins/cpptools/baseeditordocumentprocessor.cpp
@@ -97,6 +97,13 @@ void BaseEditorDocumentProcessor::setParserConfig(
parser()->setConfiguration(config);
}
+QFuture<ToolTipInfo> BaseEditorDocumentProcessor::toolTipInfo(const QByteArray &/*codecName*/,
+ int /*line*/,
+ int /*column*/)
+{
+ return QFuture<ToolTipInfo>();
+}
+
void BaseEditorDocumentProcessor::runParser(QFutureInterface<void> &future,
BaseEditorDocumentParser::Ptr parser,
BaseEditorDocumentParser::UpdateParams updateParams)
diff --git a/src/plugins/cpptools/baseeditordocumentprocessor.h b/src/plugins/cpptools/baseeditordocumentprocessor.h
index b3f96d466d..d799c636b2 100644
--- a/src/plugins/cpptools/baseeditordocumentprocessor.h
+++ b/src/plugins/cpptools/baseeditordocumentprocessor.h
@@ -32,6 +32,7 @@
#include "cpptools_global.h"
#include <texteditor/codeassist/assistinterface.h>
+#include <texteditor/helpitem.h>
#include <texteditor/quickfix.h>
#include <texteditor/texteditor.h>
#include <texteditor/textdocument.h>
@@ -48,6 +49,18 @@ class TextDocument;
namespace CppTools {
+// For clang code model only, move?
+struct CPPTOOLS_EXPORT ToolTipInfo {
+ QString text;
+ QString briefComment;
+
+ QStringList qDocIdCandidates;
+ QString qDocMark;
+ TextEditor::HelpItem::Category qDocCategory;
+
+ QString sizeInBytes;
+};
+
class CPPTOOLS_EXPORT BaseEditorDocumentProcessor : public QObject
{
Q_OBJECT
@@ -78,6 +91,7 @@ public:
virtual QFuture<CursorInfo> cursorInfo(const CursorInfoParams &params) = 0;
virtual QFuture<CursorInfo> requestLocalReferences(const QTextCursor &cursor) = 0;
virtual QFuture<SymbolInfo> requestFollowSymbol(int line, int column) = 0;
+ virtual QFuture<ToolTipInfo> toolTipInfo(const QByteArray &codecName, int line, int column);
public:
using HeaderErrorDiagnosticWidgetCreator = std::function<QWidget*()>;
diff --git a/src/plugins/cpptools/cpphoverhandler.cpp b/src/plugins/cpptools/cpphoverhandler.cpp
index 9b9a8edff7..1ff41b7fdc 100644
--- a/src/plugins/cpptools/cpphoverhandler.cpp
+++ b/src/plugins/cpptools/cpphoverhandler.cpp
@@ -28,78 +28,47 @@
#include "cppelementevaluator.h"
#include <coreplugin/helpmanager.h>
-#include <cpptools/baseeditordocumentprocessor.h>
-#include <cpptools/cppmodelmanager.h>
-#include <cpptools/editordocumenthandle.h>
#include <texteditor/texteditor.h>
#include <utils/textutils.h>
-#include <utils/qtcassert.h>
-#include <utils/tooltip/tooltip.h>
#include <QTextCursor>
#include <QUrl>
-#include <QVBoxLayout>
using namespace Core;
using namespace TextEditor;
-namespace {
-
-CppTools::BaseEditorDocumentProcessor *editorDocumentProcessor(TextEditorWidget *editorWidget)
-{
- const QString filePath = editorWidget->textDocument()->filePath().toString();
- auto cppModelManager = CppTools::CppModelManager::instance();
- CppTools::CppEditorDocumentHandle *editorHandle = cppModelManager->cppEditorDocument(filePath);
-
- if (editorHandle)
- return editorHandle->processor();
-
- return 0;
-}
+namespace CppTools {
-bool editorDocumentProcessorHasDiagnosticAt(TextEditorWidget *editorWidget, int pos)
+QString CppHoverHandler::tooltipTextForHelpItem(const HelpItem &helpItem)
{
- if (CppTools::BaseEditorDocumentProcessor *processor = editorDocumentProcessor(editorWidget)) {
- int line, column;
- if (Utils::Text::convertPosition(editorWidget->document(), pos, &line, &column))
- return processor->hasDiagnosticsAt(line, column);
+ // If Qt is built with a namespace, we still show the tip without it, as
+ // it is in the docs and for consistency with the doc extraction mechanism.
+ const HelpItem::Category category = helpItem.category();
+ const QString &contents = helpItem.extractContent(false);
+ if (!contents.isEmpty()) {
+ if (category == HelpItem::ClassOrNamespace)
+ return helpItem.helpId() + contents;
+ else
+ return contents;
+ } else if (category == HelpItem::Typedef ||
+ category == HelpItem::Enum ||
+ category == HelpItem::ClassOrNamespace) {
+ // This approach is a bit limited since it cannot be used for functions
+ // because the help id doesn't really help in that case.
+ QString prefix;
+ if (category == HelpItem::Typedef)
+ prefix = QLatin1String("typedef ");
+ else if (category == HelpItem::Enum)
+ prefix = QLatin1String("enum ");
+ return prefix + helpItem.helpId();
}
- return false;
-}
-
-void processWithEditorDocumentProcessor(TextEditorWidget *editorWidget,
- const QPoint &point,
- int position,
- const QString &helpId)
-{
- if (CppTools::BaseEditorDocumentProcessor *processor = editorDocumentProcessor(editorWidget)) {
- int line, column;
- if (Utils::Text::convertPosition(editorWidget->document(), position, &line, &column)) {
- auto layout = new QVBoxLayout;
- layout->setContentsMargins(0, 0, 0, 0);
- layout->setSpacing(2);
- processor->addDiagnosticToolTipToLayout(line, column, layout);
- Utils::ToolTip::show(point, layout, editorWidget, helpId);
- }
- }
+ return QString();
}
-} // anonymous namespace
-
-namespace CppTools {
-
void CppHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos)
{
- m_positionForEditorDocumentProcessor = -1;
-
- if (editorDocumentProcessorHasDiagnosticAt(editorWidget, pos)) {
- setPriority(Priority_Diagnostic);
- m_positionForEditorDocumentProcessor = pos;
- return;
- }
-
QTextCursor tc(editorWidget->document());
tc.setPosition(pos);
@@ -135,9 +104,6 @@ void CppHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos)
void CppHoverHandler::decorateToolTip()
{
- if (m_positionForEditorDocumentProcessor != -1)
- return;
-
if (Qt::mightBeRichText(toolTip()))
setToolTip(toolTip().toHtmlEscaped());
@@ -146,42 +112,10 @@ void CppHoverHandler::decorateToolTip()
const HelpItem &help = lastHelpItemIdentified();
if (help.isValid()) {
- // If Qt is built with a namespace, we still show the tip without it, as
- // it is in the docs and for consistency with the doc extraction mechanism.
- const HelpItem::Category category = help.category();
- const QString &contents = help.extractContent(false);
- if (!contents.isEmpty()) {
- if (category == HelpItem::ClassOrNamespace)
- setToolTip(help.helpId() + contents);
- else
- setToolTip(contents);
- } else if (category == HelpItem::Typedef ||
- category == HelpItem::Enum ||
- category == HelpItem::ClassOrNamespace) {
- // This approach is a bit limited since it cannot be used for functions
- // because the help id doesn't really help in that case.
- QString prefix;
- if (category == HelpItem::Typedef)
- prefix = QLatin1String("typedef ");
- else if (category == HelpItem::Enum)
- prefix = QLatin1String("enum ");
- setToolTip(prefix + help.helpId());
- }
+ const QString text = tooltipTextForHelpItem(help);
+ if (!text.isEmpty())
+ setToolTip(text);
}
}
-void CppHoverHandler::operateTooltip(TextEditor::TextEditorWidget *editorWidget,
- const QPoint &point)
-{
- if (m_positionForEditorDocumentProcessor == -1) {
- BaseHoverHandler::operateTooltip(editorWidget, point);
- return;
- }
-
- const HelpItem helpItem = lastHelpItemIdentified();
- const QString helpId = helpItem.isValid() ? helpItem.helpId() : QString();
- processWithEditorDocumentProcessor(editorWidget, point, m_positionForEditorDocumentProcessor,
- helpId);
-}
-
} // namespace CppTools
diff --git a/src/plugins/cpptools/cpphoverhandler.h b/src/plugins/cpptools/cpphoverhandler.h
index b728b970fe..edfa6901cf 100644
--- a/src/plugins/cpptools/cpphoverhandler.h
+++ b/src/plugins/cpptools/cpphoverhandler.h
@@ -33,13 +33,12 @@ namespace CppTools {
class CPPTOOLS_EXPORT CppHoverHandler : public TextEditor::BaseHoverHandler
{
+public:
+ static QString tooltipTextForHelpItem(const TextEditor::HelpItem &help);
+
private:
void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) override;
void decorateToolTip() override;
- void operateTooltip(TextEditor::TextEditorWidget *editorWidget, const QPoint &point) override;
-
-private:
- int m_positionForEditorDocumentProcessor = -1;
};
} // namespace CppTools