// Copyright (C) 2020 Alexis Jeandet. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "mesontools.h" #include using namespace Utils; namespace MesonProjectManager { namespace Internal { template inline bool is(const MesonTools::Tool_t &tool) { return bool(std::dynamic_pointer_cast(tool)); } template std::shared_ptr tool(const Utils::Id &id, const std::vector &tools) { static_assert(std::is_base_of::value, "Type must derive from ToolWrapper"); const auto tool = std::find_if(std::cbegin(tools), std::cend(tools), [&id](const MesonTools::Tool_t &tool) { return tool->id() == id; }); if (tool != std::cend(tools) && is(*tool)) return std::dynamic_pointer_cast(*tool); return nullptr; } static MesonTools::Tool_t autoDetected(const std::vector &tools, ToolType toolType) { for (const auto &tool : tools) { if (tool->autoDetected() && tool->toolType() == toolType) return tool; } return nullptr; } static void fixAutoDetected(std::vector &tools, ToolType toolType) { MesonTools::Tool_t autoDetectedTool = autoDetected(tools, toolType); if (!autoDetectedTool) { QStringList exeNames; QString toolName; if (toolType == ToolType::Meson) { if (std::optional path = findMesonTool()) { tools.emplace_back( std::make_shared(toolType, QString("System %1 at %2").arg("Meson").arg(path->toString()), *path, true)); } } else if (toolType == ToolType::Ninja) { if (std::optional path = findNinjaTool()) { tools.emplace_back( std::make_shared(toolType, QString("System %1 at %2").arg("Ninja").arg(path->toString()), *path, true)); } } } } bool MesonTools::isMesonWrapper(const MesonTools::Tool_t &tool) { return is(tool); } bool MesonTools::isNinjaWrapper(const MesonTools::Tool_t &tool) { return is(tool); } void MesonTools::setTools(std::vector &&tools) { auto self = instance(); std::swap(self->m_tools, tools); fixAutoDetected(self->m_tools, ToolType::Meson); fixAutoDetected(self->m_tools, ToolType::Ninja); } std::shared_ptr MesonTools::ninjaWrapper(const Utils::Id &id) { return tool(id, MesonTools::instance()->m_tools); } std::shared_ptr MesonTools::mesonWrapper(const Utils::Id &id) { return tool(id, MesonTools::instance()->m_tools); } std::shared_ptr MesonTools::ninjaWrapper() { return std::dynamic_pointer_cast( autoDetected(MesonTools::instance()->m_tools, ToolType::Ninja)); } std::shared_ptr MesonTools::mesonWrapper() { return std::dynamic_pointer_cast( autoDetected(MesonTools::instance()->m_tools, ToolType::Meson)); } } // namespace Internal } // namespace MesonProjectManager