1 //===-- OptionValueFormat.cpp -----------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/Interpreter/OptionValueLanguage.h"
11 
12 // C Includes
13 // C++ Includes
14 // Other libraries and framework includes
15 // Project includes
16 #include "lldb/Core/Stream.h"
17 #include "lldb/DataFormatters/FormatManager.h"
18 #include "lldb/Interpreter/Args.h"
19 #include "lldb/Target/Language.h"
20 
21 using namespace lldb;
22 using namespace lldb_private;
23 
24 void
25 OptionValueLanguage::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
26 {
27     if (dump_mask & eDumpOptionType)
28         strm.Printf ("(%s)", GetTypeAsCString ());
29     if (dump_mask & eDumpOptionValue)
30     {
31         if (dump_mask & eDumpOptionType)
32             strm.PutCString (" = ");
33         strm.PutCString (Language::GetNameForLanguageType(m_current_value));
34     }
35 }
36 
37 Error
38 OptionValueLanguage::SetValueFromString (llvm::StringRef value, VarSetOperationType op)
39 {
40     Error error;
41     switch (op)
42     {
43     case eVarSetOperationClear:
44         Clear();
45         break;
46 
47     case eVarSetOperationReplace:
48     case eVarSetOperationAssign:
49         {
50             ConstString lang_name(value.trim());
51             std::set<lldb::LanguageType> languages_for_types;
52             std::set<lldb::LanguageType> languages_for_expressions;
53             Language::GetLanguagesSupportingTypeSystems(languages_for_types, languages_for_expressions);
54 
55             LanguageType new_type = Language::GetLanguageTypeFromString(lang_name.GetCString());
56             if (new_type && languages_for_types.count(new_type))
57             {
58                 m_value_was_set = true;
59                 m_current_value = new_type;
60             }
61             else
62             {
63                 StreamString error_strm;
64                 error_strm.Printf("invalid language type '%s', ", value.str().c_str());
65                 error_strm.Printf("valid values are:\n");
66                 for (lldb::LanguageType language : languages_for_types)
67                 {
68                     error_strm.Printf("%s%s%s", "    ", Language::GetNameForLanguageType(language), "\n");
69                 }
70                 error.SetErrorString(error_strm.GetData());
71             }
72         }
73         break;
74 
75     case eVarSetOperationInsertBefore:
76     case eVarSetOperationInsertAfter:
77     case eVarSetOperationRemove:
78     case eVarSetOperationAppend:
79     case eVarSetOperationInvalid:
80         error = OptionValue::SetValueFromString(value, op);
81         break;
82     }
83     return error;
84 }
85 
86 
87 lldb::OptionValueSP
88 OptionValueLanguage::DeepCopy () const
89 {
90     return OptionValueSP(new OptionValueLanguage(*this));
91 }
92 
93