Meson: Consolidate parsers

Change-Id: I9c09d22af12a116ea15fcda793bcccd5a12ff840
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
hjk
2023-06-13 15:04:56 +02:00
parent df71c6a1f0
commit 508189339d
4 changed files with 66 additions and 93 deletions

View File

@@ -54,7 +54,6 @@ add_qtc_plugin(MesonProjectManager
settings.cpp
settings.h
target.h
targetparser.h
toolitemsettings.cpp
toolitemsettings.h
toolkitaspectwidget.cpp

View File

@@ -9,7 +9,6 @@
#include "infoparser.h"
#include "mesoninfo.h"
#include "target.h"
#include "targetparser.h"
#include <utils/filepath.h>
@@ -17,11 +16,72 @@
namespace MesonProjectManager {
namespace Internal {
class MesonInfoParserPrivate;
namespace 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<QJsonArray>(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<QJsonArray>(path.toFSPathString()))
return load_targets(*arr);
return {};
}
};
struct Result
{
TargetsList targets;
@@ -32,7 +92,7 @@ struct Result
inline Result parse(const Utils::FilePath &buildDir)
{
return {TargetParser{buildDir}.targetList(),
return {TargetParser::targetList(buildDir),
BuildOptionsParser{buildDir}.takeBuildOptions(),
BuildSystemFilesParser{buildDir}.files(),
InfoParser{buildDir}.info()};
@@ -41,7 +101,7 @@ inline Result parse(const Utils::FilePath &buildDir)
inline Result parse(const QByteArray &data)
{
auto json = QJsonDocument::fromJson(data);
return {TargetParser{json}.targetList(),
return {TargetParser::targetList(json),
BuildOptionsParser{json}.takeBuildOptions(),
BuildSystemFilesParser{json}.files(),
std::nullopt};

View File

@@ -35,7 +35,6 @@ Project {
"buildsystemfilesparser.h",
"common.h",
"infoparser.h",
"targetparser.h",
"target.h",
"mesonpluginconstants.h",
"mesonprojectplugin.cpp",

View File

@@ -1,85 +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 "mesonpluginconstants.h"
#include "target.h"
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
namespace MesonProjectManager {
namespace Internal {
class TargetParser
{
TargetsList m_targets;
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:
TargetParser(const Utils::FilePath &buildDir)
{
Utils::FilePath path = buildDir / Constants::MESON_INFO_DIR / Constants::MESON_INTRO_TARGETS;
auto arr = load<QJsonArray>(path.toFSPathString());
if (arr)
m_targets = load_targets(*arr);
}
TargetParser(const QJsonDocument &js)
{
auto obj = get<QJsonArray>(js.object(), "targets");
if (obj)
m_targets = load_targets(*obj);
}
inline TargetsList targetList() { return m_targets; }
};
} // namespace Internal
} // namespace MesonProjectManager