From 71441ea93288a8a66c93eefcf7b8ba0fd26f8526 Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Wed, 19 Apr 2023 12:16:45 +0330 Subject: [PATCH] Shell: Allow lossy conversion from list -> string in POSIX mode Similar to bash, this operation returns only the first element because reasons. --- Userland/Shell/AST.cpp | 11 +++++++++++ Userland/Shell/AST.h | 1 + 2 files changed, 12 insertions(+) diff --git a/Userland/Shell/AST.cpp b/Userland/Shell/AST.cpp index f155304c6d..572e7cfa5b 100644 --- a/Userland/Shell/AST.cpp +++ b/Userland/Shell/AST.cpp @@ -3691,6 +3691,17 @@ ErrorOr> ListValue::resolve_as_list(RefPtr shell) return resolve_slices(shell, move(values), m_slices); } +ErrorOr ListValue::resolve_as_string(RefPtr shell) +{ + if (!shell || !shell->posix_mode()) + return Value::resolve_as_string(shell); + + if (m_contained_values.is_empty()) + return resolve_slices(shell, String {}, m_slices); + + return resolve_slices(shell, TRY(m_contained_values[0]->resolve_as_string(shell)), m_slices); +} + ErrorOr> ListValue::resolve_without_cast(RefPtr shell) { Vector> values; diff --git a/Userland/Shell/AST.h b/Userland/Shell/AST.h index f70302ebb7..407afe02ad 100644 --- a/Userland/Shell/AST.h +++ b/Userland/Shell/AST.h @@ -310,6 +310,7 @@ private: class ListValue final : public Value { public: virtual ErrorOr> resolve_as_list(RefPtr) override; + virtual ErrorOr resolve_as_string(RefPtr) override; virtual ErrorOr> resolve_without_cast(RefPtr) override; virtual ErrorOr> clone() const override { return TRY(try_make_ref_counted(m_contained_values))->set_slices(m_slices); } virtual ~ListValue();