scala / scala3

The Scala 3 compiler, also known as Dotty.
https://dotty.epfl.ch
Apache License 2.0
5.74k stars 1.04k forks source link

Exporting JS instance method with default params crashes the compiler #19728

Open sarubo opened 5 months ago

sarubo commented 5 months ago

Compiler version

Minimized code

main.scala

//> using scala 3.3.1
//> using platform scala-js
//> using dep "org.scala-js::scalajs-dom::2.8.0"

import org.scalajs.dom

class MyWebSocket(domSocket: dom.WebSocket):
  export domSocket.close

Output (click arrow to expand)

```scala nu > scala-cli main.scala --js-dom --server=false unhandled exception while running genSJSIR on C:\Users\sarub\projects\scala\crash_scala_js\main.scala An unhandled exception was thrown in the compiler. Please file a crash report here: https://github.com/lampepfl/dotty/issues/new/choose while compiling: during phase: mode: Mode(ImplicitsEnabled) library version: version 2.13.10 compiler version: version 3.3.1 settings: -classpath C:\Users\sarub\AppData\Local\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-js\scalajs-library_2.13\1.14.0\scalajs-library_2.13-1.14.0.jar;C:\Users\sarub\AppData\Local\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-lang\scala3-library_sjs1_3\3.3.1\scala3-library_sjs1_3-3.3.1.jar;C:\Users\sarub\AppData\Local\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-js\scalajs-dom_sjs1_3\2.8.0\scalajs-dom_sjs1_3-2.8.0.jar;C:\Users\sarub\AppData\Local\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-lang\scala-library\2.13.12\scala-library-2.13.12.jar;C:\Users\sarub\AppData\Local\Coursier\cache\v1\https\repo1.maven.org\maven2\org\scala-js\scalajs-javalib\1.14.0\scalajs-javalib-1.14.0.jar -d C:\Users\sarub\projects\scala\crash_scala_js\.scala-build\crash_scala_js_0f7eaef068-df550aa2d7\classes\main -java-output-version 17 -scalajs true -sourceroot C:\Users\sarub\projects\scala\crash_scala_js tree: EmptyTree tree position: : tree type: symbol: val call site: package in module class == Source file context for tree position == Exception in thread "main" org.scalajs.ir.InvalidIRException: Cannot hash a transient IR node (its value is of class class dotty.tools.backend.sjs.JSCodeGen$UndefinedParam$) at org.scalajs.ir.Hashers$TreeHasher.mixTree(Hashers.scala:552) at org.scalajs.ir.Hashers$.hashMethodDef$$anonfun$1(Hashers.scala:38) at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15) at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10) at scala.Option.foreach(Option.scala:437) at org.scalajs.ir.Hashers$.hashMethodDef(Hashers.scala:38) at org.scalajs.ir.Hashers$.hashMemberDefs$$anonfun$1(Hashers.scala:93) at scala.collection.immutable.List.map(List.scala:250) at org.scalajs.ir.Hashers$.hashMemberDefs(Hashers.scala:97) at dotty.tools.backend.sjs.JSCodeGen.genScalaClass(JSCodeGen.scala:463) at dotty.tools.backend.sjs.JSCodeGen.genCompilationUnit$$anonfun$3$$anonfun$1(JSCodeGen.scala:245) at dotty.tools.backend.sjs.ScopedVar$.withScopedVars(ScopedVar.scala:33) at dotty.tools.backend.sjs.JSCodeGen.genCompilationUnit$$anonfun$3(JSCodeGen.scala:249) at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15) at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10) at scala.collection.immutable.List.foreach(List.scala:333) at dotty.tools.backend.sjs.JSCodeGen.genCompilationUnit(JSCodeGen.scala:251) at dotty.tools.backend.sjs.JSCodeGen.run(JSCodeGen.scala:163) at dotty.tools.backend.sjs.GenSJSIR.run(GenSJSIR.scala:18) at dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:327) at scala.collection.immutable.List.map(List.scala:246) at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:331) at dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:246) at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15) at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10) at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1321) at dotty.tools.dotc.Run.runPhases$1(Run.scala:262) at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:270) at dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:279) at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:67) at dotty.tools.dotc.Run.compileUnits(Run.scala:279) at dotty.tools.dotc.Run.compileSources(Run.scala:194) at dotty.tools.dotc.Run.compile(Run.scala:179) at dotty.tools.dotc.Driver.doCompile(Driver.scala:37) at dotty.tools.dotc.Driver.process(Driver.scala:197) at dotty.tools.dotc.Driver.process(Driver.scala:165) at dotty.tools.dotc.Driver.process(Driver.scala:177) at dotty.tools.dotc.Driver.main(Driver.scala:207) at dotty.tools.dotc.Main.main(Main.scala) Compilation failed ```

About WebSocket and close

https://github.com/scala-js/scala-js-dom/blob/v2.8.0/dom/src/main/scala/org/scalajs/dom/WebSocket.scala#L13-L24 https://github.com/scala-js/scala-js-dom/blob/v2.8.0/dom/src/main/scala/org/scalajs/dom/WebSocket.scala#L64-L67

Maybe related to #12111

sjrd commented 5 months ago

The fix here will be to make it a proper compile error. We cannot accurately forward the semantics of default JS parameters as a Scala method.