diff options
author | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2018-05-29 14:38:57 +0200 |
---|---|---|
committer | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2018-05-31 12:43:45 +0000 |
commit | 95aa52707d16f238119657c5237eeebb6833bc78 (patch) | |
tree | 79303695cb83c488f6006bc5a65a4024d7e37eb6 | |
parent | 2defef3d6f8048dacc8072b1f23ba72d6388b5c1 (diff) | |
download | qt-creator-95aa52707d16f238119657c5237eeebb6833bc78.tar.gz |
Clang: Add links to web pages in Clang-Tidy configuration
Each Clang-Tidy check get the separate link except
clang-analyzer which has only a whole group page.
Change-Id: I0b63cce8475109812280d9d44ac2d36aaa66e03b
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
4 files changed, 72 insertions, 17 deletions
diff --git a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp index 5f254f9686..24b9506fc2 100644 --- a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp +++ b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp @@ -28,6 +28,8 @@ #include <coreplugin/editormanager/editormanager.h> +#include <cpptools/cpptoolsconstants.h> + #include <utils/qtcassert.h> #include <utils/tooltip/tooltip.h> @@ -46,14 +48,8 @@ namespace { // CLANG-UPGRADE-CHECK: Checks/update URLs. // -// For tidy, upgrade the version in the URL. Note that we cannot use the macro -// CLANG_VERSION here because it might denote a version that was not yet -// released (e.g. 6.0.1, but only 6.0.0 was released). -// -// For clazy, once it gets dedicated documentation pages for released versions, +// Once it gets dedicated documentation pages for released versions, // use them instead of pointing to master, as checks might vanish. -const char TIDY_DOCUMENTATION_URL_TEMPLATE[] - = "https://releases.llvm.org/6.0.0/tools/clang/tools/extra/docs/clang-tidy/checks/%1.html"; const char CLAZY_DOCUMENTATION_URL_TEMPLATE[] = "https://github.com/KDE/clazy/blob/master/docs/checks/README-%1.md"; @@ -283,7 +279,7 @@ private: return QString(); // Clang-Tidy - return QString::fromUtf8(TIDY_DOCUMENTATION_URL_TEMPLATE).arg(option); + return QString::fromUtf8(CppTools::Constants::TIDY_DOCUMENTATION_URL_TEMPLATE).arg(option); } static QString maybeClickableOption(const Utf8String &option) diff --git a/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp b/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp index 22b2950e5a..6b5e0d7334 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp @@ -27,6 +27,7 @@ #include "cppcodemodelsettings.h" #include "cpptools_clangtidychecks.h" +#include "cpptoolsconstants.h" #include "cpptoolsreuse.h" #include "ui_clangdiagnosticconfigswidget.h" #include "ui_clangbasechecks.h" @@ -40,6 +41,7 @@ #include <utils/utilsicons.h> #include <QDebug> +#include <QDesktopServices> #include <QDialogButtonBox> #include <QInputDialog> #include <QPushButton> @@ -47,6 +49,9 @@ namespace CppTools { +static constexpr const char CLANG_STATIC_ANALYZER_URL[] + = "https://clang-analyzer.llvm.org/available_checks.html"; + static void buildTree(ProjectExplorer::Tree *parent, ProjectExplorer::Tree *current, const Constants::TidyNode &node) @@ -64,6 +69,12 @@ static void buildTree(ProjectExplorer::Tree *parent, buildTree(current, new ProjectExplorer::Tree, nodeChild); } +static bool needsLink(ProjectExplorer::Tree *node) { + if (node->name == "clang-analyzer-") + return true; + return !node->isDir && !node->fullPath.toString().startsWith("clang-analyzer-"); +} + class TidyChecksTreeModel final : public ProjectExplorer::SelectableFilesModel { Q_OBJECT @@ -108,14 +119,45 @@ public: } } - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const final + int columnCount(const QModelIndex &/*parent*/) const override + { + return 2; + } + + QVariant data(const QModelIndex &fullIndex, int role = Qt::DisplayRole) const final { - if (!index.isValid() || role == Qt::DecorationRole) + if (!fullIndex.isValid() || role == Qt::DecorationRole) + return QVariant(); + QModelIndex index = this->index(fullIndex.row(), 0, fullIndex.parent()); + auto *node = static_cast<ProjectExplorer::Tree *>(index.internalPointer()); + + if (fullIndex.column() == 1) { + if (!needsLink(node)) + return QVariant(); + switch (role) { + case Qt::DisplayRole: + return tr("Web Page"); + case Qt::FontRole: { + QFont font = QApplication::font(); + font.setUnderline(true); + return font; + } + case Qt::ForegroundRole: + return QApplication::palette().link().color(); + case Qt::UserRole: { + // 'clang-analyzer-' group + if (node->isDir) + return QString::fromUtf8(CLANG_STATIC_ANALYZER_URL); + return QString::fromUtf8(Constants::TIDY_DOCUMENTATION_URL_TEMPLATE) + .arg(node->fullPath.toString()); + } + } return QVariant(); - if (role == Qt::DisplayRole) { - auto *node = static_cast<ProjectExplorer::Tree *>(index.internalPointer()); - return node->isDir ? (node->name + "*") : node->name; } + + if (role == Qt::DisplayRole) + return node->isDir ? (node->name + "*") : node->name; + return ProjectExplorer::SelectableFilesModel::data(index, role); } @@ -160,10 +202,7 @@ private: return false; } - if (!check.startsWith(nodeName)) - return false; - - return true; + return check.startsWith(nodeName); }); return result; } @@ -203,6 +242,15 @@ ClangDiagnosticConfigsWidget::ClangDiagnosticConfigsWidget(const Core::Id &confi this, &ClangDiagnosticConfigsWidget::onRemoveButtonClicked); connectDiagnosticOptionsChanged(); + connect(m_tidyChecks->checksPrefixesTree, &QTreeView::clicked, + [this](const QModelIndex &index) { + const QString link = m_tidyTreeModel->data(index, Qt::UserRole).toString(); + if (link.isEmpty()) + return; + + QDesktopServices::openUrl(QUrl(link)); + }); + syncWidgetsToModel(configToSelect); } @@ -599,6 +647,8 @@ void ClangDiagnosticConfigsWidget::setupTabs() m_tidyChecks->setupUi(m_tidyChecksWidget); m_tidyChecks->checksPrefixesTree->setModel(m_tidyTreeModel.get()); m_tidyChecks->checksPrefixesTree->expandToDepth(0); + m_tidyChecks->checksPrefixesTree->header()->setStretchLastSection(false); + m_tidyChecks->checksPrefixesTree->header()->setSectionResizeMode(0, QHeaderView::Stretch); connect(m_tidyChecks->plainTextEditButton, &QPushButton::clicked, this, [this]() { QDialog dialog; dialog.setWindowTitle(tr("Checks")); diff --git a/src/plugins/cpptools/clangdiagnosticconfigswidget.h b/src/plugins/cpptools/clangdiagnosticconfigswidget.h index 5307593220..39753a74c6 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigswidget.h +++ b/src/plugins/cpptools/clangdiagnosticconfigswidget.h @@ -73,6 +73,7 @@ private: void onRemoveButtonClicked(); void onClangTidyModeChanged(int index); void onClangTidyTreeChanged(); + void onClangTidyTreeItemClicked(const QModelIndex &index); void onClazyRadioButtonChanged(bool checked); void onDiagnosticOptionsEdited(); diff --git a/src/plugins/cpptools/cpptoolsconstants.h b/src/plugins/cpptools/cpptoolsconstants.h index 51ece3d025..47fcd2568d 100644 --- a/src/plugins/cpptools/cpptoolsconstants.h +++ b/src/plugins/cpptools/cpptoolsconstants.h @@ -93,5 +93,13 @@ const char LOCATOR_FILTER_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("CppTools", "C++ Cl const char SYMBOLS_FIND_FILTER_ID[] = "Symbols"; const char SYMBOLS_FIND_FILTER_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("CppTools", "C++ Symbols"); +// CLANG-UPGRADE-CHECK: Checks/update URLs. +// +// Upgrade the version in the URL. Note that we cannot use the macro +// CLANG_VERSION here because it might denote a version that was not yet +// released (e.g. 6.0.1, but only 6.0.0 was released). +constexpr const char TIDY_DOCUMENTATION_URL_TEMPLATE[] + = "https://releases.llvm.org/6.0.0/tools/clang/tools/extra/docs/clang-tidy/checks/%1.html"; + } // namespace Constants } // namespace CppTools |