aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/clangcodemodel/clangbackendreceiver.cpp
diff options
context:
space:
mode:
authorNikolai Kosjar <[email protected]>2018-01-12 12:29:43 +0100
committerNikolai Kosjar <[email protected]>2018-01-16 15:32:15 +0000
commit76c25bcd6a97dda3921e8bc487e1c61f10938ad2 (patch)
tree7854480970b5290d9c3f225942c7780d355a2247 /src/plugins/clangcodemodel/clangbackendreceiver.cpp
parent7872ddde4cbaba2c6e5f55f1d05184ba33ba326b (diff)
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 <[email protected]>
Diffstat (limited to 'src/plugins/clangcodemodel/clangbackendreceiver.cpp')
-rw-r--r--src/plugins/clangcodemodel/clangbackendreceiver.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/plugins/clangcodemodel/clangbackendreceiver.cpp b/src/plugins/clangcodemodel/clangbackendreceiver.cpp
index 8d5ec92d00d..f2606d74cc5 100644
--- a/src/plugins/clangcodemodel/clangbackendreceiver.cpp
+++ b/src/plugins/clangcodemodel/clangbackendreceiver.cpp
@@ -128,6 +128,18 @@ QFuture<CppTools::SymbolInfo> BackendReceiver::addExpectedRequestFollowSymbolMes
return futureInterface.future();
}
+QFuture<CppTools::ToolTipInfo> BackendReceiver::addExpectedToolTipMessage(quint64 ticket)
+{
+ QTC_CHECK(!m_toolTipsTable.contains(ticket));
+
+ QFutureInterface<CppTools::ToolTipInfo> futureInterface;
+ futureInterface.reportStarted();
+
+ m_toolTipsTable.insert(ticket, futureInterface);
+
+ return futureInterface.future();
+}
+
bool BackendReceiver::isExpectingCodeCompletedMessage() const
{
return !m_assistProcessorsTable.isEmpty();
@@ -272,6 +284,72 @@ void BackendReceiver::references(const ReferencesMessage &message)
futureInterface.reportFinished();
}
+static TextEditor::HelpItem::Category toHelpItemCategory(ToolTipInfo::QdocCategory category)
+{
+ switch (category) {
+ case ToolTipInfo::Unknown:
+ return TextEditor::HelpItem::Unknown;
+ case ToolTipInfo::ClassOrNamespace:
+ return TextEditor::HelpItem::ClassOrNamespace;
+ case ToolTipInfo::Enum:
+ return TextEditor::HelpItem::Enum;
+ case ToolTipInfo::Typedef:
+ return TextEditor::HelpItem::Typedef;
+ case ToolTipInfo::Macro:
+ return TextEditor::HelpItem::Macro;
+ case ToolTipInfo::Brief:
+ return TextEditor::HelpItem::Brief;
+ case ToolTipInfo::Function:
+ return TextEditor::HelpItem::Function;
+ }
+
+ return TextEditor::HelpItem::Unknown;
+}
+
+static QStringList toStringList(const Utf8StringVector &utf8StringVector)
+{
+ QStringList list;
+ list.reserve(utf8StringVector.size());
+
+ for (const Utf8String &utf8String : utf8StringVector)
+ list << utf8String.toString();
+
+ return list;
+}
+
+static CppTools::ToolTipInfo toToolTipInfo(const ToolTipMessage &message)
+{
+ CppTools::ToolTipInfo info;
+
+ const ToolTipInfo backendInfo = message.toolTipInfo();
+
+ info.text = backendInfo.text();
+ info.briefComment = backendInfo.briefComment();
+
+ info.qDocIdCandidates = toStringList(backendInfo.qdocIdCandidates());
+ info.qDocMark = backendInfo.qdocMark();
+ info.qDocCategory = toHelpItemCategory(backendInfo.qdocCategory());
+
+ info.sizeInBytes = backendInfo.sizeInBytes();
+
+ return info;
+}
+
+void BackendReceiver::tooltip(const ToolTipMessage &message)
+{
+ qCDebugIpc() << "ToolTipMessage" << message.toolTipInfo().text();
+
+ const quint64 ticket = message.ticketNumber();
+ QFutureInterface<CppTools::ToolTipInfo> futureInterface = m_toolTipsTable.take(ticket);
+ QTC_CHECK(futureInterface != QFutureInterface<CppTools::ToolTipInfo>());
+
+ if (futureInterface.isCanceled())
+ return; // A new request was issued making this one outdated.
+
+ futureInterface.reportResult(toToolTipInfo(message));
+ futureInterface.reportFinished();
+}
+
void BackendReceiver::followSymbol(const ClangBackEnd::FollowSymbolMessage &message)
{
qCDebugIpc() << "FollowSymbolMessage with"