1//===-- OptionValueLanguage.cpp ---------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "lldb/Interpreter/OptionValueLanguage.h"
10
11#include "lldb/DataFormatters/FormatManager.h"
12#include "lldb/Target/Language.h"
13#include "lldb/Symbol/TypeSystem.h"
14#include "lldb/Utility/Args.h"
15#include "lldb/Utility/Stream.h"
16
17using namespace lldb;
18using namespace lldb_private;
19
20void OptionValueLanguage::DumpValue(const ExecutionContext *exe_ctx,
21                                    Stream &strm, uint32_t dump_mask) {
22  if (dump_mask & eDumpOptionType)
23    strm.Printf("(%s)", GetTypeAsCString());
24  if (dump_mask & eDumpOptionValue) {
25    if (dump_mask & eDumpOptionType)
26      strm.PutCString(" = ");
27    if (m_current_value != eLanguageTypeUnknown)
28      strm.PutCString(Language::GetNameForLanguageType(m_current_value));
29  }
30}
31
32Status OptionValueLanguage::SetValueFromString(llvm::StringRef value,
33                                               VarSetOperationType op) {
34  Status error;
35  switch (op) {
36  case eVarSetOperationClear:
37    Clear();
38    break;
39
40  case eVarSetOperationReplace:
41  case eVarSetOperationAssign: {
42    ConstString lang_name(value.trim());
43    LanguageSet languages_for_types = Language::GetLanguagesSupportingTypeSystems();
44    LanguageType new_type =
45        Language::GetLanguageTypeFromString(lang_name.GetStringRef());
46    if (new_type && languages_for_types[new_type]) {
47      m_value_was_set = true;
48      m_current_value = new_type;
49    } else {
50      StreamString error_strm;
51      error_strm.Printf("invalid language type '%s', ", value.str().c_str());
52      error_strm.Printf("valid values are:\n");
53      for (int bit : languages_for_types.bitvector.set_bits()) {
54        auto language = (LanguageType)bit;
55        error_strm.Printf("    %s\n",
56                          Language::GetNameForLanguageType(language));
57      }
58      error.SetErrorString(error_strm.GetString());
59    }
60  } break;
61
62  case eVarSetOperationInsertBefore:
63  case eVarSetOperationInsertAfter:
64  case eVarSetOperationRemove:
65  case eVarSetOperationAppend:
66  case eVarSetOperationInvalid:
67    error = OptionValue::SetValueFromString(value, op);
68    break;
69  }
70  return error;
71}
72
73lldb::OptionValueSP OptionValueLanguage::DeepCopy() const {
74  return OptionValueSP(new OptionValueLanguage(*this));
75}
76