diff --git a/src/plugins/mesonprojectmanager/CMakeLists.txt b/src/plugins/mesonprojectmanager/CMakeLists.txt index c00334e188c..6c84b808eb5 100644 --- a/src/plugins/mesonprojectmanager/CMakeLists.txt +++ b/src/plugins/mesonprojectmanager/CMakeLists.txt @@ -6,7 +6,6 @@ add_qtc_plugin(MesonProjectManager buildoptions.h buildoptionsmodel.cpp buildoptionsmodel.h - buildoptionsparser.h common.h kitdata.h mesonactionsmanager.cpp @@ -15,6 +14,7 @@ add_qtc_plugin(MesonProjectManager mesonbuildconfiguration.h mesonbuildsystem.cpp mesonbuildsystem.h + mesoninfoparser.cpp mesoninfoparser.h mesonoutputparser.cpp mesonoutputparser.h @@ -84,6 +84,7 @@ add_qtc_test(tst_mesoninfoparser TEST_RELATIVE_LIBEXEC_PATH="${TEST_RELATIVE_LIBEXEC_PATH}" SOURCES tests/testmesoninfoparser.cpp + mesoninfoparser.cpp mesoninfoparser.h mesontools.cpp mesontools.h diff --git a/src/plugins/mesonprojectmanager/buildoptionsparser.h b/src/plugins/mesonprojectmanager/buildoptionsparser.h deleted file mode 100644 index 7abd0540eb5..00000000000 --- a/src/plugins/mesonprojectmanager/buildoptionsparser.h +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (C) 2020 Alexis Jeandet. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include "buildoptions.h" -#include "common.h" -#include "mesonpluginconstants.h" - -#include - -#include -#include -#include -#include -#include - -#include - -namespace MesonProjectManager::Internal { - -class BuildOptionsParser -{ - static inline std::unique_ptr load_option(const QJsonObject &option) - { - const auto type = option["type"].toString(); - if (type == "string") - return std::make_unique(option["name"].toString(), - option["section"].toString(), - option["description"].toString(), - option["value"]); - if (type == "boolean") - return std::make_unique(option["name"].toString(), - option["section"].toString(), - option["description"].toString(), - option["value"]); - if (type == "combo") - return std::make_unique(option["name"].toString(), - option["section"].toString(), - option["description"].toString(), - option["choices"].toVariant().toStringList(), - option["value"]); - if (type == "integer") - return std::make_unique(option["name"].toString(), - option["section"].toString(), - option["description"].toString(), - option["value"]); - if (type == "array") - return std::make_unique(option["name"].toString(), - option["section"].toString(), - option["description"].toString(), - option["value"].toVariant()); - if (type == "feature") - return std::make_unique(option["name"].toString(), - option["section"].toString(), - option["description"].toString(), - option["value"]); - return std::make_unique(option["name"].toString(), - option["section"].toString(), - option["description"].toString()); - } - - static inline std::vector> load_options(const QJsonArray &arr) - { - std::vector> buildOptions; - std::transform(std::cbegin(arr), - std::cend(arr), - std::back_inserter(buildOptions), - [](const auto &option) { return load_option(option.toObject()); }); - return buildOptions; - } - - std::vector> m_buildOptions; - -public: - BuildOptionsParser(const Utils::FilePath &buildDir) - { - Utils::FilePath path = buildDir / Constants::MESON_INFO_DIR / Constants::MESON_INTRO_BUIDOPTIONS; - auto arr = load(path.toFSPathString()); - if (arr) - m_buildOptions = load_options(*arr); - } - - BuildOptionsParser(const QJsonDocument &js) - { - auto obj = get(js.object(), "buildoptions"); - if (obj) - m_buildOptions = load_options(*obj); - } - - inline std::vector> takeBuildOptions() - { - return std::move(m_buildOptions); - } -}; - -} // namespace MesonProjectManager::Internal diff --git a/src/plugins/mesonprojectmanager/mesonactionsmanager.cpp b/src/plugins/mesonprojectmanager/mesonactionsmanager.cpp index 8c5de08f27d..2510d071124 100644 --- a/src/plugins/mesonprojectmanager/mesonactionsmanager.cpp +++ b/src/plugins/mesonprojectmanager/mesonactionsmanager.cpp @@ -4,6 +4,7 @@ #include "mesonactionsmanager.h" #include "mesonbuildsystem.h" +#include "mesonpluginconstants.h" #include "mesonprojectmanagertr.h" #include "mesonprojectnodes.h" diff --git a/src/plugins/mesonprojectmanager/mesonbuildsystem.cpp b/src/plugins/mesonprojectmanager/mesonbuildsystem.cpp index 4ac33fbb46c..022f24000af 100644 --- a/src/plugins/mesonprojectmanager/mesonbuildsystem.cpp +++ b/src/plugins/mesonprojectmanager/mesonbuildsystem.cpp @@ -5,6 +5,7 @@ #include "kitdata.h" #include "mesonbuildconfiguration.h" +#include "mesonpluginconstants.h" #include "mesonprojectmanagertr.h" #include "settings.h" #include "toolkitaspectwidget.h" diff --git a/src/plugins/mesonprojectmanager/mesoninfoparser.cpp b/src/plugins/mesonprojectmanager/mesoninfoparser.cpp new file mode 100644 index 00000000000..79959af3c69 --- /dev/null +++ b/src/plugins/mesonprojectmanager/mesoninfoparser.cpp @@ -0,0 +1,225 @@ +// Copyright (C) 2020 Alexis Jeandet. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "mesoninfoparser.h" + +#include "buildoptions.h" +#include "common.h" +#include "mesonpluginconstants.h" + +#include +#include +#include +#include +#include + +#include +#include + +using namespace Utils; + +namespace MesonProjectManager::Internal::MesonInfoParser { + +class BuildOptionsParser +{ + static inline std::unique_ptr load_option(const QJsonObject &option) + { + const auto type = option["type"].toString(); + if (type == "string") + return std::make_unique(option["name"].toString(), + option["section"].toString(), + option["description"].toString(), + option["value"]); + if (type == "boolean") + return std::make_unique(option["name"].toString(), + option["section"].toString(), + option["description"].toString(), + option["value"]); + if (type == "combo") + return std::make_unique(option["name"].toString(), + option["section"].toString(), + option["description"].toString(), + option["choices"].toVariant().toStringList(), + option["value"]); + if (type == "integer") + return std::make_unique(option["name"].toString(), + option["section"].toString(), + option["description"].toString(), + option["value"]); + if (type == "array") + return std::make_unique(option["name"].toString(), + option["section"].toString(), + option["description"].toString(), + option["value"].toVariant()); + if (type == "feature") + return std::make_unique(option["name"].toString(), + option["section"].toString(), + option["description"].toString(), + option["value"]); + return std::make_unique(option["name"].toString(), + option["section"].toString(), + option["description"].toString()); + } + + static inline std::vector> load_options(const QJsonArray &arr) + { + std::vector> buildOptions; + std::transform(std::cbegin(arr), + std::cend(arr), + std::back_inserter(buildOptions), + [](const auto &option) { return load_option(option.toObject()); }); + return buildOptions; + } + + std::vector> m_buildOptions; + +public: + BuildOptionsParser(const FilePath &buildDir) + { + FilePath path = buildDir / Constants::MESON_INFO_DIR / Constants::MESON_INTRO_BUIDOPTIONS; + auto arr = load(path.toFSPathString()); + if (arr) + m_buildOptions = load_options(*arr); + } + + BuildOptionsParser(const QJsonDocument &js) + { + auto obj = get(js.object(), "buildoptions"); + if (obj) + m_buildOptions = load_options(*obj); + } + + inline std::vector> takeBuildOptions() + { + return std::move(m_buildOptions); + } +}; + +class TargetParser +{ + static inline Target::SourceGroup extract_source(const QJsonValue &source) + { + const auto srcObj = source.toObject(); + return {srcObj["language"].toString(), + srcObj["compiler"].toVariant().toStringList(), + srcObj["parameters"].toVariant().toStringList(), + srcObj["sources"].toVariant().toStringList(), + srcObj["generated_sources"].toVariant().toStringList()}; + } + + static inline Target::SourceGroupList extract_sources(const QJsonArray &sources) + { + Target::SourceGroupList res; + std::transform(std::cbegin(sources), + std::cend(sources), + std::back_inserter(res), + extract_source); + return res; + } + + static inline Target extract_target(const QJsonValue &target) + { + auto targetObj = target.toObject(); + Target t{targetObj["type"].toString(), + targetObj["name"].toString(), + targetObj["id"].toString(), + targetObj["defined_in"].toString(), + targetObj["filename"].toVariant().toStringList(), + targetObj["extra_files"].toVariant().toStringList(), + targetObj["subproject"].toString(), + extract_sources(targetObj["target_sources"].toArray())}; + return t; + } + + static inline TargetsList load_targets(const QJsonArray &arr) + { + TargetsList targets; + std::transform(std::cbegin(arr), + std::cend(arr), + std::back_inserter(targets), + extract_target); + return targets; + } + +public: + static TargetsList targetList(const QJsonDocument &js) + { + if (auto obj = get(js.object(), "targets")) + return load_targets(*obj); + return {}; + } + + static TargetsList targetList(const FilePath &buildDir) + { + const FilePath path = buildDir / Constants::MESON_INFO_DIR / Constants::MESON_INTRO_TARGETS; + if (auto arr = load(path.toFSPathString())) + return load_targets(*arr); + return {}; + } +}; + +class BuildSystemFilesParser +{ + static void appendFiles(const std::optional &arr, FilePaths &dest) + { + if (arr) + std::transform(std::cbegin(*arr), + std::cend(*arr), + std::back_inserter(dest), + [](const auto &file) { + return FilePath::fromString(file.toString()); + }); + } + +public: + static inline FilePaths files(const FilePath &buildDir) + { + FilePaths files; + FilePath path = buildDir / Constants::MESON_INFO_DIR / Constants::MESON_INTRO_BUILDSYSTEM_FILES; + auto arr = load(path.toFSPathString()); + appendFiles(arr, files); + return files; + } + + static inline FilePaths files(const QJsonDocument &js) + { + FilePaths files; + auto arr = get(js.object(), "projectinfo", "buildsystem_files"); + appendFiles(arr, files); + const auto subprojects = get(js.object(), "projectinfo", "subprojects"); + for (const auto &subproject : *subprojects) { + auto arr = get(subproject.toObject(), "buildsystem_files"); + appendFiles(arr, files); + } + return files; + } +}; + +Result parse(const FilePath &buildDir) +{ + return {TargetParser::targetList(buildDir), + BuildOptionsParser{buildDir}.takeBuildOptions(), + BuildSystemFilesParser::files(buildDir)}; +} + +Result parse(const QByteArray &data) +{ + auto json = QJsonDocument::fromJson(data); + return {TargetParser::targetList(json), + BuildOptionsParser{json}.takeBuildOptions(), + BuildSystemFilesParser::files(json)}; +} + +Result parse(QIODevice *introFile) +{ + if (introFile) { + if (!introFile->isOpen()) + introFile->open(QIODevice::ReadOnly | QIODevice::Text); + introFile->seek(0); + auto data = introFile->readAll(); + return parse(data); + } + return {}; +} + +} // namespace MesonProjectManager::Internal::MesonInfoParser diff --git a/src/plugins/mesonprojectmanager/mesoninfoparser.h b/src/plugins/mesonprojectmanager/mesoninfoparser.h index f56e4f67af9..87fb0dc4f35 100644 --- a/src/plugins/mesonprojectmanager/mesoninfoparser.h +++ b/src/plugins/mesonprojectmanager/mesoninfoparser.h @@ -4,115 +4,12 @@ #pragma once #include "buildoptions.h" -#include "buildoptionsparser.h" #include "target.h" #include -#include - namespace MesonProjectManager::Internal::MesonInfoParser { -class TargetParser -{ - static inline Target::SourceGroup extract_source(const QJsonValue &source) - { - const auto srcObj = source.toObject(); - return {srcObj["language"].toString(), - srcObj["compiler"].toVariant().toStringList(), - srcObj["parameters"].toVariant().toStringList(), - srcObj["sources"].toVariant().toStringList(), - srcObj["generated_sources"].toVariant().toStringList()}; - } - - static inline Target::SourceGroupList extract_sources(const QJsonArray &sources) - { - Target::SourceGroupList res; - std::transform(std::cbegin(sources), - std::cend(sources), - std::back_inserter(res), - extract_source); - return res; - } - - static inline Target extract_target(const QJsonValue &target) - { - auto targetObj = target.toObject(); - Target t{targetObj["type"].toString(), - targetObj["name"].toString(), - targetObj["id"].toString(), - targetObj["defined_in"].toString(), - targetObj["filename"].toVariant().toStringList(), - targetObj["extra_files"].toVariant().toStringList(), - targetObj["subproject"].toString(), - extract_sources(targetObj["target_sources"].toArray())}; - return t; - } - - static inline TargetsList load_targets(const QJsonArray &arr) - { - TargetsList targets; - std::transform(std::cbegin(arr), - std::cend(arr), - std::back_inserter(targets), - extract_target); - return targets; - } - -public: - static TargetsList targetList(const QJsonDocument &js) - { - if (auto obj = get(js.object(), "targets")) - return load_targets(*obj); - return {}; - } - - static TargetsList targetList(const Utils::FilePath &buildDir) - { - Utils::FilePath path = buildDir / Constants::MESON_INFO_DIR / Constants::MESON_INTRO_TARGETS; - if (auto arr = load(path.toFSPathString())) - return load_targets(*arr); - return {}; - } -}; - -class BuildSystemFilesParser -{ - static void appendFiles(const std::optional &arr, Utils::FilePaths &dest) - { - if (arr) - std::transform(std::cbegin(*arr), - std::cend(*arr), - std::back_inserter(dest), - [](const auto &file) { - return Utils::FilePath::fromString(file.toString()); - }); - } - -public: - static inline Utils::FilePaths files(const Utils::FilePath &buildDir) - { - Utils::FilePaths files; - Utils::FilePath path = buildDir / Constants::MESON_INFO_DIR / Constants::MESON_INTRO_BUILDSYSTEM_FILES; - auto arr = load(path.toFSPathString()); - appendFiles(arr, files); - return files; - } - - static inline Utils::FilePaths files(const QJsonDocument &js) - { - Utils::FilePaths files; - auto arr = get(js.object(), "projectinfo", "buildsystem_files"); - appendFiles(arr, files); - const auto subprojects = get(js.object(), "projectinfo", "subprojects"); - for (const auto &subproject : *subprojects) { - auto arr = get(subproject.toObject(), "buildsystem_files"); - appendFiles(arr, files); - } - return files; - } -}; - struct Result { TargetsList targets; @@ -120,31 +17,8 @@ struct Result Utils::FilePaths buildSystemFiles; }; -inline Result parse(const Utils::FilePath &buildDir) -{ - return {TargetParser::targetList(buildDir), - BuildOptionsParser{buildDir}.takeBuildOptions(), - BuildSystemFilesParser::files(buildDir)}; -} - -inline Result parse(const QByteArray &data) -{ - auto json = QJsonDocument::fromJson(data); - return {TargetParser::targetList(json), - BuildOptionsParser{json}.takeBuildOptions(), - BuildSystemFilesParser::files(json)}; -} - -inline Result parse(QIODevice *introFile) -{ - if (introFile) { - if (!introFile->isOpen()) - introFile->open(QIODevice::ReadOnly | QIODevice::Text); - introFile->seek(0); - auto data = introFile->readAll(); - return parse(data); - } - return {}; -} +Result parse(const Utils::FilePath &buildDir); +Result parse(const QByteArray &data); +Result parse(QIODevice *introFile); } // namespace MesonProjectManager::Internal::MesonInfoParser diff --git a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs index ac82d811029..a9b7c6abc0a 100644 --- a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs +++ b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs @@ -24,8 +24,8 @@ Project { "mesonactionsmanager.cpp", "mesonactionsmanager.h", "buildoptions.h", + "mesoninfoparser.cpp", "mesoninfoparser.h", - "buildoptionsparser.h", "common.h", "target.h", "mesonpluginconstants.h", @@ -93,8 +93,9 @@ Project { cpp.includePaths: "." files: [ - "mesontools.h", "mesontools.cpp", + "mesontools.h", + "mesoninfoparser.cpp", "mesoninfoparser.h", "tests/testmesoninfoparser.cpp", ] diff --git a/src/plugins/mesonprojectmanager/mesonprojectparser.cpp b/src/plugins/mesonprojectmanager/mesonprojectparser.cpp index 08fb3d3182a..006f4ad57a2 100644 --- a/src/plugins/mesonprojectmanager/mesonprojectparser.cpp +++ b/src/plugins/mesonprojectmanager/mesonprojectparser.cpp @@ -3,7 +3,9 @@ #include "mesonprojectparser.h" +#include "common.h" #include "mesoninfoparser.h" +#include "mesonpluginconstants.h" #include "mesonprojectmanagertr.h" #include "mesonprojectnodes.h" #include "mesontools.h" diff --git a/src/plugins/mesonprojectmanager/mesonprojectplugin.cpp b/src/plugins/mesonprojectmanager/mesonprojectplugin.cpp index ee3bb04d501..a8ca14bbaa5 100644 --- a/src/plugins/mesonprojectmanager/mesonprojectplugin.cpp +++ b/src/plugins/mesonprojectmanager/mesonprojectplugin.cpp @@ -4,6 +4,7 @@ #include "mesonactionsmanager.h" #include "mesonbuildconfiguration.h" #include "mesonbuildsystem.h" +#include "mesonpluginconstants.h" #include "mesonproject.h" #include "mesonrunconfiguration.h" #include "ninjabuildstep.h" diff --git a/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp b/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp index 9d7f4bdf615..88325392116 100644 --- a/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp +++ b/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp @@ -1,8 +1,8 @@ // Copyright (C) 2020 Alexis Jeandet. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "mesoninfoparser.h" -#include "mesontools.h" +#include "../mesoninfoparser.h" +#include "../mesontools.h" #include #include