llvm-project/lldb/source/Interpreter/OptionValueLanguage.cpp
Dave Lee 545cda649e
[lldb] Add flag to "settings show" to include default values (#153233)
Adds a `--defaults`/`-d` flag to `settings show`. This mode will _optionally_ show a
setting's default value. In other words, this does not always print a default value for
every setting.

A default value is not shown when the current value _is_ the default.

Note: some setting types do not print empty or invalid values. For these setting types,
if the default value is empty or invalid, the same elision logic is applied to printing
the default value.
2025-08-21 13:41:38 -07:00

82 lines
2.8 KiB
C++

//===-- OptionValueLanguage.cpp -------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "lldb/Interpreter/OptionValueLanguage.h"
#include "lldb/DataFormatters/FormatManager.h"
#include "lldb/Interpreter/OptionValue.h"
#include "lldb/Symbol/TypeSystem.h"
#include "lldb/Target/Language.h"
#include "lldb/Utility/Args.h"
#include "lldb/Utility/Stream.h"
using namespace lldb;
using namespace lldb_private;
void OptionValueLanguage::DumpValue(const ExecutionContext *exe_ctx,
Stream &strm, uint32_t dump_mask) {
if (dump_mask & eDumpOptionType)
strm.Printf("(%s)", GetTypeAsCString());
if (dump_mask & eDumpOptionValue) {
if (dump_mask & eDumpOptionType)
strm.PutCString(" = ");
if (m_current_value != eLanguageTypeUnknown)
strm.PutCString(Language::GetNameForLanguageType(m_current_value));
if (dump_mask & eDumpOptionDefaultValue &&
m_current_value != m_default_value &&
m_default_value != eLanguageTypeUnknown) {
DefaultValueFormat label(strm);
strm.PutCString(Language::GetNameForLanguageType(m_default_value));
}
}
}
llvm::json::Value
OptionValueLanguage::ToJSON(const ExecutionContext *exe_ctx) const {
return Language::GetNameForLanguageType(m_current_value);
}
Status OptionValueLanguage::SetValueFromString(llvm::StringRef value,
VarSetOperationType op) {
Status error;
switch (op) {
case eVarSetOperationClear:
Clear();
break;
case eVarSetOperationReplace:
case eVarSetOperationAssign: {
LanguageSet languages_for_types = Language::GetLanguagesSupportingTypeSystems();
LanguageType new_type = Language::GetLanguageTypeFromString(value.trim());
if (new_type && languages_for_types[new_type]) {
m_value_was_set = true;
m_current_value = new_type;
} else {
StreamString error_strm;
error_strm.Printf("invalid language type '%s', ", value.str().c_str());
error_strm.Printf("valid values are:\n");
for (int bit : languages_for_types.bitvector.set_bits()) {
auto language = (LanguageType)bit;
error_strm.Printf(" %s\n",
Language::GetNameForLanguageType(language));
}
error = Status(error_strm.GetString().str());
}
} break;
case eVarSetOperationInsertBefore:
case eVarSetOperationInsertAfter:
case eVarSetOperationRemove:
case eVarSetOperationAppend:
case eVarSetOperationInvalid:
error = OptionValue::SetValueFromString(value, op);
break;
}
return error;
}