Complete ToJSON for OptionValues (#137375)

Completes the ToJSON function for `OptionValue` types and make the interface function pure virtual

---------

Co-authored-by: Jonas Devlieghere <jonas@devlieghere.com>
This commit is contained in:
Ebuka Ezike 2025-04-27 12:11:14 +01:00 committed by GitHub
parent e9a34e4236
commit d1adb0b8cd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
34 changed files with 61 additions and 37 deletions

View File

@ -93,15 +93,7 @@ public:
virtual void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) = 0;
// TODO: make this function pure virtual after implementing it in all
// child classes.
virtual llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) {
// Return nullptr which will create a llvm::json::Value() that is a NULL
// value. No setting should ever really have a NULL value in JSON. This
// indicates an error occurred and if/when we add a FromJSON() it will know
// to fail if someone tries to set it with a NULL JSON value.
return nullptr;
}
virtual llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const = 0;
virtual Status
SetValueFromString(llvm::StringRef value,

View File

@ -38,6 +38,8 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override;
Status
SetValueFromString(llvm::StringRef value,
VarSetOperationType op = eVarSetOperationAssign) override;

View File

@ -29,7 +29,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override;
Status
SetValueFromString(llvm::StringRef value,

View File

@ -29,7 +29,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override {
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override {
return m_current_value;
}

View File

@ -30,7 +30,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override {
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override {
return m_current_value;
}

View File

@ -34,7 +34,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override;
Status
SetValueFromString(llvm::StringRef value,

View File

@ -41,7 +41,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override;
Status
SetValueFromString(llvm::StringRef value,

View File

@ -29,6 +29,8 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override;
Status
SetValueFromString(llvm::StringRef value,
VarSetOperationType op = eVarSetOperationAssign) override;

View File

@ -35,7 +35,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override {
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override {
return m_current_value.GetPath();
}

View File

@ -33,7 +33,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override;
Status
SetValueFromString(llvm::StringRef value,

View File

@ -31,7 +31,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override;
Status
SetValueFromString(llvm::StringRef value,

View File

@ -28,7 +28,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override;
Status
SetValueFromString(llvm::StringRef value,

View File

@ -33,7 +33,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override;
Status
SetValueFromString(llvm::StringRef value,

View File

@ -29,7 +29,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override;
Status
SetValueFromString(llvm::StringRef value,

View File

@ -46,7 +46,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override;
llvm::StringRef GetName() const override { return m_name; }

View File

@ -28,7 +28,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override {
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override {
return m_regex.GetText();
}

View File

@ -35,7 +35,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override {
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override {
return m_current_value;
}

View File

@ -69,7 +69,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override {
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override {
return m_current_value;
}

View File

@ -38,7 +38,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override {
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override {
return m_current_value;
}

View File

@ -29,7 +29,7 @@ public:
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override {
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override {
return m_uuid.GetAsString();
}

View File

@ -49,7 +49,7 @@ public:
// By default, dump all pairs.
void Dump(Stream *s, int pair_index = -1);
llvm::json::Value ToJSON();
llvm::json::Value ToJSON() const;
bool IsEmpty() const {
std::lock_guard<std::mutex> lock(m_pairs_mutex);

View File

@ -33,6 +33,14 @@ void OptionValueArch::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
}
}
llvm::json::Value
OptionValueArch::ToJSON(const ExecutionContext *exe_ctx) const {
if (m_current_value.IsValid())
return llvm::json::Value(m_current_value.GetArchitectureName());
return {};
}
Status OptionValueArch::SetValueFromString(llvm::StringRef value,
VarSetOperationType op) {
Status error;

View File

@ -75,7 +75,8 @@ void OptionValueArray::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
}
}
llvm::json::Value OptionValueArray::ToJSON(const ExecutionContext *exe_ctx) {
llvm::json::Value
OptionValueArray::ToJSON(const ExecutionContext *exe_ctx) const {
llvm::json::Array json_array;
const uint32_t size = m_values.size();
for (uint32_t i = 0; i < size; ++i)

View File

@ -88,7 +88,7 @@ void OptionValueDictionary::DumpValue(const ExecutionContext *exe_ctx,
}
llvm::json::Value
OptionValueDictionary::ToJSON(const ExecutionContext *exe_ctx) {
OptionValueDictionary::ToJSON(const ExecutionContext *exe_ctx) const {
llvm::json::Object dict;
for (const auto &value : m_values) {
dict.try_emplace(value.first(), value.second->ToJSON(exe_ctx));

View File

@ -38,7 +38,7 @@ void OptionValueEnumeration::DumpValue(const ExecutionContext *exe_ctx,
}
llvm::json::Value
OptionValueEnumeration::ToJSON(const ExecutionContext *exe_ctx) {
OptionValueEnumeration::ToJSON(const ExecutionContext *exe_ctx) const {
for (const auto &enums : m_enumerations) {
if (enums.value.value == m_current_value)
return enums.cstring.GetStringRef();

View File

@ -46,6 +46,19 @@ void OptionValueFileColonLine::DumpValue(const ExecutionContext *exe_ctx,
}
}
llvm::json::Value
OptionValueFileColonLine::ToJSON(const ExecutionContext *exe_ctx) const {
StreamString stream;
if (m_file_spec)
stream << '"' << m_file_spec.GetPath().c_str() << '"';
if (m_line_number != LLDB_INVALID_LINE_NUMBER)
stream.Printf(":%d", m_line_number);
if (m_column_number != LLDB_INVALID_COLUMN_NUMBER)
stream.Printf(":%d", m_column_number);
return llvm::json::Value(stream.GetString());
}
Status OptionValueFileColonLine::SetValueFromString(llvm::StringRef value,
VarSetOperationType op) {
Status error;

View File

@ -42,7 +42,7 @@ void OptionValueFileSpecList::DumpValue(const ExecutionContext *exe_ctx,
}
llvm::json::Value
OptionValueFileSpecList::ToJSON(const ExecutionContext *exe_ctx) {
OptionValueFileSpecList::ToJSON(const ExecutionContext *exe_ctx) const {
std::lock_guard<std::recursive_mutex> lock(m_mutex);
llvm::json::Array array;
for (const auto &file_spec : m_current_value)

View File

@ -26,7 +26,8 @@ void OptionValueFormat::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
}
}
llvm::json::Value OptionValueFormat::ToJSON(const ExecutionContext *exe_ctx) {
llvm::json::Value
OptionValueFormat::ToJSON(const ExecutionContext *exe_ctx) const {
return FormatManager::GetFormatAsCString(m_current_value);
}

View File

@ -61,7 +61,7 @@ void OptionValueFormatEntity::DumpValue(const ExecutionContext *exe_ctx,
}
llvm::json::Value
OptionValueFormatEntity::ToJSON(const ExecutionContext *exe_ctx) {
OptionValueFormatEntity::ToJSON(const ExecutionContext *exe_ctx) const {
std::string escaped;
EscapeBackticks(m_current_format, escaped);
return escaped;

View File

@ -29,7 +29,8 @@ void OptionValueLanguage::DumpValue(const ExecutionContext *exe_ctx,
}
}
llvm::json::Value OptionValueLanguage::ToJSON(const ExecutionContext *exe_ctx) {
llvm::json::Value
OptionValueLanguage::ToJSON(const ExecutionContext *exe_ctx) const {
return Language::GetNameForLanguageType(m_current_value);
}

View File

@ -35,7 +35,7 @@ void OptionValuePathMappings::DumpValue(const ExecutionContext *exe_ctx,
}
llvm::json::Value
OptionValuePathMappings::ToJSON(const ExecutionContext *exe_ctx) {
OptionValuePathMappings::ToJSON(const ExecutionContext *exe_ctx) const {
return m_path_mappings.ToJSON();
}

View File

@ -335,7 +335,7 @@ void OptionValueProperties::DumpValue(const ExecutionContext *exe_ctx,
}
llvm::json::Value
OptionValueProperties::ToJSON(const ExecutionContext *exe_ctx) {
OptionValueProperties::ToJSON(const ExecutionContext *exe_ctx) const {
llvm::json::Object json_properties;
const size_t num_properties = m_properties.size();
for (size_t i = 0; i < num_properties; ++i) {

View File

@ -180,7 +180,7 @@ void PathMappingList::Dump(Stream *s, int pair_index) {
}
}
llvm::json::Value PathMappingList::ToJSON() {
llvm::json::Value PathMappingList::ToJSON() const {
llvm::json::Array entries;
std::lock_guard<std::mutex> lock(m_pairs_mutex);
for (const auto &pair : m_pairs) {

View File

@ -1044,6 +1044,10 @@ class SettingsCommandTestCase(TestBase):
# Test OptionValueEnumeration
self.verify_setting_value_json("target.x86-disassembly-flavor", "intel")
# Test OptionValueArch
self.verify_setting_value_json("target.default-arch", "x86_64")
self.runCmd("settings clear target.default-arch")
def test_global_option(self):
# This command used to crash the settings because -g was signaled by a
# NULL execution context (not one with an empty Target...) and in the