
These three classes have no external dependencies, but they are used from various low-level APIs. Moving them down to Utility improves overall code layering (although it still does not break any particular dependency completely). The XCode project will need to be updated after this change. Differential Revision: https://reviews.llvm.org/D49740 llvm-svn: 339127
120 lines
4.3 KiB
C++
120 lines
4.3 KiB
C++
//===-- OptionValueFileSpec.cpp ---------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Interpreter/OptionValueFileSpec.h"
|
|
|
|
#include "lldb/DataFormatters/FormatManager.h"
|
|
#include "lldb/Host/FileSystem.h"
|
|
#include "lldb/Interpreter/CommandCompletions.h"
|
|
#include "lldb/Interpreter/CommandInterpreter.h"
|
|
#include "lldb/Utility/Args.h"
|
|
#include "lldb/Utility/DataBufferLLVM.h"
|
|
#include "lldb/Utility/State.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
OptionValueFileSpec::OptionValueFileSpec(bool resolve)
|
|
: OptionValue(), m_current_value(), m_default_value(), m_data_sp(),
|
|
m_data_mod_time(),
|
|
m_completion_mask(CommandCompletions::eDiskFileCompletion),
|
|
m_resolve(resolve) {}
|
|
|
|
OptionValueFileSpec::OptionValueFileSpec(const FileSpec &value, bool resolve)
|
|
: OptionValue(), m_current_value(value), m_default_value(value),
|
|
m_data_sp(), m_data_mod_time(),
|
|
m_completion_mask(CommandCompletions::eDiskFileCompletion),
|
|
m_resolve(resolve) {}
|
|
|
|
OptionValueFileSpec::OptionValueFileSpec(const FileSpec ¤t_value,
|
|
const FileSpec &default_value,
|
|
bool resolve)
|
|
: OptionValue(), m_current_value(current_value),
|
|
m_default_value(default_value), m_data_sp(), m_data_mod_time(),
|
|
m_completion_mask(CommandCompletions::eDiskFileCompletion),
|
|
m_resolve(resolve) {}
|
|
|
|
void OptionValueFileSpec::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) {
|
|
strm << '"' << m_current_value.GetPath().c_str() << '"';
|
|
}
|
|
}
|
|
}
|
|
|
|
Status OptionValueFileSpec::SetValueFromString(llvm::StringRef value,
|
|
VarSetOperationType op) {
|
|
Status error;
|
|
switch (op) {
|
|
case eVarSetOperationClear:
|
|
Clear();
|
|
NotifyValueChanged();
|
|
break;
|
|
|
|
case eVarSetOperationReplace:
|
|
case eVarSetOperationAssign:
|
|
if (value.size() > 0) {
|
|
// The setting value may have whitespace, double-quotes, or single-quotes
|
|
// around the file path to indicate that internal spaces are not word
|
|
// breaks. Strip off any ws & quotes from the start and end of the file
|
|
// path - we aren't doing any word // breaking here so the quoting is
|
|
// unnecessary. NB this will cause a problem if someone tries to specify
|
|
// a file path that legitimately begins or ends with a " or ' character,
|
|
// or whitespace.
|
|
value = value.trim("\"' \t");
|
|
m_value_was_set = true;
|
|
m_current_value.SetFile(value.str(), m_resolve, FileSpec::Style::native);
|
|
m_data_sp.reset();
|
|
m_data_mod_time = llvm::sys::TimePoint<>();
|
|
NotifyValueChanged();
|
|
} else {
|
|
error.SetErrorString("invalid value string");
|
|
}
|
|
break;
|
|
|
|
case eVarSetOperationInsertBefore:
|
|
case eVarSetOperationInsertAfter:
|
|
case eVarSetOperationRemove:
|
|
case eVarSetOperationAppend:
|
|
case eVarSetOperationInvalid:
|
|
error = OptionValue::SetValueFromString(value, op);
|
|
break;
|
|
}
|
|
return error;
|
|
}
|
|
|
|
lldb::OptionValueSP OptionValueFileSpec::DeepCopy() const {
|
|
return OptionValueSP(new OptionValueFileSpec(*this));
|
|
}
|
|
|
|
size_t OptionValueFileSpec::AutoComplete(CommandInterpreter &interpreter,
|
|
CompletionRequest &request) {
|
|
request.SetWordComplete(false);
|
|
CommandCompletions::InvokeCommonCompletionCallbacks(
|
|
interpreter, m_completion_mask, request, nullptr);
|
|
return request.GetNumberOfMatches();
|
|
}
|
|
|
|
const lldb::DataBufferSP &OptionValueFileSpec::GetFileContents() {
|
|
if (m_current_value) {
|
|
const auto file_mod_time = FileSystem::GetModificationTime(m_current_value);
|
|
if (m_data_sp && m_data_mod_time == file_mod_time)
|
|
return m_data_sp;
|
|
m_data_sp = DataBufferLLVM::CreateFromPath(m_current_value.GetPath());
|
|
m_data_mod_time = file_mod_time;
|
|
}
|
|
return m_data_sp;
|
|
}
|