mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-29 16:21:29 +00:00
Shell: Actually execute loop/case bodies when running them
This commit is contained in:
parent
7b031138fc
commit
bbfedf17b7
Notes:
sideshowbarker
2024-07-17 03:19:14 +09:00
Author: https://github.com/alimpfard Commit: https://github.com/SerenityOS/serenity/commit/bbfedf17b7 Pull-request: https://github.com/SerenityOS/serenity/pull/18429 Reviewed-by: https://github.com/nico ✅
|
@ -780,7 +780,7 @@ ErrorOr<RefPtr<AST::Node>> Parser::parse_command()
|
|||
return node;
|
||||
|
||||
if (auto node = TRY(parse_simple_command()))
|
||||
return node;
|
||||
return make_ref_counted<AST::CastToCommand>(node->position(), *node);
|
||||
|
||||
auto node = TRY(parse_compound_command());
|
||||
if (!node)
|
||||
|
@ -800,7 +800,7 @@ ErrorOr<RefPtr<AST::Node>> Parser::parse_command()
|
|||
if (!node)
|
||||
return nullptr;
|
||||
|
||||
return make_ref_counted<AST::CastToCommand>(node->position(), *node);
|
||||
return node;
|
||||
}
|
||||
|
||||
ErrorOr<RefPtr<AST::Node>> Parser::parse_function_definition()
|
||||
|
@ -929,19 +929,21 @@ ErrorOr<RefPtr<AST::Node>> Parser::parse_while_clause()
|
|||
"Expected 'do' after 'while'"_string.release_value_but_fixme_should_propagate_errors());
|
||||
|
||||
// while foo; bar -> loop { if foo { bar } else { break } }
|
||||
auto position = start_position.with_end(peek().position.value_or(empty_position()));
|
||||
return make_ref_counted<AST::ForLoop>(
|
||||
start_position.with_end(peek().position.value_or(empty_position())),
|
||||
position,
|
||||
Optional<AST::NameWithPosition> {},
|
||||
Optional<AST::NameWithPosition> {},
|
||||
nullptr,
|
||||
make_ref_counted<AST::IfCond>(
|
||||
start_position.with_end(peek().position.value_or(empty_position())),
|
||||
Optional<AST::Position> {},
|
||||
condition.release_nonnull(),
|
||||
do_group.release_nonnull(),
|
||||
make_ref_counted<AST::ContinuationControl>(
|
||||
start_position,
|
||||
AST::ContinuationControl::ContinuationKind::Break)));
|
||||
make_ref_counted<AST::Execute>(position,
|
||||
make_ref_counted<AST::IfCond>(
|
||||
position,
|
||||
Optional<AST::Position> {},
|
||||
condition.release_nonnull(),
|
||||
do_group.release_nonnull(),
|
||||
make_ref_counted<AST::ContinuationControl>(
|
||||
start_position,
|
||||
AST::ContinuationControl::ContinuationKind::Break))));
|
||||
}
|
||||
|
||||
ErrorOr<RefPtr<AST::Node>> Parser::parse_until_clause()
|
||||
|
@ -963,19 +965,21 @@ ErrorOr<RefPtr<AST::Node>> Parser::parse_until_clause()
|
|||
"Expected 'do' after 'until'"_string.release_value_but_fixme_should_propagate_errors());
|
||||
|
||||
// until foo; bar -> loop { if foo { break } else { bar } }
|
||||
auto position = start_position.with_end(peek().position.value_or(empty_position()));
|
||||
return make_ref_counted<AST::ForLoop>(
|
||||
start_position.with_end(peek().position.value_or(empty_position())),
|
||||
position,
|
||||
Optional<AST::NameWithPosition> {},
|
||||
Optional<AST::NameWithPosition> {},
|
||||
nullptr,
|
||||
make_ref_counted<AST::IfCond>(
|
||||
start_position.with_end(peek().position.value_or(empty_position())),
|
||||
Optional<AST::Position> {},
|
||||
condition.release_nonnull(),
|
||||
make_ref_counted<AST::ContinuationControl>(
|
||||
start_position,
|
||||
AST::ContinuationControl::ContinuationKind::Break),
|
||||
do_group.release_nonnull()));
|
||||
make_ref_counted<AST::Execute>(position,
|
||||
make_ref_counted<AST::IfCond>(
|
||||
position,
|
||||
Optional<AST::Position> {},
|
||||
condition.release_nonnull(),
|
||||
make_ref_counted<AST::ContinuationControl>(
|
||||
start_position,
|
||||
AST::ContinuationControl::ContinuationKind::Break),
|
||||
do_group.release_nonnull())));
|
||||
}
|
||||
|
||||
ErrorOr<RefPtr<AST::Node>> Parser::parse_brace_group()
|
||||
|
@ -1084,12 +1088,13 @@ ErrorOr<RefPtr<AST::Node>> Parser::parse_case_clause()
|
|||
syntax_error = nullptr;
|
||||
}
|
||||
|
||||
auto position = compound_list->position();
|
||||
entries.append(AST::MatchEntry {
|
||||
.options = move(result.nodes),
|
||||
.match_names = {},
|
||||
.match_as_position = {},
|
||||
.pipe_positions = move(result.pipe_positions),
|
||||
.body = move(compound_list),
|
||||
.body = make_ref_counted<AST::Execute>(position, compound_list.release_nonnull()),
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue