Description
In several places in the compiler pipeline we assume that we only need to think about the Scala.js backend semantics when ctx.settings.scalajs.value
is true. For example, because JS is single-threaded, we emit all lazy vals as if they were @threadUnsafe
:
https://github.com/lampepfl/dotty/blob/2a32d6ae8a2667930d58997e9bc73f621045bf69/compiler/src/dotty/tools/dotc/transform/LazyVals.scala#L89
But this is incorrect: even when we're running with -scalajs
, we still emit .class files, and these files can actually end up being loaded by the compiler since macros are run by classloading. So we need to be very careful to only interpret ctx.settings.scalajs.value
to mean "emit something which will have the correct semantics using both the JVM and JS backend". I had a quick look at usages of this setting and most of them look like they don't break JVM semantics (just prevent some minor optimizations so not a big deal), though I have doubt about:
https://github.com/lampepfl/dotty/blob/2a32d6ae8a2667930d58997e9bc73f621045bf69/compiler/src/dotty/tools/dotc/transform/CompleteJavaEnums.scala#L113-L119
I don't know if Java enum members have to be static fields, or if it's just an optimization (/cc @bishabosha).