LibJS: Implement void operator
This commit is contained in:
parent
beda751d33
commit
d30db07048
Notes:
sideshowbarker
2024-07-19 07:34:03 +09:00
Author: https://github.com/linusg Commit: https://github.com/SerenityOS/serenity/commit/d30db070480 Pull-request: https://github.com/SerenityOS/serenity/pull/1811
4 changed files with 34 additions and 1 deletions
|
@ -391,7 +391,11 @@ Value UnaryExpression::execute(Interpreter& interpreter) const
|
|||
return js_string(interpreter, "object");
|
||||
case Value::Type::Boolean:
|
||||
return js_string(interpreter, "boolean");
|
||||
default:
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
case UnaryOp::Void:
|
||||
return js_undefined();
|
||||
}
|
||||
|
||||
ASSERT_NOT_REACHED();
|
||||
|
@ -539,6 +543,9 @@ void UnaryExpression::dump(int indent) const
|
|||
case UnaryOp::Typeof:
|
||||
op_string = "typeof ";
|
||||
break;
|
||||
case UnaryOp::Void:
|
||||
op_string = "void ";
|
||||
break;
|
||||
}
|
||||
|
||||
print_indent(indent);
|
||||
|
|
|
@ -395,6 +395,7 @@ enum class UnaryOp {
|
|||
Plus,
|
||||
Minus,
|
||||
Typeof,
|
||||
Void,
|
||||
};
|
||||
|
||||
class UnaryExpression : public Expression {
|
||||
|
|
|
@ -185,6 +185,7 @@ Associativity Parser::operator_associativity(TokenType type) const
|
|||
case TokenType::EqualsEqualsEquals:
|
||||
case TokenType::ExclamationMarkEqualsEquals:
|
||||
case TokenType::Typeof:
|
||||
case TokenType::Void:
|
||||
case TokenType::Ampersand:
|
||||
case TokenType::Caret:
|
||||
case TokenType::Pipe:
|
||||
|
@ -416,6 +417,9 @@ NonnullRefPtr<Expression> Parser::parse_unary_prefixed_expression()
|
|||
case TokenType::Typeof:
|
||||
consume();
|
||||
return create_ast_node<UnaryExpression>(UnaryOp::Typeof, parse_expression(precedence, associativity));
|
||||
case TokenType::Void:
|
||||
consume();
|
||||
return create_ast_node<UnaryExpression>(UnaryOp::Void, parse_expression(precedence, associativity));
|
||||
default:
|
||||
m_parser_state.m_has_errors = true;
|
||||
expected("primary expression (missing switch case)");
|
||||
|
@ -968,7 +972,8 @@ bool Parser::match_unary_prefixed_expression() const
|
|||
|| type == TokenType::Tilde
|
||||
|| type == TokenType::Plus
|
||||
|| type == TokenType::Minus
|
||||
|| type == TokenType::Typeof;
|
||||
|| type == TokenType::Typeof
|
||||
|| type == TokenType::Void;
|
||||
}
|
||||
|
||||
bool Parser::match_secondary_expression() const
|
||||
|
|
20
Libraries/LibJS/Tests/void-basic.js
Normal file
20
Libraries/LibJS/Tests/void-basic.js
Normal file
|
@ -0,0 +1,20 @@
|
|||
load("test-common.js");
|
||||
|
||||
try {
|
||||
assert(void "" === undefined);
|
||||
assert(void "foo" === undefined);
|
||||
assert(void 1 === undefined);
|
||||
assert(void 42 === undefined);
|
||||
assert(void true === undefined);
|
||||
assert(void false === undefined);
|
||||
assert(void null === undefined);
|
||||
assert(void undefined === undefined);
|
||||
assert(void function () {} === undefined);
|
||||
assert(void (() => {}) === undefined);
|
||||
assert(void (() => "hello friends")() === undefined);
|
||||
assert((() => void "hello friends")() === undefined);
|
||||
|
||||
console.log("PASS");
|
||||
} catch (e) {
|
||||
console.log("FAIL: " + e);
|
||||
}
|
Loading…
Add table
Reference in a new issue