swc icon indicating copy to clipboard operation
swc copied to clipboard

minifier doesn't evaluate multiple constant checks

Open aquapi opened this issue 5 months ago • 4 comments

Describe the bug

swc only evaluates one check for some reason.

let n,
  hooks,
  isHydrating = !1;
isHydrating = !0;
let localDeps = '',
  localDepsCnt = 0,
  injectDependency = (c) => (
    isHydrating || (localDeps += c + ','), localDepsCnt++
  );
let logID = isHydrating ? '' : injectDependency(
  '() => console.log("ID:", +Math.random().toFixed(2))',
);
// isHydrating is not evaluated
// If logID2 is commented out it evaluates isHydrating and tree shake injectDependency as expected
let logID2 = isHydrating ? '' : injectDependency(
  '() => console.log("ID:", +Math.random().toFixed(2))',
);

Input code


Config


Link to the code that reproduces this issue

https://play.swc.rs/?version=1.13.5&code=H4sIAAAAAAAAA72PsQ6CMBCGd57iZGmbEoKMEHSQGBl8CNI2gNbW0A6S8PAeJCro7nb5Lv%2F%2F3WnlwUQBQGvt1U1D506D7GvfmQYK2Gzz4IskeaAxpa2odanuDhkhU%2FJNDsYjTOY2c1HCI1RGKiMG5FQwKHZAcbu2jSPQTysvQAAHEhEWrao5xyR7HdFUJXYua%2FZ4DmQ%2F5slH6KwW1jirVYxpGlZlFkbAz7Vv47420t4oi709dg8lacoYvraUpX%2BwPQGskmBjlQEAAA%3D%3D&config=H4sIAAAAAAAAA32US3LbMAyG9z6FR%2BsuOpmmixygu56BQ5OgTJcPDQE61mR890CU7LgxpJ2EDz9AAiA%2Bdvt9d0LTve0%2F%2BJN%2FBl0Qyv2fLTgm0he2dGCiRlP8QN2PGz3hhJwOCM10nUlHuvRATYUvP19%2BLYou5IxwUyy26JN342NOk%2BNQAPHBxlYOWSMkwv%2F1Cyv5fQJU6qP9kHMAnTaI0qh8IuihSIFNDkEPCOqsixBlOqkuHrOUYoKVwKqh5EHkyXryOXHOZ2pBW2WyBQH5Aob8GSQZ52JZQr6ecJ%2BGLRxq37c%2Bf1PDWYeqScgJl9YSPq0Q9Zg9knI1SSWc4UoNZrgU97vSO1WAaknPulP2aaUn%2FwC4AkEjJh1Bits8HM%2FTOtyU%2BuR4ZmkUOA%2B4dM0EPVdVee%2BE0k6lgUJeamcBWw1MpTXScRa8Uj%2F0FhQ4x8MihMZ3T%2BYoJaVxgOwEwA3WThqrGaj7M1zh04vYwH%2F4liRP2OIRNR3XKY7xkMNGggh0zHbDgVtBeR0XXhOXYZ3XZIFHA6zoUrGB5y3AL4CyCm1hPs0Gvw%2BOqPqQD%2BKeGHjQWxNfF9v1vp2jTv3XFpgX9G5x6GK2tcFl9U9Nnxf27%2B7L6bab77fpPP69KaeT7K6f8iLyiEYGAAA%3D

SWC Info output

No response

Expected behavior

// Empty file

Actual behavior

let isHydrating = !1;
isHydrating = !0;
let localDeps = '', localDepsCnt = 0, injectDependency = (c)=>(isHydrating || (localDeps += c + ','), localDepsCnt++);
isHydrating || injectDependency('() => console.log("ID:", +Math.random().toFixed(2))'), isHydrating || injectDependency('() => console.log("ID:", +Math.random().toFixed(2))');

Version

1.13.5

Additional context

No response

aquapi avatar Sep 14 '25 07:09 aquapi

It's not entirely impossible to inline such case like

write a
write a
read a

But I don't really expect it to appear in real world code.

Austaras avatar Sep 15 '25 07:09 Austaras

@Austaras I only write once and swc actually works if only 1 check is there so is this a bug?

aquapi avatar Sep 15 '25 08:09 aquapi

By 'write' I mean init with value or assign.

Austaras avatar Sep 15 '25 09:09 Austaras

Ah yeah this pattern is pretty uncommon

aquapi avatar Sep 15 '25 09:09 aquapi