Evaluate expression when compress conditional statement
Describe the bug
This would require implementing terser evaluate method.
Input code
let a = 'aaaa'
if (a === 'aaaa') {
console.log(a)
}
Config
No response
Playground link
https://play.swc.rs/?version=1.2.170&code=H4sIAAAAAAAAA8tJLVFIVLBVUE8EAnUursw0BQ0g3xYmoqlQzcWZnJ9XnJ%2BTqpeTn66RqMlVCwBln0kENQAAAA%3D%3D&config=H4sIAAAAAAAAA22TzZLbIAzH38XnHLqdaQ%2F7AL3tMzAKCEdbAx4ksvFk8u4VthfbSW%2Fox19CX9y7T7bd%2B70bITPmeuIpCty69w5tALaZRulOKlPkYWB8nDqB3KNUCf%2F88fZLr4eUGFfBqQsUyU81mE1hzMhcz%2BpUAkbhpoOc05eakota55QGhPhiG2BDUbDHvLnaNAwwMpor5OZRX4NMnOIBFUFnxpzGvXt0JJSimg06BGdsclshjjJaoSvuRBpHRZE1uSN0eC59X5u4PI1XGAoINvs2t0IfbX6XRCzGl8hPaM12cVzQUuiqIm8ySsnxW%2FOZKB568RdR8xyAOULY5T9zr7M4Kv1%2FVBS9DlKmRnXKW1YRey3OEPlWYc0asxA2UUZXLNYK7RZ8hYeCmBwa9F7b3Zz5i8RedlnJNGLy7V7bBn4bwmKa76U60roHL%2FCPpiX7eaw8gFyeGU%2FhnIaXEAHlktwL1k5IeoZZV%2Fg2PtMSHWqf0e0uClezVqm%2FLUDs2649KkiuVHCfGzJ%2Fw9%2FdY%2Ft2S3eIP1bdHOcfmKDn2%2BoDAAA%3D
Expected behavior
console.log('aaaa')
Actual behavior
let a="aaaa";"aaaa"===a&&console.log(a)
Version
1.2.170
Additional context
No response
We have inliner,
See https://play.swc.rs/?version=1.2.171&code=H4sIAAAAAAAAA6vm4sxJLVFIVLBVMOTi4sxMU9AAsm2BPE2Fai5OzuT8vOL8nFS9nPx0jURNLs5arloAAXFBdjMAAAA%3D&config=H4sIAAAAAAAAA22TQZbbIAyG78I6i077Oos5QHc9A4%2BAcDS1hYtEJn55uXtF7GA76Q59%2FBLSD1zNJ3vzcTWjywy5rngicRfzYcAPjn3GUcxBZYqi6xluByMudyBVwt%2B%2Fvf3U7T4lhkVwMAMSxqkW82kYMzDXNVKPpKIfB6P5ZQASbiku5%2FSloeSi0TGlHhy9xNaxRRLoIK%2BpPvW9Gxns2eWWUQ92GTnRDhWBYMecxm06BRRMpGGDAVywPoV1poAZvOAZNiKtoyJibW4PAxxL11U%2F56Ph7PriBFp8ubuih7a8U0IWGwvxE1q6nRNnNA%2B6qDDaDFIyPTSfCWnnxR8A7bN3zOSGTf93HvUu9sr4HxVS1DuVqVG98LUrgk6Hs4ixTVi7hiwITZQhFA91Qr8WX%2BBuIMYAFmJUu1syf6H406YrmUZIse2rbS6ulzCH9vGo9rS%2Bgxf4S9uS7X0sfHByemY8DcfUv5QYQE4pvGB1QtIzzPqEL%2BMzLRRAfYaw2Shcw8UF%2BFuA%2FMNT%2FYmDo649vlsFKZQKrneH7l%2F03dzWLzkXQv696O51%2FgGRKYQUBgQAAA%3D%3D
Problem is that, inlining a string literal can make output too large. (25 M => 76M, in real case in the past)
Combined with #4414, I'd say number shouldn't be inlined blindly too.
The actual process of terser is when check constant conditions, evaluate left side of comparison and find out it's aaaa, so the whole if can be removed
Hmm, I think we need it.
version : 1.2.224 playground
this works only when variable contain <= 3 characters
let a = 'aaa'
if (a === 'aaa') {
console.log(a)
}
gives
console.log("aaa")
doesn't matter how long the string is in condition, it will evaluate
let a = 'aaa'
if (a === 'aaaaaaaaaaaaaaaaaaaaaaaaa') {
console.log(a)
}
gives nothing
but if just add one more char in variable
let a = 'aaaa'
if (a === 'aaaaaaaaaaaaaaaaaaaaaaaaa') {
console.log(a)
}
gives
let l="aaaa";"aaaaaaaaaaaaaaaaaaaaaaaaa"===l&&console.log(l)
This closed issue has been automatically locked because it had no new activity for a month. If you are running into a similar issue, please create a new issue with the steps to reproduce. Thank you.