mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-27 06:48:49 +00:00
LibJS: Implement logical assignment operators (&&=, ||=, ??=)
TC39 proposal, stage 4 as of 2020-07. https://tc39.es/proposal-logical-assignment/
This commit is contained in:
parent
d8d00d3ac7
commit
aa71dae03c
Notes:
sideshowbarker
2024-07-19 02:02:06 +09:00
Author: https://github.com/linusg
Commit: aa71dae03c
Pull-request: https://github.com/SerenityOS/serenity/pull/3695
6 changed files with 108 additions and 6 deletions
|
@ -165,8 +165,11 @@ private:
|
|||
{ TokenType::ShiftRightEquals, 3 },
|
||||
{ TokenType::UnsignedShiftRightEquals, 3 },
|
||||
{ TokenType::AmpersandEquals, 3 },
|
||||
{ TokenType::PipeEquals, 3 },
|
||||
{ TokenType::CaretEquals, 3 },
|
||||
{ TokenType::PipeEquals, 3 },
|
||||
{ TokenType::DoubleAmpersandEquals, 3 },
|
||||
{ TokenType::DoublePipeEquals, 3 },
|
||||
{ TokenType::DoubleQuestionMarkEquals, 3 },
|
||||
|
||||
{ TokenType::Yield, 2 },
|
||||
|
||||
|
@ -1092,12 +1095,18 @@ NonnullRefPtr<Expression> Parser::parse_secondary_expression(NonnullRefPtr<Expre
|
|||
case TokenType::DoubleAmpersand:
|
||||
consume();
|
||||
return create_ast_node<LogicalExpression>(LogicalOp::And, move(lhs), parse_expression(min_precedence, associativity));
|
||||
case TokenType::DoubleAmpersandEquals:
|
||||
return parse_assignment_expression(AssignmentOp::AndAssignment, move(lhs), min_precedence, associativity);
|
||||
case TokenType::DoublePipe:
|
||||
consume();
|
||||
return create_ast_node<LogicalExpression>(LogicalOp::Or, move(lhs), parse_expression(min_precedence, associativity));
|
||||
case TokenType::DoublePipeEquals:
|
||||
return parse_assignment_expression(AssignmentOp::OrAssignment, move(lhs), min_precedence, associativity);
|
||||
case TokenType::DoubleQuestionMark:
|
||||
consume();
|
||||
return create_ast_node<LogicalExpression>(LogicalOp::NullishCoalescing, move(lhs), parse_expression(min_precedence, associativity));
|
||||
case TokenType::DoubleQuestionMarkEquals:
|
||||
return parse_assignment_expression(AssignmentOp::NullishAssignment, move(lhs), min_precedence, associativity);
|
||||
case TokenType::QuestionMark:
|
||||
return parse_conditional_expression(move(lhs));
|
||||
default:
|
||||
|
@ -1121,7 +1130,10 @@ NonnullRefPtr<AssignmentExpression> Parser::parse_assignment_expression(Assignme
|
|||
|| match(TokenType::CaretEquals)
|
||||
|| match(TokenType::ShiftLeftEquals)
|
||||
|| match(TokenType::ShiftRightEquals)
|
||||
|| match(TokenType::UnsignedShiftRightEquals));
|
||||
|| match(TokenType::UnsignedShiftRightEquals)
|
||||
|| match(TokenType::DoubleAmpersandEquals)
|
||||
|| match(TokenType::DoublePipeEquals)
|
||||
|| match(TokenType::DoubleQuestionMarkEquals));
|
||||
consume();
|
||||
if (!lhs->is_identifier() && !lhs->is_member_expression() && !lhs->is_call_expression()) {
|
||||
syntax_error("Invalid left-hand side in assignment");
|
||||
|
@ -1705,8 +1717,11 @@ bool Parser::match_secondary_expression(Vector<TokenType> forbidden) const
|
|||
|| type == TokenType::UnsignedShiftRight
|
||||
|| type == TokenType::UnsignedShiftRightEquals
|
||||
|| type == TokenType::DoubleAmpersand
|
||||
|| type == TokenType::DoubleAmpersandEquals
|
||||
|| type == TokenType::DoublePipe
|
||||
|| type == TokenType::DoubleQuestionMark;
|
||||
|| type == TokenType::DoublePipeEquals
|
||||
|| type == TokenType::DoubleQuestionMark
|
||||
|| type == TokenType::DoubleQuestionMarkEquals;
|
||||
}
|
||||
|
||||
bool Parser::match_statement() const
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue