Try harder to get context help in presence of diagnostics

- even if there are diagnostics still try to retrieve symbol info
  and help
- fall back to text based keyword extraction in case code model
  info fails
- if both a code model tool tip (e.g. function signature or type)
  and help are available, show both

Task-number: QTCREATORBUG-15959
Change-Id: Id85a223c24849ead1b25d63776d64a7da1cc73ef
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
Eike Ziller
2018-01-25 15:51:36 +01:00
parent 2d8bc0e509
commit 6c10d36f87
5 changed files with 106 additions and 58 deletions

View File

@@ -30,6 +30,7 @@
#include <coreplugin/helpmanager.h>
#include <texteditor/texteditor.h>
#include <utils/optional.h>
#include <utils/textutils.h>
#include <utils/executeondestruction.h>
@@ -78,47 +79,31 @@ void CppHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos, Rep
CppElementEvaluator evaluator(editorWidget);
evaluator.setTextCursor(tc);
evaluator.execute();
QString tip;
if (evaluator.hasDiagnosis()) {
setToolTip(evaluator.diagnosis());
tip += evaluator.diagnosis();
setPriority(Priority_Diagnostic);
} else if (evaluator.identifiedCppElement()) {
}
if (evaluator.identifiedCppElement()) {
const QSharedPointer<CppElement> &cppElement = evaluator.cppElement();
if (priority() != Priority_Diagnostic) {
setToolTip(cppElement->tooltip);
setPriority(cppElement->tooltip.isEmpty() ? Priority_None : Priority_Tooltip);
}
QStringList candidates = cppElement->helpIdCandidates;
candidates.removeDuplicates();
Utils::optional<HelpItem> helpItem;
foreach (const QString &helpId, candidates) {
if (helpId.isEmpty())
continue;
const QMap<QString, QUrl> helpLinks = HelpManager::linksForIdentifier(helpId);
if (!helpLinks.isEmpty()) {
setLastHelpItemIdentified(HelpItem(helpId,
cppElement->helpMark,
cppElement->helpCategory,
helpLinks));
helpItem.emplace(helpId, cppElement->helpMark, cppElement->helpCategory, helpLinks);
break;
}
}
if (helpItem)
setLastHelpItemIdentified(helpItem.value()); // tool tip appended by decorateToolTip
else
tip += cppElement->tooltip;
}
}
void CppHoverHandler::decorateToolTip()
{
if (Qt::mightBeRichText(toolTip()))
setToolTip(toolTip().toHtmlEscaped());
if (priority() == Priority_Diagnostic)
return;
const HelpItem &help = lastHelpItemIdentified();
if (help.isValid()) {
const QString text = tooltipTextForHelpItem(help);
if (!text.isEmpty())
setToolTip(text);
}
setToolTip(tip);
}
} // namespace CppTools

View File

@@ -40,7 +40,6 @@ private:
void identifyMatch(TextEditor::TextEditorWidget *editorWidget,
int pos,
ReportPriority report) override;
void decorateToolTip() override;
};
} // namespace CppTools