1 //===-- OptionValueLanguage.cpp -------------------------------------------===// 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 17 using namespace lldb; 18 using namespace lldb_private; 19 20 void 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 32 llvm::json::Value OptionValueLanguage::ToJSON(const ExecutionContext *exe_ctx) { 33 return Language::GetNameForLanguageType(m_current_value); 34 } 35 36 Status OptionValueLanguage::SetValueFromString(llvm::StringRef value, 37 VarSetOperationType op) { 38 Status error; 39 switch (op) { 40 case eVarSetOperationClear: 41 Clear(); 42 break; 43 44 case eVarSetOperationReplace: 45 case eVarSetOperationAssign: { 46 ConstString lang_name(value.trim()); 47 LanguageSet languages_for_types = Language::GetLanguagesSupportingTypeSystems(); 48 LanguageType new_type = 49 Language::GetLanguageTypeFromString(lang_name.GetStringRef()); 50 if (new_type && languages_for_types[new_type]) { 51 m_value_was_set = true; 52 m_current_value = new_type; 53 } else { 54 StreamString error_strm; 55 error_strm.Printf("invalid language type '%s', ", value.str().c_str()); 56 error_strm.Printf("valid values are:\n"); 57 for (int bit : languages_for_types.bitvector.set_bits()) { 58 auto language = (LanguageType)bit; 59 error_strm.Printf(" %s\n", 60 Language::GetNameForLanguageType(language)); 61 } 62 error.SetErrorString(error_strm.GetString()); 63 } 64 } break; 65 66 case eVarSetOperationInsertBefore: 67 case eVarSetOperationInsertAfter: 68 case eVarSetOperationRemove: 69 case eVarSetOperationAppend: 70 case eVarSetOperationInvalid: 71 error = OptionValue::SetValueFromString(value, op); 72 break; 73 } 74 return error; 75 } 76