llvm-project/lldb/source/Core/UserSettingsController.cpp
Jim Ingham 8b57dcf829 Allows "experimental" settings that will either route to their containing
settings or raise no error if not found.

From time to time it is useful to add some setting to work around or enable
a transitory feature.  We've been reluctant to remove them later because then
we will break folks .lldbinit files.  With this change you can add an "experimental"
node to the settings.  If you later decide you want to keep the option, just move
it to the level that contained the "experimental" setting and it will still be
found.  Or just remove it - setting it will then silently fail and won't halt
the .lldbinit file execution.

llvm-svn: 274593
2016-07-06 01:27:33 +00:00

135 lines
3.9 KiB
C++

//====-- UserSettingsController.cpp ------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <string.h>
#include <algorithm>
#include "lldb/Core/UserSettingsController.h"
#include "lldb/Core/Error.h"
#include "lldb/Core/RegularExpression.h"
#include "lldb/Core/Stream.h"
#include "lldb/Core/StreamString.h"
#include "lldb/Interpreter/CommandInterpreter.h"
#include "lldb/Interpreter/OptionValueProperties.h"
#include "lldb/Interpreter/OptionValueString.h"
using namespace lldb;
using namespace lldb_private;
lldb::OptionValueSP
Properties::GetPropertyValue (const ExecutionContext *exe_ctx,
const char *path,
bool will_modify,
Error &error) const
{
OptionValuePropertiesSP properties_sp (GetValueProperties ());
if (properties_sp)
return properties_sp->GetSubValue(exe_ctx, path, will_modify, error);
return lldb::OptionValueSP();
}
Error
Properties::SetPropertyValue (const ExecutionContext *exe_ctx,
VarSetOperationType op,
const char *path,
const char *value)
{
OptionValuePropertiesSP properties_sp (GetValueProperties ());
if (properties_sp)
return properties_sp->SetSubValue(exe_ctx, op, path, value);
Error error;
error.SetErrorString ("no properties");
return error;
}
void
Properties::DumpAllPropertyValues (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
{
OptionValuePropertiesSP properties_sp (GetValueProperties ());
if (properties_sp)
return properties_sp->DumpValue (exe_ctx, strm, dump_mask);
}
void
Properties::DumpAllDescriptions (CommandInterpreter &interpreter,
Stream &strm) const
{
strm.PutCString("Top level variables:\n\n");
OptionValuePropertiesSP properties_sp (GetValueProperties ());
if (properties_sp)
return properties_sp->DumpAllDescriptions (interpreter, strm);
}
Error
Properties::DumpPropertyValue (const ExecutionContext *exe_ctx, Stream &strm, const char *property_path, uint32_t dump_mask)
{
OptionValuePropertiesSP properties_sp (GetValueProperties ());
if (properties_sp)
{
return properties_sp->DumpPropertyValue (exe_ctx,
strm,
property_path,
dump_mask);
}
Error error;
error.SetErrorString("empty property list");
return error;
}
size_t
Properties::Apropos (const char *keyword, std::vector<const Property *> &matching_properties) const
{
OptionValuePropertiesSP properties_sp (GetValueProperties ());
if (properties_sp)
{
properties_sp->Apropos (keyword, matching_properties);
}
return matching_properties.size();
}
lldb::OptionValuePropertiesSP
Properties::GetSubProperty (const ExecutionContext *exe_ctx,
const ConstString &name)
{
OptionValuePropertiesSP properties_sp (GetValueProperties ());
if (properties_sp)
return properties_sp->GetSubProperty (exe_ctx, name);
return lldb::OptionValuePropertiesSP();
}
const char *
Properties::GetExperimentalSettingsName()
{
return "experimental";
}
bool
Properties::IsSettingExperimental(const char *setting)
{
if (setting == nullptr)
return false;
const char *experimental = GetExperimentalSettingsName();
char *dot_pos = strchr(setting, '.');
if (dot_pos == nullptr)
return strcmp(experimental, setting) == 0;
else
{
size_t first_elem_len = dot_pos - setting;
return strncmp(experimental, setting, first_elem_len) == 0;
}
}