forked from qt-creator/qt-creator
ClangCodeModel: Move memory usage widget to its own set of files
Change-Id: Iaeb449a12a11e46e8ce03556c699fff4ffceffc5 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -21,6 +21,7 @@ add_qtc_plugin(ClangCodeModel
|
|||||||
clangdfindreferences.cpp clangdfindreferences.h
|
clangdfindreferences.cpp clangdfindreferences.h
|
||||||
clangdfollowsymbol.cpp clangdfollowsymbol.h
|
clangdfollowsymbol.cpp clangdfollowsymbol.h
|
||||||
clangdiagnostictooltipwidget.cpp clangdiagnostictooltipwidget.h
|
clangdiagnostictooltipwidget.cpp clangdiagnostictooltipwidget.h
|
||||||
|
clangdmemoryusagewidget.cpp clangdmemoryusagewidget.h
|
||||||
clangdquickfixes.cpp clangdquickfixes.h
|
clangdquickfixes.cpp clangdquickfixes.h
|
||||||
clangdqpropertyhighlighter.cpp clangdqpropertyhighlighter.h
|
clangdqpropertyhighlighter.cpp clangdqpropertyhighlighter.h
|
||||||
clangdsemantichighlighting.cpp clangdsemantichighlighting.h
|
clangdsemantichighlighting.cpp clangdsemantichighlighting.h
|
||||||
|
@@ -44,6 +44,8 @@ QtcPlugin {
|
|||||||
"clangdiagnostictooltipwidget.h",
|
"clangdiagnostictooltipwidget.h",
|
||||||
"clangdlocatorfilters.cpp",
|
"clangdlocatorfilters.cpp",
|
||||||
"clangdlocatorfilters.h",
|
"clangdlocatorfilters.h",
|
||||||
|
"clangdmemoryusagewidget.cpp",
|
||||||
|
"clangdmemoryusagewidget.h",
|
||||||
"clangdqpropertyhighlighter.cpp",
|
"clangdqpropertyhighlighter.cpp",
|
||||||
"clangdqpropertyhighlighter.h",
|
"clangdqpropertyhighlighter.h",
|
||||||
"clangdquickfixes.cpp",
|
"clangdquickfixes.cpp",
|
||||||
|
@@ -31,6 +31,7 @@
|
|||||||
#include "clangdfindreferences.h"
|
#include "clangdfindreferences.h"
|
||||||
#include "clangdfollowsymbol.h"
|
#include "clangdfollowsymbol.h"
|
||||||
#include "clangdlocatorfilters.h"
|
#include "clangdlocatorfilters.h"
|
||||||
|
#include "clangdmemoryusagewidget.h"
|
||||||
#include "clangdquickfixes.h"
|
#include "clangdquickfixes.h"
|
||||||
#include "clangdswitchdecldef.h"
|
#include "clangdswitchdecldef.h"
|
||||||
#include "clangtextmark.h"
|
#include "clangtextmark.h"
|
||||||
@@ -71,20 +72,15 @@
|
|||||||
#include <utils/fileutils.h>
|
#include <utils/fileutils.h>
|
||||||
#include <utils/itemviews.h>
|
#include <utils/itemviews.h>
|
||||||
#include <utils/runextensions.h>
|
#include <utils/runextensions.h>
|
||||||
#include <utils/treemodel.h>
|
|
||||||
#include <utils/utilsicons.h>
|
#include <utils/utilsicons.h>
|
||||||
|
|
||||||
#include <QAction>
|
#include <QAction>
|
||||||
#include <QElapsedTimer>
|
#include <QElapsedTimer>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include <QHeaderView>
|
|
||||||
#include <QMenu>
|
|
||||||
#include <QPair>
|
#include <QPair>
|
||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
#include <QVBoxLayout>
|
|
||||||
#include <QWidget>
|
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <set>
|
#include <set>
|
||||||
@@ -255,24 +251,6 @@ private:
|
|||||||
std::unordered_map<DocType, VersionedDocData<DocType, DataType>> m_data;
|
std::unordered_map<DocType, VersionedDocData<DocType, DataType>> m_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MemoryTreeModel;
|
|
||||||
class MemoryUsageWidget : public QWidget
|
|
||||||
{
|
|
||||||
Q_DECLARE_TR_FUNCTIONS(MemoryUsageWidget)
|
|
||||||
public:
|
|
||||||
MemoryUsageWidget(ClangdClient *client);
|
|
||||||
~MemoryUsageWidget();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void setupUi();
|
|
||||||
void getMemoryTree();
|
|
||||||
|
|
||||||
ClangdClient * const m_client;
|
|
||||||
MemoryTreeModel * const m_model;
|
|
||||||
Utils::TreeView m_view;
|
|
||||||
Utils::optional<MessageId> m_currentRequest;
|
|
||||||
};
|
|
||||||
|
|
||||||
class HighlightingData
|
class HighlightingData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -564,7 +542,7 @@ QTextCursor ClangdClient::adjustedCursorForHighlighting(const QTextCursor &curso
|
|||||||
|
|
||||||
const LanguageClient::Client::CustomInspectorTabs ClangdClient::createCustomInspectorTabs()
|
const LanguageClient::Client::CustomInspectorTabs ClangdClient::createCustomInspectorTabs()
|
||||||
{
|
{
|
||||||
return {std::make_pair(new MemoryUsageWidget(this), tr("Memory Usage"))};
|
return {std::make_pair(new ClangdMemoryUsageWidget(this), tr("Memory Usage"))};
|
||||||
}
|
}
|
||||||
|
|
||||||
class ClangdDiagnosticManager : public LanguageClient::DiagnosticManager
|
class ClangdDiagnosticManager : public LanguageClient::DiagnosticManager
|
||||||
@@ -1405,139 +1383,5 @@ MessageId ClangdClient::Private::getAndHandleAst(const TextDocOrFile &doc,
|
|||||||
return requestAst(q, filePath, range, wrapperHandler);
|
return requestAst(q, filePath, range, wrapperHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
class MemoryTree : public JsonObject
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
using JsonObject::JsonObject;
|
|
||||||
|
|
||||||
// number of bytes used, including child components
|
|
||||||
qint64 total() const { return qint64(typedValue<double>(totalKey())); }
|
|
||||||
|
|
||||||
// number of bytes used, excluding child components
|
|
||||||
qint64 self() const { return qint64(typedValue<double>(selfKey())); }
|
|
||||||
|
|
||||||
// named child components
|
|
||||||
using NamedComponent = std::pair<MemoryTree, QString>;
|
|
||||||
QList<NamedComponent> children() const
|
|
||||||
{
|
|
||||||
QList<NamedComponent> components;
|
|
||||||
const auto obj = operator const QJsonObject &();
|
|
||||||
for (auto it = obj.begin(); it != obj.end(); ++it) {
|
|
||||||
if (it.key() == totalKey() || it.key() == selfKey())
|
|
||||||
continue;
|
|
||||||
components << std::make_pair(MemoryTree(it.value()), it.key());
|
|
||||||
}
|
|
||||||
return components;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
static QString totalKey() { return QLatin1String("_total"); }
|
|
||||||
static QString selfKey() { return QLatin1String("_self"); }
|
|
||||||
};
|
|
||||||
|
|
||||||
class MemoryTreeItem : public Utils::TreeItem
|
|
||||||
{
|
|
||||||
Q_DECLARE_TR_FUNCTIONS(MemoryTreeItem)
|
|
||||||
public:
|
|
||||||
MemoryTreeItem(const QString &displayName, const MemoryTree &tree)
|
|
||||||
: m_displayName(displayName), m_bytesUsed(tree.total())
|
|
||||||
{
|
|
||||||
for (const MemoryTree::NamedComponent &component : tree.children())
|
|
||||||
appendChild(new MemoryTreeItem(component.second, component.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
QVariant data(int column, int role) const override
|
|
||||||
{
|
|
||||||
switch (role) {
|
|
||||||
case Qt::DisplayRole:
|
|
||||||
if (column == 0)
|
|
||||||
return m_displayName;
|
|
||||||
return memString();
|
|
||||||
case Qt::TextAlignmentRole:
|
|
||||||
if (column == 1)
|
|
||||||
return Qt::AlignRight;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
QString memString() const
|
|
||||||
{
|
|
||||||
static const QList<std::pair<int, QString>> factors{
|
|
||||||
std::make_pair(1000000000, QString("GB")),
|
|
||||||
std::make_pair(1000000, QString("MB")),
|
|
||||||
std::make_pair(1000, QString("KB")),
|
|
||||||
};
|
|
||||||
for (const auto &factor : factors) {
|
|
||||||
if (m_bytesUsed > factor.first)
|
|
||||||
return QString::number(qint64(std::round(double(m_bytesUsed) / factor.first)))
|
|
||||||
+ ' ' + factor.second;
|
|
||||||
}
|
|
||||||
return QString::number(m_bytesUsed) + " B";
|
|
||||||
}
|
|
||||||
|
|
||||||
const QString m_displayName;
|
|
||||||
const qint64 m_bytesUsed;
|
|
||||||
};
|
|
||||||
|
|
||||||
class MemoryTreeModel : public Utils::BaseTreeModel
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
MemoryTreeModel(QObject *parent) : BaseTreeModel(parent)
|
|
||||||
{
|
|
||||||
setHeader({MemoryUsageWidget::tr("Component"), MemoryUsageWidget::tr("Total Memory")});
|
|
||||||
}
|
|
||||||
|
|
||||||
void update(const MemoryTree &tree)
|
|
||||||
{
|
|
||||||
setRootItem(new MemoryTreeItem({}, tree));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
MemoryUsageWidget::MemoryUsageWidget(ClangdClient *client)
|
|
||||||
: m_client(client), m_model(new MemoryTreeModel(this))
|
|
||||||
{
|
|
||||||
setupUi();
|
|
||||||
getMemoryTree();
|
|
||||||
}
|
|
||||||
|
|
||||||
MemoryUsageWidget::~MemoryUsageWidget()
|
|
||||||
{
|
|
||||||
if (m_currentRequest.has_value())
|
|
||||||
m_client->cancelRequest(m_currentRequest.value());
|
|
||||||
}
|
|
||||||
|
|
||||||
void MemoryUsageWidget::setupUi()
|
|
||||||
{
|
|
||||||
const auto layout = new QVBoxLayout(this);
|
|
||||||
m_view.setContextMenuPolicy(Qt::CustomContextMenu);
|
|
||||||
m_view.header()->setSectionResizeMode(QHeaderView::ResizeToContents);
|
|
||||||
m_view.header()->setStretchLastSection(false);
|
|
||||||
m_view.setModel(m_model);
|
|
||||||
layout->addWidget(&m_view);
|
|
||||||
connect(&m_view, &QWidget::customContextMenuRequested, this, [this](const QPoint &pos) {
|
|
||||||
QMenu menu;
|
|
||||||
menu.addAction(tr("Update"), [this] { getMemoryTree(); });
|
|
||||||
menu.exec(m_view.mapToGlobal(pos));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void MemoryUsageWidget::getMemoryTree()
|
|
||||||
{
|
|
||||||
Request<MemoryTree, std::nullptr_t, JsonObject> request("$/memoryUsage", {});
|
|
||||||
request.setResponseCallback([this](decltype(request)::Response response) {
|
|
||||||
m_currentRequest.reset();
|
|
||||||
qCDebug(clangdLog) << "received memory usage response";
|
|
||||||
if (const auto result = response.result())
|
|
||||||
m_model->update(*result);
|
|
||||||
});
|
|
||||||
qCDebug(clangdLog) << "sending memory usage request";
|
|
||||||
m_currentRequest = request.id();
|
|
||||||
m_client->sendMessage(request, ClangdClient::SendDocUpdates::Ignore);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
} // namespace ClangCodeModel
|
} // namespace ClangCodeModel
|
||||||
|
200
src/plugins/clangcodemodel/clangdmemoryusagewidget.cpp
Normal file
200
src/plugins/clangcodemodel/clangdmemoryusagewidget.cpp
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2022 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of 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 "clangdmemoryusagewidget.h"
|
||||||
|
|
||||||
|
#include "clangdclient.h"
|
||||||
|
|
||||||
|
#include <languageserverprotocol/jsonobject.h>
|
||||||
|
#include <utils/itemviews.h>
|
||||||
|
#include <utils/treemodel.h>
|
||||||
|
|
||||||
|
#include <QHeaderView>
|
||||||
|
#include <QMenu>
|
||||||
|
#include <QPointer>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
|
using namespace LanguageServerProtocol;
|
||||||
|
using namespace Utils;
|
||||||
|
|
||||||
|
namespace ClangCodeModel::Internal {
|
||||||
|
|
||||||
|
class MemoryTree : public JsonObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using JsonObject::JsonObject;
|
||||||
|
|
||||||
|
// number of bytes used, including child components
|
||||||
|
qint64 total() const { return qint64(typedValue<double>(totalKey())); }
|
||||||
|
|
||||||
|
// number of bytes used, excluding child components
|
||||||
|
qint64 self() const { return qint64(typedValue<double>(selfKey())); }
|
||||||
|
|
||||||
|
// named child components
|
||||||
|
using NamedComponent = std::pair<MemoryTree, QString>;
|
||||||
|
QList<NamedComponent> children() const
|
||||||
|
{
|
||||||
|
QList<NamedComponent> components;
|
||||||
|
const auto obj = operator const QJsonObject &();
|
||||||
|
for (auto it = obj.begin(); it != obj.end(); ++it) {
|
||||||
|
if (it.key() == totalKey() || it.key() == selfKey())
|
||||||
|
continue;
|
||||||
|
components << std::make_pair(MemoryTree(it.value()), it.key());
|
||||||
|
}
|
||||||
|
return components;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static QString totalKey() { return QLatin1String("_total"); }
|
||||||
|
static QString selfKey() { return QLatin1String("_self"); }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class MemoryTreeItem : public TreeItem
|
||||||
|
{
|
||||||
|
Q_DECLARE_TR_FUNCTIONS(ClangCodeModel)
|
||||||
|
public:
|
||||||
|
MemoryTreeItem(const QString &displayName, const MemoryTree &tree)
|
||||||
|
: m_displayName(displayName), m_bytesUsed(tree.total())
|
||||||
|
{
|
||||||
|
for (const MemoryTree::NamedComponent &component : tree.children())
|
||||||
|
appendChild(new MemoryTreeItem(component.second, component.first));
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
QVariant data(int column, int role) const override
|
||||||
|
{
|
||||||
|
switch (role) {
|
||||||
|
case Qt::DisplayRole:
|
||||||
|
if (column == 0)
|
||||||
|
return m_displayName;
|
||||||
|
return memString();
|
||||||
|
case Qt::TextAlignmentRole:
|
||||||
|
if (column == 1)
|
||||||
|
return Qt::AlignRight;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
QString memString() const
|
||||||
|
{
|
||||||
|
static const QList<std::pair<int, QString>> factors{
|
||||||
|
std::make_pair(1000000000, QString("GB")),
|
||||||
|
std::make_pair(1000000, QString("MB")),
|
||||||
|
std::make_pair(1000, QString("KB")),
|
||||||
|
};
|
||||||
|
for (const auto &factor : factors) {
|
||||||
|
if (m_bytesUsed > factor.first)
|
||||||
|
return QString::number(qint64(std::round(double(m_bytesUsed) / factor.first)))
|
||||||
|
+ ' ' + factor.second;
|
||||||
|
}
|
||||||
|
return QString::number(m_bytesUsed) + " B";
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString m_displayName;
|
||||||
|
const qint64 m_bytesUsed;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class MemoryTreeModel : public BaseTreeModel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MemoryTreeModel()
|
||||||
|
{
|
||||||
|
setHeader({ClangdMemoryUsageWidget::tr("Component"),
|
||||||
|
ClangdMemoryUsageWidget::tr("Total Memory")});
|
||||||
|
}
|
||||||
|
|
||||||
|
void update(const MemoryTree &tree)
|
||||||
|
{
|
||||||
|
setRootItem(new MemoryTreeItem({}, tree));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class ClangdMemoryUsageWidget::Private
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Private(ClangdMemoryUsageWidget *q, ClangdClient *client) : q(q), client(client)
|
||||||
|
{
|
||||||
|
setupUi();
|
||||||
|
getMemoryTree();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setupUi();
|
||||||
|
void getMemoryTree();
|
||||||
|
|
||||||
|
ClangdMemoryUsageWidget * const q;
|
||||||
|
const QPointer<ClangdClient> client;
|
||||||
|
MemoryTreeModel model;
|
||||||
|
TreeView view;
|
||||||
|
Utils::optional<MessageId> currentRequest;
|
||||||
|
};
|
||||||
|
|
||||||
|
ClangdMemoryUsageWidget::ClangdMemoryUsageWidget(ClangdClient *client)
|
||||||
|
: d(new Private(this, client))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ClangdMemoryUsageWidget::~ClangdMemoryUsageWidget()
|
||||||
|
{
|
||||||
|
if (d->client && d->currentRequest.has_value())
|
||||||
|
d->client->cancelRequest(d->currentRequest.value());
|
||||||
|
delete d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClangdMemoryUsageWidget::Private::setupUi()
|
||||||
|
{
|
||||||
|
const auto layout = new QVBoxLayout(q);
|
||||||
|
view.setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
|
view.header()->setSectionResizeMode(QHeaderView::ResizeToContents);
|
||||||
|
view.header()->setStretchLastSection(false);
|
||||||
|
view.setModel(&model);
|
||||||
|
layout->addWidget(&view);
|
||||||
|
QObject::connect(&view, &QWidget::customContextMenuRequested, q, [this](const QPoint &pos) {
|
||||||
|
QMenu menu;
|
||||||
|
menu.addAction(tr("Update"), [this] { getMemoryTree(); });
|
||||||
|
menu.exec(view.mapToGlobal(pos));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClangdMemoryUsageWidget::Private::getMemoryTree()
|
||||||
|
{
|
||||||
|
Request<MemoryTree, std::nullptr_t, JsonObject> request("$/memoryUsage", {});
|
||||||
|
request.setResponseCallback([this](decltype(request)::Response response) {
|
||||||
|
currentRequest.reset();
|
||||||
|
qCDebug(clangdLog) << "received memory usage response";
|
||||||
|
if (const auto result = response.result())
|
||||||
|
model.update(*result);
|
||||||
|
});
|
||||||
|
qCDebug(clangdLog) << "sending memory usage request";
|
||||||
|
currentRequest = request.id();
|
||||||
|
client->sendMessage(request, ClangdClient::SendDocUpdates::Ignore);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace ClangCodeModel::Internal
|
46
src/plugins/clangcodemodel/clangdmemoryusagewidget.h
Normal file
46
src/plugins/clangcodemodel/clangdmemoryusagewidget.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2022 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of 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.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
namespace ClangCodeModel::Internal {
|
||||||
|
class ClangdClient;
|
||||||
|
|
||||||
|
class ClangdMemoryUsageWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_DECLARE_TR_FUNCTIONS(ClangCodeModel)
|
||||||
|
public:
|
||||||
|
explicit ClangdMemoryUsageWidget(ClangdClient *client);
|
||||||
|
~ClangdMemoryUsageWidget();
|
||||||
|
|
||||||
|
class Private;
|
||||||
|
Private * const d;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace ClangCodeModel::Internal
|
||||||
|
|
Reference in New Issue
Block a user