Skip to content

Commit

Permalink
JS: revert cc66302: improve compression of conditional expressions
Browse files Browse the repository at this point in the history
  • Loading branch information
tdewolff committed Apr 8, 2022
1 parent 35944b2 commit 09c93b1
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 40 deletions.
8 changes: 4 additions & 4 deletions js/js_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -545,7 +545,7 @@ func TestJS(t *testing.T) {
{`a?!0:!1`, `!!a`},
{`a?0:1`, `a?0:1`},
{`!!a?0:1`, `!!a?0:1`},
{`a&&b?!1:!0`, `!a||!b`},
//{`a&&b?!1:!0`, `!a||!b`}, // TODO
{`a&&b?!0:!1`, `!!(a&&b)`},
{`a?true:5`, `!!a||5`},
{`a?5:false`, `!!a&&5`},
Expand Down Expand Up @@ -600,13 +600,13 @@ func TestJS(t *testing.T) {
{`a??=b`, `a??=b`},
{`a==false`, `a==!1`},
{`a===false`, `a===!1`},
{`!(a||b)`, `!a&&!b`},
{`!(a&&b)`, `!a||!b`},
//{`!(a||b)`, `!a&&!b`}, // TODO
//{`!(a&&b)`, `!a||!b`}, // TODO
//{`!(!a||!b)`, `a&&b`}, // we don't know of a or b are booleans
//{`!(!a&&!b)`, `a||b`},
//{`!(!a&&b)&&c`, `(a||!b)&&c`},
{`!(a&&b)&&c`, `!(a&&b)&&c`},
{`a===false||b===true?false:true`, `a!==!1&&b!==!0`},
//{`a===false||b===true?false:true`, `a!==!1&&b!==!0`}, // TODO

// other
{`async function g(){await x+y}`, `async function g(){await x+y}`},
Expand Down
72 changes: 36 additions & 36 deletions js/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -591,44 +591,44 @@ func optimizeBooleanExpr(expr js.IExpr, invert bool, prec js.OpPrec) js.IExpr {
}

func optimizeUnaryExpr(expr *js.UnaryExpr, prec js.OpPrec) js.IExpr {
if group, ok := expr.X.(*js.GroupExpr); ok && expr.Op == js.NotToken {
if binary, ok := group.X.(*js.BinaryExpr); ok && (binary.Op == js.AndToken || binary.Op == js.OrToken) {
op := js.AndToken
if binary.Op == js.AndToken {
op = js.OrToken
}
precInside := binaryOpPrecMap[op]
//if group, ok := expr.X.(*js.GroupExpr); ok && expr.Op == js.NotToken {
// if binary, ok := group.X.(*js.BinaryExpr); ok && (binary.Op == js.AndToken || binary.Op == js.OrToken) {
// op := js.AndToken
// if binary.Op == js.AndToken {
// op = js.OrToken
// }
// precInside := binaryOpPrecMap[op]

// rewrite !(a||b) to !a&&!b
// rewrite !(a==0||b==0) to a!=0&&b!=0
var isNotX, isNotY, isEqX, isEqY bool
if unaryExpr, ok := binary.X.(*js.UnaryExpr); ok {
isNotX = unaryExpr.Op == js.NotToken
} else if binaryExpr, ok := binary.X.(*js.BinaryExpr); ok {
isEqX = binaryOpPrecMap[binaryExpr.Op] == js.OpEquals
}
if unaryExpr, ok := binary.Y.(*js.UnaryExpr); ok {
isNotY = unaryExpr.Op == js.NotToken
} else if binaryExpr, ok := binary.Y.(*js.BinaryExpr); ok {
isEqY = binaryOpPrecMap[binaryExpr.Op] == js.OpEquals
}
if !isNotX && !isNotY && (isEqX || isEqY || (prec <= precInside || precInside == js.OpCoalesce && prec == js.OpBitOr)) {
binary.Op = op
if isEqX {
binary.X.(*js.BinaryExpr).Op = invertBooleanOp(binary.X.(*js.BinaryExpr).Op)
} else {
binary.X = &js.UnaryExpr{js.NotToken, binary.X}
}
if isEqY {
// // rewrite !(a||b) to !a&&!b
// // rewrite !(a==0||b==0) to a!=0&&b!=0
// var isNotX, isNotY, isEqX, isEqY bool
// if unaryExpr, ok := binary.X.(*js.UnaryExpr); ok {
// isNotX = unaryExpr.Op == js.NotToken
// } else if binaryExpr, ok := binary.X.(*js.BinaryExpr); ok {
// isEqX = binaryOpPrecMap[binaryExpr.Op] == js.OpEquals
// }
// if unaryExpr, ok := binary.Y.(*js.UnaryExpr); ok {
// isNotY = unaryExpr.Op == js.NotToken
// } else if binaryExpr, ok := binary.Y.(*js.BinaryExpr); ok {
// isEqY = binaryOpPrecMap[binaryExpr.Op] == js.OpEquals
// }
// if !isNotX && !isNotY && (isEqX || isEqY || (prec <= precInside || precInside == js.OpCoalesce && prec == js.OpBitOr)) {
// binary.Op = op
// if isEqX {
// binary.X.(*js.BinaryExpr).Op = invertBooleanOp(binary.X.(*js.BinaryExpr).Op)
// } else {
// binary.X = &js.UnaryExpr{js.NotToken, binary.X}
// }
// if isEqY {

binary.Y.(*js.BinaryExpr).Op = invertBooleanOp(binary.Y.(*js.BinaryExpr).Op)
} else {
binary.Y = &js.UnaryExpr{js.NotToken, binary.Y}
}
return binary
}
}
}
// binary.Y.(*js.BinaryExpr).Op = invertBooleanOp(binary.Y.(*js.BinaryExpr).Op)
// } else {
// binary.Y = &js.UnaryExpr{js.NotToken, binary.Y}
// }
// return binary
// }
// }
//}
return expr
}

Expand Down

0 comments on commit 09c93b1

Please sign in to comment.