1*80814287SRaphael Isemann //===-- OptionValueLanguage.cpp -------------------------------------------===//
28fdf7859SEnrico Granata //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68fdf7859SEnrico Granata //
78fdf7859SEnrico Granata //===----------------------------------------------------------------------===//
88fdf7859SEnrico Granata 
98fdf7859SEnrico Granata #include "lldb/Interpreter/OptionValueLanguage.h"
108fdf7859SEnrico Granata 
118fdf7859SEnrico Granata #include "lldb/DataFormatters/FormatManager.h"
120e0984eeSJim Ingham #include "lldb/Target/Language.h"
13aa97a89dSAdrian Prantl #include "lldb/Symbol/TypeSystem.h"
14145d95c9SPavel Labath #include "lldb/Utility/Args.h"
15bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
168fdf7859SEnrico Granata 
178fdf7859SEnrico Granata using namespace lldb;
188fdf7859SEnrico Granata using namespace lldb_private;
198fdf7859SEnrico Granata 
DumpValue(const ExecutionContext * exe_ctx,Stream & strm,uint32_t dump_mask)20b9c1b51eSKate Stone void OptionValueLanguage::DumpValue(const ExecutionContext *exe_ctx,
21b9c1b51eSKate Stone                                     Stream &strm, uint32_t dump_mask) {
228fdf7859SEnrico Granata   if (dump_mask & eDumpOptionType)
238fdf7859SEnrico Granata     strm.Printf("(%s)", GetTypeAsCString());
24b9c1b51eSKate Stone   if (dump_mask & eDumpOptionValue) {
258fdf7859SEnrico Granata     if (dump_mask & eDumpOptionType)
268fdf7859SEnrico Granata       strm.PutCString(" = ");
27b76e25a2SJonas Devlieghere     if (m_current_value != eLanguageTypeUnknown)
280e0984eeSJim Ingham       strm.PutCString(Language::GetNameForLanguageType(m_current_value));
298fdf7859SEnrico Granata   }
308fdf7859SEnrico Granata }
318fdf7859SEnrico Granata 
SetValueFromString(llvm::StringRef value,VarSetOperationType op)3297206d57SZachary Turner Status OptionValueLanguage::SetValueFromString(llvm::StringRef value,
33b9c1b51eSKate Stone                                                VarSetOperationType op) {
3497206d57SZachary Turner   Status error;
35b9c1b51eSKate Stone   switch (op) {
368fdf7859SEnrico Granata   case eVarSetOperationClear:
378fdf7859SEnrico Granata     Clear();
388fdf7859SEnrico Granata     break;
398fdf7859SEnrico Granata 
408fdf7859SEnrico Granata   case eVarSetOperationReplace:
41b9c1b51eSKate Stone   case eVarSetOperationAssign: {
4223b1decbSDawn Perchik     ConstString lang_name(value.trim());
43aa97a89dSAdrian Prantl     LanguageSet languages_for_types = Language::GetLanguagesSupportingTypeSystems();
44b9c1b51eSKate Stone     LanguageType new_type =
456fa7681bSZachary Turner         Language::GetLanguageTypeFromString(lang_name.GetStringRef());
46aa97a89dSAdrian Prantl     if (new_type && languages_for_types[new_type]) {
478fdf7859SEnrico Granata       m_value_was_set = true;
488fdf7859SEnrico Granata       m_current_value = new_type;
49b9c1b51eSKate Stone     } else {
5023b1decbSDawn Perchik       StreamString error_strm;
5123b1decbSDawn Perchik       error_strm.Printf("invalid language type '%s', ", value.str().c_str());
5223b1decbSDawn Perchik       error_strm.Printf("valid values are:\n");
53aa97a89dSAdrian Prantl       for (int bit : languages_for_types.bitvector.set_bits()) {
54aa97a89dSAdrian Prantl         auto language = (LanguageType)bit;
55aa97a89dSAdrian Prantl         error_strm.Printf("    %s\n",
56aa97a89dSAdrian Prantl                           Language::GetNameForLanguageType(language));
57fe38c850SSean Callanan       }
58c156427dSZachary Turner       error.SetErrorString(error_strm.GetString());
5923b1decbSDawn Perchik     }
60b9c1b51eSKate Stone   } break;
618fdf7859SEnrico Granata 
628fdf7859SEnrico Granata   case eVarSetOperationInsertBefore:
638fdf7859SEnrico Granata   case eVarSetOperationInsertAfter:
648fdf7859SEnrico Granata   case eVarSetOperationRemove:
658fdf7859SEnrico Granata   case eVarSetOperationAppend:
668fdf7859SEnrico Granata   case eVarSetOperationInvalid:
678fdf7859SEnrico Granata     error = OptionValue::SetValueFromString(value, op);
688fdf7859SEnrico Granata     break;
698fdf7859SEnrico Granata   }
708fdf7859SEnrico Granata   return error;
718fdf7859SEnrico Granata }
72