summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnotherTest <ali.mpfard@gmail.com>2021-01-18 10:06:13 +0330
committerAndreas Kling <kling@serenityos.org>2021-01-19 08:19:43 +0100
commit5ec139e7280e6beca4a15d5ab7dc24fa105905ad (patch)
tree085e31cfc72c22f727a530cfb27b62c359c237ce
parent50473003be354d0f5bf07606dd22c4c3ac68ab6d (diff)
downloadserenity-5ec139e7280e6beca4a15d5ab7dc24fa105905ad.zip
Shell: Make 'if' expressions return the unevaluated value of blocks
This makes it possible to actually put them in a sequence and cast them to commands.
-rw-r--r--Userland/Shell/AST.cpp10
-rw-r--r--Userland/Shell/AST.h1
-rw-r--r--Userland/Shell/Shell.cpp7
3 files changed, 14 insertions, 4 deletions
diff --git a/Userland/Shell/AST.cpp b/Userland/Shell/AST.cpp
index d461b9fd6d..93dc4fee8e 100644
--- a/Userland/Shell/AST.cpp
+++ b/Userland/Shell/AST.cpp
@@ -1690,12 +1690,18 @@ IfCond::IfCond(Position position, Optional<Position> else_position, NonnullRefPt
if (m_true_branch) {
auto true_branch = m_true_branch.release_nonnull();
- m_true_branch = create<AST::Execute>(true_branch->position(), true_branch);
+ if (true_branch->is_execute())
+ m_true_branch = static_ptr_cast<AST::Execute>(true_branch)->command();
+ else
+ m_true_branch = move(true_branch);
}
if (m_false_branch) {
auto false_branch = m_false_branch.release_nonnull();
- m_false_branch = create<AST::Execute>(false_branch->position(), false_branch);
+ if (false_branch->is_execute())
+ m_false_branch = static_ptr_cast<AST::Execute>(false_branch)->command();
+ else
+ m_false_branch = move(false_branch);
}
}
diff --git a/Userland/Shell/AST.h b/Userland/Shell/AST.h
index ed2d947c98..6d74f0f512 100644
--- a/Userland/Shell/AST.h
+++ b/Userland/Shell/AST.h
@@ -984,7 +984,6 @@ private:
virtual RefPtr<Value> run(RefPtr<Shell>) override;
virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override;
virtual HitTestResult hit_test_position(size_t) override;
- virtual bool would_execute() const override { return true; }
virtual bool should_override_execution_in_current_process() const override { return true; }
NonnullRefPtr<AST::Node> m_condition;
diff --git a/Userland/Shell/Shell.cpp b/Userland/Shell/Shell.cpp
index c6168b8882..45954c7678 100644
--- a/Userland/Shell/Shell.cpp
+++ b/Userland/Shell/Shell.cpp
@@ -730,7 +730,12 @@ RefPtr<Job> Shell::run_command(const AST::Command& command)
}
}
- if (command.argv.is_empty() && !command.next_chain.is_empty() && command.should_immediately_execute_next && command.next_chain.first().node->should_override_execution_in_current_process()) {
+ if (command.argv.is_empty()
+ && !command.next_chain.is_empty()
+ && command.should_immediately_execute_next
+ && command.redirections.is_empty()
+ && command.next_chain.first().node->should_override_execution_in_current_process()) {
+
for (auto& next_in_chain : command.next_chain)
run_tail(command, next_in_chain, last_return_code);
return nullptr;