aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/clangtools
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@qt.io>2019-11-29 09:52:02 +0100
committerCristian Adam <cristian.adam@qt.io>2020-01-13 14:33:55 +0000
commit1b4de8d769a14bfebec508b1af115d87a918c618 (patch)
treeb1decaf5b52bbaf192c3f358cbbfd7c75d1fe831 /src/plugins/clangtools
parent311779e53e2ae046df69dd02cdc844fb6209a07e (diff)
ClangTools: Add help context menu entry
...that opens the documentation page for the current diagnostic. Change-Id: I398fdc82bb118a80536acbb12420a9bac84e66c9 Reviewed-by: Cristian Adam <cristian.adam@qt.io>
Diffstat (limited to 'src/plugins/clangtools')
-rw-r--r--src/plugins/clangtools/clangtool.cpp12
-rw-r--r--src/plugins/clangtools/clangtool.h2
-rw-r--r--src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp4
-rw-r--r--src/plugins/clangtools/clangtoolsdiagnosticmodel.h3
-rw-r--r--src/plugins/clangtools/clangtoolsdiagnosticview.cpp16
-rw-r--r--src/plugins/clangtools/clangtoolsdiagnosticview.h10
-rw-r--r--src/plugins/clangtools/clangtoolsutils.cpp23
-rw-r--r--src/plugins/clangtools/clangtoolsutils.h2
-rw-r--r--src/plugins/clangtools/diagnosticconfigswidget.cpp5
9 files changed, 70 insertions, 7 deletions
diff --git a/src/plugins/clangtools/clangtool.cpp b/src/plugins/clangtools/clangtool.cpp
index 9374090a71..fc8c32e069 100644
--- a/src/plugins/clangtools/clangtool.cpp
+++ b/src/plugins/clangtools/clangtool.cpp
@@ -70,6 +70,7 @@
#include <QAction>
#include <QCheckBox>
+#include <QDesktopServices>
#include <QFileDialog>
#include <QHBoxLayout>
#include <QLabel>
@@ -420,6 +421,8 @@ ClangTool::ClangTool()
m_diagnosticView->setSortingEnabled(true);
m_diagnosticView->sortByColumn(Debugger::DetailedErrorView::DiagnosticColumn,
Qt::AscendingOrder);
+ connect(m_diagnosticView, &DiagnosticView::showHelp,
+ this, &ClangTool::help);
connect(m_diagnosticView, &DiagnosticView::showFilter,
this, &ClangTool::filter);
connect(m_diagnosticView, &DiagnosticView::clearFilter,
@@ -930,6 +933,15 @@ void ClangTool::updateForInitialState()
}
}
+void ClangTool::help()
+{
+ if (DiagnosticItem *item = diagnosticItem(m_diagnosticView->currentIndex())) {
+ const QString url = documentationUrl(item->diagnostic().name);
+ if (!url.isEmpty())
+ QDesktopServices::openUrl(url);
+ }
+}
+
void ClangTool::setFilterOptions(const OptionalFilterOptions &filterOptions)
{
m_diagnosticFilterModel->setFilterOptions(filterOptions);
diff --git a/src/plugins/clangtools/clangtool.h b/src/plugins/clangtools/clangtool.h
index 6a7940e63f..3ee72da83c 100644
--- a/src/plugins/clangtools/clangtool.h
+++ b/src/plugins/clangtools/clangtool.h
@@ -126,6 +126,8 @@ private:
void updateForCurrentState();
void updateForInitialState();
+ void help();
+
void filter();
void clearFilter();
void filterForCurrentKind();
diff --git a/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp b/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp
index 07030687d0..c7e96b382d 100644
--- a/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp
+++ b/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp
@@ -433,6 +433,8 @@ QVariant DiagnosticItem::data(int column, int role) const
}
break;
}
+ case ClangToolsDiagnosticModel::DocumentationUrlRole:
+ return documentationUrl(m_diagnostic.name);
case Qt::DisplayRole:
return QString("%1: %2").arg(lineColumnString(m_diagnostic.location),
m_diagnostic.description);
@@ -514,6 +516,8 @@ QVariant ExplainingStepItem::data(int column, int role) const
return m_step.message;
case ClangToolsDiagnosticModel::DiagnosticRole:
return QVariant::fromValue(static_cast<DiagnosticItem *>(parent())->diagnostic());
+ case ClangToolsDiagnosticModel::DocumentationUrlRole:
+ return parent()->data(column, role);
case Qt::DisplayRole: {
const QString mainFilePath = static_cast<DiagnosticItem *>(parent())->diagnostic().location.filePath;
const QString locationString
diff --git a/src/plugins/clangtools/clangtoolsdiagnosticmodel.h b/src/plugins/clangtools/clangtoolsdiagnosticmodel.h
index ecd3e21e91..b27e01b383 100644
--- a/src/plugins/clangtools/clangtoolsdiagnosticmodel.h
+++ b/src/plugins/clangtools/clangtoolsdiagnosticmodel.h
@@ -122,7 +122,8 @@ public:
enum ItemRole {
DiagnosticRole = Debugger::DetailedErrorView::FullTextRole + 1,
TextRole,
- CheckBoxEnabledRole
+ CheckBoxEnabledRole,
+ DocumentationUrlRole,
};
QSet<QString> allChecks() const;
diff --git a/src/plugins/clangtools/clangtoolsdiagnosticview.cpp b/src/plugins/clangtools/clangtoolsdiagnosticview.cpp
index 3a42ef7fe0..cf88a37c62 100644
--- a/src/plugins/clangtools/clangtoolsdiagnosticview.cpp
+++ b/src/plugins/clangtools/clangtoolsdiagnosticview.cpp
@@ -151,6 +151,14 @@ DiagnosticView::DiagnosticView(QWidget *parent)
m_separator = new QAction(this);
m_separator->setSeparator(true);
+ m_separator2 = new QAction(this);
+ m_separator2->setSeparator(true);
+
+ m_help = new QAction(tr("Web Page"), this);
+ m_help->setIcon(Utils::Icons::INFO.icon());
+ connect(m_help, &QAction::triggered,
+ this, &DiagnosticView::showHelp);
+
m_suppressAction = new QAction(tr("Suppress This Diagnostic"), this);
connect(m_suppressAction, &QAction::triggered,
this, &DiagnosticView::suppressCurrentDiagnostic);
@@ -259,17 +267,23 @@ QModelIndex DiagnosticView::getTopLevelIndex(const QModelIndex &index, Direction
QList<QAction *> DiagnosticView::customActions() const
{
const QModelIndex currentIndex = selectionModel()->currentIndex();
+
const bool isDiagnosticItem = currentIndex.parent().isValid();
+ const QString docUrl
+ = model()->data(currentIndex, ClangToolsDiagnosticModel::DocumentationUrlRole).toString();
+ m_help->setEnabled(isDiagnosticItem && !docUrl.isEmpty());
m_filterForCurrentKind->setEnabled(isDiagnosticItem);
m_filterOutCurrentKind->setEnabled(isDiagnosticItem);
m_suppressAction->setEnabled(isDiagnosticItem);
return {
+ m_help,
+ m_separator,
m_showFilter,
m_clearFilter,
m_filterForCurrentKind,
m_filterOutCurrentKind,
- m_separator,
+ m_separator2,
m_suppressAction,
};
}
diff --git a/src/plugins/clangtools/clangtoolsdiagnosticview.h b/src/plugins/clangtools/clangtoolsdiagnosticview.h
index 6e591bb376..83a440c607 100644
--- a/src/plugins/clangtools/clangtoolsdiagnosticview.h
+++ b/src/plugins/clangtools/clangtoolsdiagnosticview.h
@@ -44,6 +44,8 @@ public:
void scheduleAllFixits(bool schedule);
signals:
+ void showHelp();
+
void showFilter();
void clearFilter();
void filterForCurrentKind();
@@ -64,12 +66,18 @@ private:
QModelIndex getTopLevelIndex(const QModelIndex &index, Direction direction) const;
private:
+ QAction *m_help = nullptr;
+
QAction *m_showFilter = nullptr;
QAction *m_clearFilter = nullptr;
QAction *m_filterForCurrentKind = nullptr;
QAction *m_filterOutCurrentKind = nullptr;
- QAction *m_separator = nullptr;
+
QAction *m_suppressAction = nullptr;
+
+ QAction *m_separator = nullptr;
+ QAction *m_separator2 = nullptr;
+
DiagnosticViewStyle *m_style = nullptr;
DiagnosticViewDelegate *m_delegate = nullptr;
bool m_ignoreSetSelectedFixItsCount = false;
diff --git a/src/plugins/clangtools/clangtoolsutils.cpp b/src/plugins/clangtools/clangtoolsutils.cpp
index 333a573161..7fbcc35889 100644
--- a/src/plugins/clangtools/clangtoolsutils.cpp
+++ b/src/plugins/clangtools/clangtoolsutils.cpp
@@ -31,6 +31,7 @@
#include "clangtoolssettings.h"
#include <coreplugin/icore.h>
+#include <cpptools/cpptoolsconstants.h>
#include <cpptools/cpptoolsreuse.h>
#include <projectexplorer/projectexplorerconstants.h>
@@ -193,5 +194,27 @@ ClangDiagnosticConfigsModel diagnosticConfigsModel()
return Internal::diagnosticConfigsModel(ClangToolsSettings::instance()->diagnosticConfigs());
}
+QString documentationUrl(const QString &checkName)
+{
+ QString name = checkName;
+ const QString clangPrefix = "clang-diagnostic-";
+ if (name.startsWith(clangPrefix))
+ return {}; // No documentation for this.
+
+ QString url;
+ const QString clazyPrefix = "clazy-";
+ const QString clangStaticAnalyzerPrefix = "clang-analyzer-core.";
+ if (name.startsWith(clazyPrefix)) {
+ name = checkName.mid(clazyPrefix.length());
+ url = QString(CppTools::Constants::CLAZY_DOCUMENTATION_URL_TEMPLATE).arg(name);
+ } else if (name.startsWith(clangStaticAnalyzerPrefix)) {
+ url = CppTools::Constants::CLANG_STATIC_ANALYZER_DOCUMENTATION_URL;
+ } else {
+ url = QString(CppTools::Constants::TIDY_DOCUMENTATION_URL_TEMPLATE).arg(name);
+ }
+
+ return url;
+}
+
} // namespace Internal
} // namespace ClangTools
diff --git a/src/plugins/clangtools/clangtoolsutils.h b/src/plugins/clangtools/clangtoolsutils.h
index a9b71da3b4..751304ebc8 100644
--- a/src/plugins/clangtools/clangtoolsutils.h
+++ b/src/plugins/clangtools/clangtoolsutils.h
@@ -57,6 +57,8 @@ QString clangTidyFallbackExecutable();
QString fullPath(const QString &executable);
+QString documentationUrl(const QString &checkName);
+
CppTools::ClangDiagnosticConfigsModel diagnosticConfigsModel();
CppTools::ClangDiagnosticConfigsModel diagnosticConfigsModel(
const CppTools::ClangDiagnosticConfigs &customConfigs);
diff --git a/src/plugins/clangtools/diagnosticconfigswidget.cpp b/src/plugins/clangtools/diagnosticconfigswidget.cpp
index 986d7f9ac4..d58c4f38b8 100644
--- a/src/plugins/clangtools/diagnosticconfigswidget.cpp
+++ b/src/plugins/clangtools/diagnosticconfigswidget.cpp
@@ -46,9 +46,6 @@ using namespace CppTools;
namespace ClangTools {
namespace Internal {
-static constexpr const char CLANG_STATIC_ANALYZER_URL[]
- = "https://clang-analyzer.llvm.org/available_checks.html";
-
namespace ClangTidyPrefixTree {
class Node
@@ -346,7 +343,7 @@ private:
if (role == LinkRole || role == Qt::ToolTipRole) {
// 'clang-analyzer-' group
if (node->isDir)
- return QString::fromUtf8(CLANG_STATIC_ANALYZER_URL);
+ return CppTools::Constants::CLANG_STATIC_ANALYZER_DOCUMENTATION_URL;
return QString::fromUtf8(CppTools::Constants::TIDY_DOCUMENTATION_URL_TEMPLATE)
.arg(node->fullPath.toString());
}