aboutsummaryrefslogtreecommitdiffstats
path: root/src/datasources/kitsource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/datasources/kitsource.cpp')
-rw-r--r--src/datasources/kitsource.cpp192
1 files changed, 192 insertions, 0 deletions
diff --git a/src/datasources/kitsource.cpp b/src/datasources/kitsource.cpp
new file mode 100644
index 0000000..9458853
--- /dev/null
+++ b/src/datasources/kitsource.cpp
@@ -0,0 +1,192 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of UsageStatistic plugin for Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+#include "kitsource.h"
+
+#include <QtCore/QSettings>
+
+#include <projectexplorer/kitinformation.h>
+#include <projectexplorer/kitmanager.h>
+#include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/gcctoolchain.h>
+#include <qtsupport/qtkitinformation.h>
+#include <debugger/debuggerkitinformation.h>
+#include <debugger/debuggeritem.h>
+
+#include "common/scopedsettingsgroupsetter.h"
+
+namespace UsageStatistic {
+namespace Internal {
+
+using namespace KUserFeedback;
+using namespace ProjectExplorer;
+
+KitSource::KitSource()
+ : AbstractDataSource(QStringLiteral("kits"), Provider::DetailedUsageStatistics)
+{
+}
+
+KitSource::~KitSource() = default;
+
+QString KitSource::name() const
+{
+ return tr("Kits");
+}
+
+QString KitSource::description() const
+{
+ return tr("Kits usage statistics: compilers, debuggers, target architecture, and so on.");
+}
+
+static QString kitsInfoKey() { return QStringLiteral("kitsInfo"); }
+
+static QString extractToolChainVersion(const ToolChain &toolChain)
+{
+ try {
+ return dynamic_cast<const GccToolChain &>(toolChain).version();
+ } catch (...) {
+ return {};
+ }
+}
+
+class KitInfo
+{
+public:
+ KitInfo &withQtVersionInfo()
+ {
+ static const QString qtKey = QStringLiteral("qt");
+ static const QString qtQmlDebuggingSupportKey = QStringLiteral("qmlDebugging");
+ static const QString qtQmlCompilerSupportKey = QStringLiteral("qmlCompiler");
+ static const QString qtAbisKey = QStringLiteral("abis");
+
+ if (auto qtVersion = QtSupport::QtKitAspect::qtVersion(&m_kit)) {
+ QVariantMap qtData;
+ qtData.insert(versionKey(), qtVersion->qtVersionString());
+ qtData.insert(qtQmlDebuggingSupportKey, qtVersion->isQmlDebuggingSupported());
+ qtData.insert(qtQmlCompilerSupportKey, qtVersion->isQtQuickCompilerSupported());
+ qtData.insert(qtAbisKey, abisToVarinatList(qtVersion->qtAbis()));
+
+ m_map.insert(qtKey, qtData);
+ }
+
+ return *this;
+ }
+
+ KitInfo &withCompilerInfo()
+ {
+ static const QString compilerKey = QStringLiteral("compiler");
+
+ if (auto toolChain = ToolChainKitAspect::toolChain(&m_kit, Constants::CXX_LANGUAGE_ID)) {
+ m_map.insert(compilerKey,
+ QVariantMap{{nameKey(), toolChain->typeDisplayName()},
+ {versionKey(), extractToolChainVersion(*toolChain)}});
+ }
+
+ return *this;
+ }
+
+ KitInfo &withDebuggerInfo()
+ {
+ static const QString debuggerKey = QStringLiteral("debugger");
+
+ if (auto debuggerInfo = Debugger::DebuggerKitAspect::debugger(&m_kit)) {
+ m_map.insert(debuggerKey,
+ QVariantMap{{nameKey(), debuggerInfo->engineTypeName()},
+ {versionKey(), debuggerInfo->version()}});
+ }
+
+ return *this;
+ }
+
+ QVariantMap extract() const { return m_map; }
+
+ static KitInfo forKit(Kit &kit) { return KitInfo(kit); }
+
+private: // Methods
+ KitInfo(Kit &kit) : m_kit(kit) { addKitInfo(); }
+
+ void addKitInfo()
+ {
+ static QString defaultKitKey = QStringLiteral("default");
+
+ m_map.insert(defaultKitKey, &m_kit == KitManager::defaultKit());
+ }
+
+ static QVariantMap abiToVariantMap(const Abi &abi)
+ {
+ static const QString archKey = QStringLiteral("arch");
+ static const QString osKey = QStringLiteral("os");
+ static const QString osFlavorKey = QStringLiteral("osFlavor");
+ static const QString binaryFormatKey = QStringLiteral("binaryFormat");
+ static const QString wordWidthKey = QStringLiteral("wordWidth");
+
+ return QVariantMap{{archKey , Abi::toString(abi.architecture())},
+ {osKey , Abi::toString(abi.os()) },
+ {osFlavorKey , Abi::toString(abi.osFlavor()) },
+ {binaryFormatKey, Abi::toString(abi.binaryFormat())},
+ {wordWidthKey , Abi::toString(abi.wordWidth()) }};
+ }
+
+ template <class Container>
+ QVariantList abisToVarinatList(const Container &abis)
+ {
+ QVariantList result;
+ for (auto &&abi : abis) {
+ result << abiToVariantMap(abi);
+ }
+
+ return result;
+ }
+
+ static QString versionKey() { return QStringLiteral("version"); }
+ static QString nameKey() { return QStringLiteral("name"); }
+
+private: // Data
+ Kit &m_kit;
+ QVariantMap m_map;
+};
+
+static QVariantList kitsInfo()
+{
+ QVariantList kitsInfoList;
+ for (auto &&kit : KitManager::instance()->kits()) {
+ if (kit && kit->isValid()) {
+ kitsInfoList << KitInfo::forKit(*kit)
+ .withCompilerInfo()
+ .withDebuggerInfo()
+ .withQtVersionInfo()
+ .extract();
+ }
+ }
+
+ return kitsInfoList;
+}
+
+QVariant KitSource::data()
+{
+ return QVariantMap{{kitsInfoKey(), kitsInfo()}};
+}
+
+} // namespace Internal
+} // namespace UsageStatistic