diff options
author | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2019-11-29 09:52:02 +0100 |
---|---|---|
committer | Cristian Adam <cristian.adam@qt.io> | 2020-01-13 14:33:55 +0000 |
commit | 1b4de8d769a14bfebec508b1af115d87a918c618 (patch) | |
tree | b1decaf5b52bbaf192c3f358cbbfd7c75d1fe831 /src/plugins/clangtools | |
parent | 311779e53e2ae046df69dd02cdc844fb6209a07e (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.cpp | 12 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtool.h | 2 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp | 4 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolsdiagnosticmodel.h | 3 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolsdiagnosticview.cpp | 16 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolsdiagnosticview.h | 10 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolsutils.cpp | 23 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolsutils.h | 2 | ||||
-rw-r--r-- | src/plugins/clangtools/diagnosticconfigswidget.cpp | 5 |
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()); } |