OptionValueUUID.cpp revision 360784
1230592Sken//===-- OptionValueUUID.cpp ------------------------------------*- C++ -*-===//
2237683Sken//
3230592Sken// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4230592Sken// See https://llvm.org/LICENSE.txt for license information.
5230592Sken// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6230592Sken//
7230592Sken//===----------------------------------------------------------------------===//
8230592Sken
9230592Sken#include "lldb/Interpreter/OptionValueUUID.h"
10230592Sken
11230592Sken#include "lldb/Core/Module.h"
12230592Sken#include "lldb/Interpreter/CommandInterpreter.h"
13230592Sken#include "lldb/Utility/Stream.h"
14230592Sken#include "lldb/Utility/StringList.h"
15230592Sken
16230592Skenusing namespace lldb;
17230592Skenusing namespace lldb_private;
18230592Sken
19230592Skenvoid OptionValueUUID::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
20230592Sken                                uint32_t dump_mask) {
21230592Sken  if (dump_mask & eDumpOptionType)
22230592Sken    strm.Printf("(%s)", GetTypeAsCString());
23230592Sken  if (dump_mask & eDumpOptionValue) {
24230592Sken    if (dump_mask & eDumpOptionType)
25230592Sken      strm.PutCString(" = ");
26230592Sken    m_uuid.Dump(&strm);
27230592Sken  }
28230592Sken}
29230592Sken
30230592SkenStatus OptionValueUUID::SetValueFromString(llvm::StringRef value,
31212420Sken                                           VarSetOperationType op) {
32237683Sken  Status error;
33212420Sken  switch (op) {
34212420Sken  case eVarSetOperationClear:
35212420Sken    Clear();
36212420Sken    NotifyValueChanged();
37212420Sken    break;
38212420Sken
39230592Sken  case eVarSetOperationReplace:
40212420Sken  case eVarSetOperationAssign: {
41212420Sken    if (m_uuid.SetFromStringRef(value) == 0)
42212420Sken      error.SetErrorStringWithFormat("invalid uuid string value '%s'",
43212420Sken                                     value.str().c_str());
44212420Sken    else {
45212420Sken      m_value_was_set = true;
46212420Sken      NotifyValueChanged();
47212420Sken    }
48212420Sken  } break;
49212420Sken
50212420Sken  case eVarSetOperationInsertBefore:
51212420Sken  case eVarSetOperationInsertAfter:
52212420Sken  case eVarSetOperationRemove:
53212420Sken  case eVarSetOperationAppend:
54212420Sken  case eVarSetOperationInvalid:
55230592Sken    error = OptionValue::SetValueFromString(value, op);
56230592Sken    break;
57230592Sken  }
58212420Sken  return error;
59212420Sken}
60212420Sken
61212420Skenlldb::OptionValueSP OptionValueUUID::DeepCopy() const {
62212420Sken  return OptionValueSP(new OptionValueUUID(*this));
63212420Sken}
64212420Sken
65212420Skenvoid OptionValueUUID::AutoComplete(CommandInterpreter &interpreter,
66212420Sken                                   CompletionRequest &request) {
67212420Sken  ExecutionContext exe_ctx(interpreter.GetExecutionContext());
68212420Sken  Target *target = exe_ctx.GetTargetPtr();
69212420Sken  if (!target)
70212420Sken    return;
71212420Sken  auto prefix = request.GetCursorArgumentPrefix();
72212420Sken  llvm::SmallVector<uint8_t, 20> uuid_bytes;
73230592Sken  if (!UUID::DecodeUUIDBytesFromString(prefix, uuid_bytes).empty())
74212420Sken    return;
75212420Sken  const size_t num_modules = target->GetImages().GetSize();
76212420Sken  for (size_t i = 0; i < num_modules; ++i) {
77212420Sken    ModuleSP module_sp(target->GetImages().GetModuleAtIndex(i));
78212420Sken    if (!module_sp)
79212420Sken      continue;
80212420Sken    const UUID &module_uuid = module_sp->GetUUID();
81212420Sken    if (!module_uuid.IsValid())
82212420Sken      continue;
83212420Sken    request.TryCompleteCurrentArg(module_uuid.GetAsString());
84212420Sken  }
85212420Sken}
86212420Sken