25#include "llvm/ADT/StringRef.h"
35 "Print a variable or expression.",
36 "dwim-print [<variable-name> | <expression>]",
37 eCommandProcessMustBePaused | eCommandTryTargetAPILock) {
45 StringRef exclude_expr_options[] = {
"debug",
"top-level"};
104 auto maybe_add_hint = [&](llvm::StringRef output) {
105 static bool note_shown =
false;
118 static const std::regex swift_class_regex(
119 "^<\\S+: 0x[[:xdigit:]]{5,}>\\s*$");
121 if (
GetDebugger().GetShowDontUsePoHint() && target_ptr &&
124 std::regex_match(output.data(), swift_class_regex)) {
127 "object description requested, but type doesn't implement "
128 "a custom object description. Consider using \"p\" instead of "
129 "\"po\" (this note will only be shown once per debug session).\n");
138 if (llvm::Error
error = valobj.Dump(temp_result_stream, dump_options)) {
142 llvm::StringRef output = temp_result_stream.
GetString();
143 maybe_add_hint(output);
166 const bool try_variable_path =
167 expr.find_first_of(
"*&->[]") == StringRef::npos;
168 if (frame && try_variable_path) {
175 if (valobj_sp && status.
Success() && valobj_sp->GetError().Success()) {
176 if (!suppress_result) {
177 if (
auto persisted_valobj = valobj_sp->Persist())
178 valobj_sp = persisted_valobj;
189 dump_val_object(*valobj_sp);
195 if (expr.starts_with(
"$"))
197 if (
auto var_sp = state->GetVariable(expr))
198 if (
auto valobj_sp = var_sp->GetValueObject()) {
199 dump_val_object(*valobj_sp);
205 auto *exe_scope =
m_exe_ctx.GetBestExecutionContextScope();
207 std::string fixed_expression;
210 expr, exe_scope, valobj_sp, eval_options, &fixed_expression);
216 std::optional<uint16_t> indent;
217 if (fixed_expression.empty()) {
219 if (pos != llvm::StringRef::npos)
230 error_stream <<
" Evaluated this expression after applying Fix-It(s):\n";
231 error_stream <<
" " << fixed_expression <<
"\n";
237 result.
SetError(valobj_sp->GetError().Clone());
240 "unknown error evaluating expression `{0}`", expr);
252 dump_val_object(*valobj_sp);
257 if (
auto result_var_sp =
259 auto language = valobj_sp->GetPreferredDisplayLanguage();
260 if (
auto *persistent_state =
262 persistent_state->RemovePersistentVariable(result_var_sp);
static llvm::raw_ostream & error(Stream &strm)
Options * GetOptions() override
CommandObjectExpression::CommandOptions m_expr_options
OptionGroupFormat m_format_options
OptionGroupOptions m_option_group
CommandObjectDWIMPrint(CommandInterpreter &interpreter)
OptionGroupValueObjectDisplay m_varobj_options
void DoExecute(llvm::StringRef command, CommandReturnObject &result) override
CommandObjectRaw(CommandInterpreter &interpreter, llvm::StringRef name, llvm::StringRef help="", llvm::StringRef syntax="", uint32_t flags=0)
void AddSimpleArgumentList(lldb::CommandArgumentType arg_type, ArgumentRepetitionType repetition_type=eArgRepeatPlain)
bool ParseOptionsAndNotify(Args &args, CommandReturnObject &result, OptionGroupOptions &group_options, ExecutionContext &exe_ctx)
Target & GetDummyTarget()
ExecutionContext m_exe_ctx
CommandInterpreter & m_interpreter
std::string m_original_command
void void AppendError(llvm::StringRef in_string)
const ValueObjectList & GetValueObjectList() const
void void AppendNote(llvm::StringRef in_string)
Stream & GetErrorStream()
void SetStatus(lldb::ReturnStatus status)
void SetError(Status error)
void SetDiagnosticIndent(std::optional< uint16_t > indent)
void AppendNoteWithFormatv(const char *format, Args &&...args)
void AppendErrorWithFormatv(const char *format, Args &&...args)
Stream & GetOutputStream()
lldb::DWIMPrintVerbosity GetDWIMPrintVerbosity() const
DumpValueObjectOptions & SetHideRootName(bool hide_root_name)
DumpValueObjectOptions & SetExpandPointerTypeFlags(unsigned flags)
lldb::DynamicValueType GetUseDynamic() const
void SetSuppressPersistentResult(bool b)
A pair of an option list with a 'raw' string as a suffix.
bool HasArgs() const
Returns true if there are any arguments before the raw suffix.
Args & GetArgs()
Returns the list of arguments.
llvm::StringRef GetArgString() const
Returns the part of the input string that was used for parsing the argument list.
const std::string & GetRawPart() const
Returns the raw suffix part of the parsed string.
llvm::StringRef GetArgStringWithDelimiter() const
Returns the part of the input string that was used for parsing the argument list.
A command line option parsing protocol class.
This base class provides an interface to stack frames.
@ eExpressionPathOptionsAllowDirectIVarAccess
lldb::ValueObjectSP GetValueForVariableExpressionPath(llvm::StringRef var_expr, lldb::DynamicValueType use_dynamic, uint32_t options, lldb::VariableSP &var_sp, Status &error)
Create a ValueObject for a variable name / pathname, possibly including simple dereference/child sele...
SourceLanguage GuessLanguage()
Similar to GetLanguage(), but is allowed to take a potentially incorrect guess if exact information i...
bool Success() const
Test for success condition.
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
bool GetEnableNotifyAboutFixIts() const
PersistentExpressionState * GetPersistentExpressionStateForLanguage(lldb::LanguageType language)
lldb::ExpressionVariableSP GetPersistentVariable(ConstString name)
lldb::ExpressionResults EvaluateExpression(llvm::StringRef expression, ExecutionContextScope *exe_scope, lldb::ValueObjectSP &result_valobj_sp, const EvaluateExpressionOptions &options=EvaluateExpressionOptions(), std::string *fixed_expression=nullptr, ValueObject *ctx_obj=nullptr)
static const Status::ValueType kNoResult
ValueObject::GetError() returns this if there is no result from the expression.
void Append(const lldb::ValueObjectSP &val_obj_sp)
A class that represents a running process on the host machine.
const char * toString(AppleArm64ExceptionClass EC)
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
@ eDWIMPrintVerbosityFull
Always print a message indicating how dwim-print is evaluating its expression.
@ eDWIMPrintVerbosityNone
Run dwim-print with no verbosity.
LanguageType
Programming language type.
@ eLanguageTypeUnknown
Unknown or invalid language value.
@ eLanguageTypeSwift
Swift.
@ eLanguageTypeObjC
Objective-C.
ExpressionResults
The results of expression evaluation.
@ eReturnStatusSuccessFinishResult
@ eReturnStatusSuccessFinishNoResult
std::shared_ptr< lldb_private::Variable > VariableSP
lldb::LanguageType AsLanguageType() const