Meson: Start generalizing again

Change-Id: I9fc18edb0e159c448193b4cc7c4bd82b2d5f409a
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
hjk
2024-07-22 18:10:51 +02:00
parent a4a92a04a1
commit 23b31e24bf
8 changed files with 78 additions and 106 deletions

View File

@@ -3,51 +3,51 @@
#include "mesontools.h"
#include <utils/algorithm.h>
#include <utils/environment.h>
using namespace Utils;
namespace MesonProjectManager {
namespace Internal {
namespace MesonProjectManager::Internal {
MesonTools::Tool_t tool(const Id &id,
const std::vector<MesonTools::Tool_t> &tools,
ToolType toolType)
std::vector<MesonTools::Tool_t> s_tools;
static MesonTools::Tool_t findTool(const Id &id, ToolType toolType)
{
const auto tool = std::find_if(std::cbegin(tools),
std::cend(tools),
const auto tool = std::find_if(std::cbegin(s_tools),
std::cend(s_tools),
[&id](const MesonTools::Tool_t &tool) {
return tool->id() == id;
});
if (tool != std::cend(tools) && (*tool)->toolType() == toolType)
if (tool != std::cend(s_tools) && (*tool)->toolType() == toolType)
return *tool;
return nullptr;
}
static MesonTools::Tool_t autoDetected(const std::vector<MesonTools::Tool_t> &tools, ToolType toolType)
MesonTools::Tool_t autoDetectedTool(ToolType toolType)
{
for (const auto &tool : tools) {
for (const auto &tool : s_tools) {
if (tool->autoDetected() && tool->toolType() == toolType)
return tool;
}
return nullptr;
}
static void fixAutoDetected(std::vector<MesonTools::Tool_t> &tools, ToolType toolType)
static void fixAutoDetected(ToolType toolType)
{
MesonTools::Tool_t autoDetectedTool = autoDetected(tools, toolType);
if (!autoDetectedTool) {
MesonTools::Tool_t autoDetected = autoDetectedTool(toolType);
if (!autoDetected) {
QStringList exeNames;
QString toolName;
if (toolType == ToolType::Meson) {
if (std::optional<FilePath> path = findMesonTool()) {
tools.emplace_back(
if (std::optional<FilePath> path = findTool(toolType)) {
s_tools.emplace_back(
std::make_shared<ToolWrapper>(toolType,
QString("System %1 at %2").arg("Meson").arg(path->toString()), *path, true));
}
} else if (toolType == ToolType::Ninja) {
if (std::optional<FilePath> path = findNinjaTool()) {
tools.emplace_back(
if (std::optional<FilePath> path = findTool(toolType)) {
s_tools.emplace_back(
std::make_shared<ToolWrapper>(toolType,
QString("System %1 at %2").arg("Ninja").arg(path->toString()), *path, true));
}
@@ -76,26 +76,28 @@ void MesonTools::addTool(const Id &itemId, const QString &name, const FilePath &
void MesonTools::addTool(Tool_t meson)
{
auto self = instance();
self->m_tools.emplace_back(std::move(meson));
emit self->toolAdded(self->m_tools.back());
s_tools.emplace_back(std::move(meson));
emit instance()->toolAdded(s_tools.back());
}
void MesonTools::setTools(std::vector<MesonTools::Tool_t> &&tools)
{
auto self = instance();
std::swap(self->m_tools, tools);
fixAutoDetected(self->m_tools, ToolType::Meson);
fixAutoDetected(self->m_tools, ToolType::Ninja);
std::swap(s_tools, tools);
fixAutoDetected(ToolType::Meson);
fixAutoDetected(ToolType::Ninja);
}
const std::vector<MesonTools::Tool_t> &MesonTools::tools()
{
return s_tools;
}
void MesonTools::updateTool(const Id &itemId, const QString &name, const FilePath &exe)
{
auto self = instance();
auto item = std::find_if(std::begin(self->m_tools),
std::end(self->m_tools),
auto item = std::find_if(std::begin(s_tools),
std::end(s_tools),
[&itemId](const Tool_t &tool) { return tool->id() == itemId; });
if (item != std::end(self->m_tools)) {
if (item != std::end(s_tools)) {
(*item)->setExe(exe);
(*item)->setName(name);
} else {
@@ -105,31 +107,20 @@ void MesonTools::updateTool(const Id &itemId, const QString &name, const FilePat
void MesonTools::removeTool(const Id &id)
{
auto self = instance();
auto item = Utils::take(self->m_tools, [&id](const auto &item) { return item->id() == id; });
auto item = Utils::take(s_tools, [&id](const auto &item) { return item->id() == id; });
QTC_ASSERT(item, return );
emit self->toolRemoved(*item);
emit instance()->toolRemoved(*item);
}
std::shared_ptr<ToolWrapper> MesonTools::ninjaWrapper(const Id &id)
std::shared_ptr<ToolWrapper> MesonTools::toolById(const Id &id, ToolType toolType)
{
return tool(id, MesonTools::instance()->m_tools, ToolType::Ninja);
return findTool(id, toolType);
}
std::shared_ptr<ToolWrapper> MesonTools::mesonWrapper(const Id &id)
MesonTools *MesonTools::instance()
{
return tool(id, MesonTools::instance()->m_tools, ToolType::Meson);
static MesonTools inst;
return &inst;
}
std::shared_ptr<ToolWrapper> MesonTools::autoDetectedNinja()
{
return autoDetected(MesonTools::instance()->m_tools, ToolType::Ninja);
}
std::shared_ptr<ToolWrapper> MesonTools::autoDetectedMeson()
{
return autoDetected(MesonTools::instance()->m_tools, ToolType::Meson);
}
} // namespace Internal
} // namespace MesonProjectManager
} // MesonProjectManager::Internal