Dunqing 2024-11-19 10:31:52 +00:00
parent 65f1e82bd8
commit 58db9ef322
3 changed files with 23 additions and 11 deletions

View file

@ -46,6 +46,12 @@ pub enum BinaryishOperator {
Logical(LogicalOperator),
}
impl BinaryishOperator {
fn is_binary(self) -> bool {
matches!(self, Self::Binary(_))
}
}
fn print_binary_operator(op: BinaryOperator, p: &mut Codegen) {
let operator = op.as_str();
if op.is_keyword() {
@ -148,9 +154,15 @@ impl<'a> BinaryExpressionVisitor<'a> {
pub fn check_and_prepare(&mut self, p: &mut Codegen) -> bool {
let e = self.e;
self.operator = e.operator();
self.wrap = self.precedence >= self.operator.precedence()
// We don't need to print parentheses if both sides use the same logical operator
// For example: `(a && b) && c` should be printed as `a && b && c`
// ^^ e.operator() ^^ self.operator
let precedence_check = self.precedence >= e.operator().precedence()
&& (self.operator.is_binary() || self.precedence != self.operator.precedence());
self.operator = e.operator();
self.wrap = precedence_check
|| (self.operator == BinaryishOperator::Binary(BinaryOperator::In)
&& self.ctx.intersects(Context::FORBID_IN));

View file

@ -174,8 +174,8 @@ fn conditional() {
fn coalesce() {
test_minify("a ?? b", "a??b;");
test_minify("a ?? b ?? c ?? d", "a??b??c??d;");
test_minify("a ?? (b ?? (c ?? d))", "a??(b??(c??d));");
test_minify("(a ?? (b ?? (c ?? d)))", "a??(b??(c??d));");
test_minify("a ?? (b ?? (c ?? d))", "a??b??c??d;");
test_minify("(a ?? (b ?? (c ?? d)))", "a??b??c??d;");
test_minify("a, b ?? c", "a,b??c;");
test_minify("(a, b) ?? c", "(a,b)??c;");
test_minify("a, b ?? c, d", "a,b??c,d;");
@ -188,8 +188,8 @@ fn coalesce() {
#[test]
fn logical_or() {
test_minify("a || b || c", "a||b||c;");
test_minify("(a || (b || c)) || d", "a||(b||c)||d;");
test_minify("a || (b || (c || d))", "a||(b||(c||d));");
test_minify("(a || (b || c)) || d", "a||b||c||d;");
test_minify("a || (b || (c || d))", "a||b||c||d;");
test_minify("a || b && c", "a||b&&c;");
test_minify("(a || b) && c", "(a||b)&&c;");
test_minify("a, b || c, d", "a,b||c,d;");
@ -201,7 +201,7 @@ fn logical_or() {
#[test]
fn logical_and() {
test_minify("a && b && c", "a&&b&&c;");
test_minify("a && ((b && c) && d)", "a&&(b&&c&&d);");
test_minify("a && ((b && c) && d)", "a&&b&&c&&d;");
test_minify("((a && b) && c) && d", "a&&b&&c&&d;");
test_minify("(a || b) && (c || d)", "(a||b)&&(c||d);");
test_minify("a, b && c, d", "a,b&&c,d;");

View file

@ -10,17 +10,17 @@ Original | Minified | esbuild | Gzip | esbuild
544.10 kB | 73.48 kB | 72.48 kB | 26.12 kB | 26.20 kB | lodash.js
555.77 kB | 276.49 kB | 270.13 kB | 91.15 kB | 90.80 kB | d3.js
555.77 kB | 276.48 kB | 270.13 kB | 91.15 kB | 90.80 kB | d3.js
1.01 MB | 467.60 kB | 458.89 kB | 126.74 kB | 126.71 kB | bundle.min.js
1.01 MB | 467.59 kB | 458.89 kB | 126.73 kB | 126.71 kB | bundle.min.js
1.25 MB | 662.86 kB | 646.76 kB | 164.00 kB | 163.73 kB | three.js
2.14 MB | 741.57 kB | 724.14 kB | 181.45 kB | 181.07 kB | victory.js
2.14 MB | 741.55 kB | 724.14 kB | 181.45 kB | 181.07 kB | victory.js
3.20 MB | 1.02 MB | 1.01 MB | 332.01 kB | 331.56 kB | echarts.js
6.69 MB | 2.39 MB | 2.31 MB | 496.10 kB | 488.28 kB | antd.js
10.95 MB | 3.56 MB | 3.49 MB | 911.23 kB | 915.50 kB | typescript.js
10.95 MB | 3.56 MB | 3.49 MB | 911.24 kB | 915.50 kB | typescript.js