scala / scala3

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

compiler crash on scalajs promise typed `then` call with -Y:checkAll #21119

Open rssh opened 2 weeks ago

rssh commented 2 weeks ago

Compiler version

3.4.2 3.5.0-RC2

Minimized code

(note, that scalajs should be enabled and -Ycheck:all is essential)

package x

import scala.util.*
import scala.scalajs.js.{JavaScriptException, Thenable}
import scalajs.*

case class JSPromiseWrapper[A](val jsPromise: js.Promise[Either[A,JSPromiseWrapper[A]]])  {

      def flatMapTry[B](f: Try[A] => JSPromiseWrapper[B]): JSPromiseWrapper[B] = {

        JSPromiseWrapper(
           jsPromise.`then`[Either[B,JSPromiseWrapper[B]]](
             onFulfilled = {
                 case Left(a) =>
                   evalOp(f(Success(a)))
                 case Right(wa) =>
                      Right(wa.flatMapTry(f))
             },
             onRejected = { (e: Any) =>
                   e match
                     case ex: Throwable =>
                       evalOp(f(Failure(ex)))
                     case other =>
                       evalOp(f(Failure(JavaScriptException(other))))
               }
           )
        )
      }

}

def evalOp[T](op: => JSPromiseWrapper[T]): Either[T, JSPromiseWrapper[T]] = {
  ???
}

Next build.sbt:

lazy val testProject = project.in(file("."))
   .enablePlugins(ScalaJSPlugin)
    .settings(
      scalaVersion := "3.5.0-RC2",
      scalacOptions ++= Seq(
        "-Ycheck:all"
      ),

      scalaJSUseMainModuleInitializer := true,

  )

Output (click arrow to expand)

```Scala rssh@rssh4> sbt compile ~/tests/dotty/scalajs-invalid-literal [info] welcome to sbt 1.10.0 (Homebrew Java 21.0.3) [info] loading global plugins from /Users/rssh/.sbt/1.0/plugins [info] loading settings for project scalajs-invalid-literal-build from plugins.sbt ... [info] loading project definition from /Users/rssh/tests/dotty/scalajs-invalid-literal/project [info] loading settings for project testProject from build.sbt ... [info] set current project to testProject (in build file:/Users/rssh/tests/dotty/scalajs-invalid-literal/) [info] Executing in batch mode. For better performance use sbt's shell [info] compiling 1 Scala source to /Users/rssh/tests/dotty/scalajs-invalid-literal/target/scala-3.5.0-RC2/classes ... [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase typer [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase checkUnusedPostTyper [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase checkShadowing [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase inlinedPositions [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase posttyper [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase prepjsinterop [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase pickler [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase inlining [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase postInlining [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase checkUnusedPostInlining [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase staging [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase splicing [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase pickleQuotes [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase MegaPhase{crossVersionChecks, firstTransform, checkReentrant, elimPackagePrefixes, cookComments, checkLoopingImplicits, betaReduce, inlineVals, expandSAMs, elimRepeated, refchecks} [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase MegaPhase{protectedAccessors, extmethods, uncacheGivenAliases, checkStatic, elimByName, hoistSuperArgs, forwardDepChecks, tryCatchPatterns, patternMatcher} [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase MegaPhase{elimOpaque, explicitJSClasses, explicitOuter, explicitSelf, interpolators, dropBreaks} [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase MegaPhase{pruneErasedDefs, uninitialized, inlinePatterns, vcInlineMethods, seqLiterals, intercepted, getters, collectNullableFields, elimOuterSelect, resolveSuper, functionXXLForwarders, paramForwarding, genericTuples, letOverApply, arrayConstructors} [info] checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase erasure *** error while checking /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala after phase erasure *** unhandled exception while running Ycheck on /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala An unhandled exception was thrown in the compiler. Please file a crash report here: https://github.com/scala/scala3/issues/new/choose For non-enriched exceptions, compile with -Xno-enrich-error-messages. while compiling: /Users/rssh/tests/dotty/scalajs-invalid-literal/src/main/scala/x/JSAsyncCpsMonad.scala during phase: Ycheck mode: Mode(ImplicitsEnabled) library version: version 2.13.13 compiler version: version 3.5.0-RC2 settings: -Ycheck List(all) -classpath /Users/rssh/tests/dotty/scalajs-invalid-literal/target/scala-3.5.0-RC2/classes:/Users/rssh/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_sjs1_3/3.5.0-RC2/scala3-library_sjs1_3-3.5.0-RC2.jar:/Users/rssh/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-js/scalajs-library_2.13/1.16.0/scalajs-library_2.13-1.16.0.jar:/Users/rssh/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/com/github/rssh/dotty-cps-async_sjs1_3/0.9.21/dotty-cps-async_sjs1_3-0.9.21.jar:/Users/rssh/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.13/scala-library-2.13.13.jar:/Users/rssh/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-js/scalajs-javalib/1.16.0/scalajs-javalib-1.16.0.jar:/Users/rssh/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-js/scalajs-scalalib_2.13/2.13.13%2B1.16.0/scalajs-scalalib_2.13-2.13.13%2B1.16.0.jar -d /Users/rssh/tests/dotty/scalajs-invalid-literal/target/scala-3.5.0-RC2/classes -scalajs true [error] ## Exception when compiling 1 sources to /Users/rssh/tests/dotty/scalajs-invalid-literal/target/scala-3.5.0-RC2/classes [error] java.lang.AssertionError: assertion failed: function literal are not properly formed as a block of DefDef and Closure. Found: closure($anonfun:scala.scalajs.js.Function1) Nesting block: { [error] def $anonfun(e: Object): Object = [error] { [error] matchResult5[scala.util.Either]: [error] { [error] case val x10: Object = e [error] if x10.isInstanceOf[Throwable] then [error] { [error] case val ex: Throwable = x10.asInstanceOf[Throwable] [error] return[matchResult5] [error] { [error] x.evalOp( [error] { [error] def $anonfun(): x.JSPromiseWrapper = [error] f.apply(scala.util.Failure.apply(ex)).asInstanceOf[ [error] x.JSPromiseWrapper] [error] closure($anonfun:Function0) [error] } [error] ) [error] } [error] } [error] else () [error] case val other: Object = x10 [error] return[matchResult5] [error] { [error] x.evalOp( [error] { [error] def $anonfun(): x.JSPromiseWrapper = [error] f.apply( [error] scala.util.Failure.apply( [error] scala.scalajs.js.JavaScriptException.apply(other)) [error] ).asInstanceOf[x.JSPromiseWrapper] [error] closure($anonfun:Function0) [error] } [error] ) [error] } [error] } [error] } [error] closure($anonfun:scala.scalajs.js.Function1).asInstanceOf[scala.scalajs.js.|] [error] } [error] scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:8) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedClosure(TreeChecker.scala:675) [error] dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:3411) [error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:3484) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:434) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3561) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3565) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:416) [error] dotty.tools.dotc.typer.ReTyper.typedSelect(ReTyper.scala:42) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedSelect(TreeChecker.scala:523) [error] dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:3374) [error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:3483) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:434) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3561) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3565) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:416) [error] dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:3676) [error] dotty.tools.dotc.typer.Applications.typedTypeApply(Applications.scala:1284) [error] dotty.tools.dotc.typer.Applications.typedTypeApply$(Applications.scala:434) [error] dotty.tools.dotc.typer.Typer.typedTypeApply(Typer.scala:145) [error] dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:3419) [error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:3484) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:434) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3561) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3565) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:416) [error] dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:3676) [error] dotty.tools.dotc.typer.Typer.typedBlock(Typer.scala:1384) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock$$anonfun$1$$anonfun$1(TreeChecker.scala:684) [error] dotty.tools.dotc.transform.TreeChecker$Checker.withDefinedSyms(TreeChecker.scala:278) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock$$anonfun$1(TreeChecker.scala:684) [error] dotty.tools.dotc.transform.TreeChecker$Checker.withBlock(TreeChecker.scala:306) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock(TreeChecker.scala:684) [error] dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:3407) [error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:3484) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:434) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3561) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3565) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:416) [error] dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:3676) [error] dotty.tools.dotc.typer.Typer.typedBlock(Typer.scala:1384) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock$$anonfun$1$$anonfun$1(TreeChecker.scala:684) [error] dotty.tools.dotc.transform.TreeChecker$Checker.withDefinedSyms(TreeChecker.scala:278) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock$$anonfun$1(TreeChecker.scala:684) [error] dotty.tools.dotc.transform.TreeChecker$Checker.withBlock(TreeChecker.scala:306) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock(TreeChecker.scala:684) [error] dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:3407) [error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:3484) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:434) [error] dotty.tools.dotc.typer.ProtoTypes$FunProto.$anonfun$7(ProtoTypes.scala:512) [error] dotty.tools.dotc.typer.ProtoTypes$FunProto.cacheTypedArg(ProtoTypes.scala:435) [error] dotty.tools.dotc.typer.ProtoTypes$FunProto.typedArg(ProtoTypes.scala:513) [error] dotty.tools.dotc.typer.Applications$ApplyToUntyped.typedArg(Applications.scala:996) [error] dotty.tools.dotc.typer.Applications$ApplyToUntyped.typedArg(Applications.scala:996) [error] dotty.tools.dotc.typer.Applications$Application.addTyped$1(Applications.scala:688) [error] dotty.tools.dotc.typer.Applications$Application.matchArgs(Applications.scala:752) [error] dotty.tools.dotc.typer.Applications$Application.matchArgs(Applications.scala:752) [error] dotty.tools.dotc.typer.Applications$Application.init(Applications.scala:574) [error] dotty.tools.dotc.typer.Applications$TypedApply.(Applications.scala:878) [error] dotty.tools.dotc.typer.Applications$ApplyToUntyped.(Applications.scala:995) [error] dotty.tools.dotc.typer.Applications.ApplyTo(Applications.scala:1257) [error] dotty.tools.dotc.typer.Applications.ApplyTo$(Applications.scala:434) [error] dotty.tools.dotc.typer.Typer.ApplyTo(Typer.scala:145) [error] dotty.tools.dotc.typer.Applications.simpleApply$1(Applications.scala:1068) [error] dotty.tools.dotc.typer.Applications.realApply$1$$anonfun$2(Applications.scala:1178) [error] dotty.tools.dotc.typer.Typer$.tryEither(Typer.scala:118) [error] dotty.tools.dotc.typer.Applications.realApply$1(Applications.scala:1193) [error] dotty.tools.dotc.typer.Applications.typedApply(Applications.scala:1231) [error] dotty.tools.dotc.typer.Applications.typedApply$(Applications.scala:434) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedApply(TreeChecker.scala:554) [error] dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:3399) [error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:3484) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:434) [error] dotty.tools.dotc.typer.ProtoTypes$FunProto.$anonfun$7(ProtoTypes.scala:512) [error] dotty.tools.dotc.typer.ProtoTypes$FunProto.cacheTypedArg(ProtoTypes.scala:435) [error] dotty.tools.dotc.typer.ProtoTypes$FunProto.typedArg(ProtoTypes.scala:513) [error] dotty.tools.dotc.typer.Applications$ApplyToUntyped.typedArg(Applications.scala:996) [error] dotty.tools.dotc.typer.Applications$ApplyToUntyped.typedArg(Applications.scala:996) [error] dotty.tools.dotc.typer.Applications$Application.addTyped$1(Applications.scala:688) [error] dotty.tools.dotc.typer.Applications$Application.matchArgs(Applications.scala:752) [error] dotty.tools.dotc.typer.Applications$Application.init(Applications.scala:574) [error] dotty.tools.dotc.typer.Applications$TypedApply.(Applications.scala:878) [error] dotty.tools.dotc.typer.Applications$ApplyToUntyped.(Applications.scala:995) [error] dotty.tools.dotc.typer.Applications.ApplyTo(Applications.scala:1257) [error] dotty.tools.dotc.typer.Applications.ApplyTo$(Applications.scala:434) [error] dotty.tools.dotc.typer.Typer.ApplyTo(Typer.scala:145) [error] dotty.tools.dotc.typer.Applications.simpleApply$1(Applications.scala:1068) [error] dotty.tools.dotc.typer.Applications.realApply$1$$anonfun$2(Applications.scala:1178) [error] dotty.tools.dotc.typer.Typer$.tryEither(Typer.scala:118) [error] dotty.tools.dotc.typer.Applications.realApply$1(Applications.scala:1193) [error] dotty.tools.dotc.typer.Applications.typedApply(Applications.scala:1231) [error] dotty.tools.dotc.typer.Applications.typedApply$(Applications.scala:434) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedApply(TreeChecker.scala:554) [error] dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:3399) [error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:3484) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:434) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3561) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3565) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:416) [error] dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:3676) [error] dotty.tools.dotc.typer.Typer.typedBlock(Typer.scala:1384) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock$$anonfun$1$$anonfun$1(TreeChecker.scala:684) [error] dotty.tools.dotc.transform.TreeChecker$Checker.withDefinedSyms(TreeChecker.scala:278) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock$$anonfun$1(TreeChecker.scala:684) [error] dotty.tools.dotc.transform.TreeChecker$Checker.withBlock(TreeChecker.scala:306) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock(TreeChecker.scala:684) [error] dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:3407) [error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:3484) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:434) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3561) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3565) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:416) [error] dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:3676) [error] dotty.tools.dotc.typer.Typer.$anonfun$65(Typer.scala:2823) [error] dotty.tools.dotc.inlines.PrepareInlineable$.dropInlineIfError(PrepareInlineable.scala:256) [error] dotty.tools.dotc.typer.Typer.typedDefDef(Typer.scala:2823) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedDefDef$$anonfun$1(TreeChecker.scala:659) [error] dotty.tools.dotc.transform.TreeChecker$Checker.withDefinedSyms(TreeChecker.scala:278) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedDefDef(TreeChecker.scala:662) [error] dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:3381) [error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:3483) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:434) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3561) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3565) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:416) [error] dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:3587) [error] dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:3633) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedStats(TreeChecker.scala:702) [error] dotty.tools.dotc.typer.Typer.typedClassDef(Typer.scala:3081) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedClassDef(TreeChecker.scala:629) [error] dotty.tools.dotc.typer.Typer.typedTypeOrClassDef$1(Typer.scala:3387) [error] dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:3391) [error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:3483) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:434) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3561) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3565) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:416) [error] dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:3587) [error] dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:3633) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedStats(TreeChecker.scala:702) [error] dotty.tools.dotc.typer.Typer.typedPackageDef(Typer.scala:3214) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedPackageDef(TreeChecker.scala:728) [error] dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:3433) [error] dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:3484) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:434) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3561) [error] dotty.tools.dotc.typer.Typer.typed(Typer.scala:3565) [error] dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:416) [error] dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:3676) [error] dotty.tools.dotc.transform.TreeChecker.check(TreeChecker.scala:131) [error] dotty.tools.dotc.transform.TreeChecker.run(TreeChecker.scala:111) [error] dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:380) [error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:15) [error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:10) [error] scala.collection.immutable.List.foreach(List.scala:334) [error] dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:373) [error] dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:343) [error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:15) [error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:10) [error] scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323) [error] dotty.tools.dotc.Run.runPhases$1(Run.scala:336) [error] dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:384) [error] dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:396) [error] dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:69) [error] dotty.tools.dotc.Run.compileUnits(Run.scala:396) [error] dotty.tools.dotc.Run.compileSources(Run.scala:282) [error] dotty.tools.dotc.Run.compile(Run.scala:267) [error] dotty.tools.dotc.Driver.doCompile(Driver.scala:37) [error] dotty.tools.xsbt.CompilerBridgeDriver.run(CompilerBridgeDriver.java:141) [error] dotty.tools.xsbt.CompilerBridge.run(CompilerBridge.java:22) [error] sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:91) [error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$7(MixedAnalyzingCompiler.scala:194) [error] scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23) [error] sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:249) [error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler.scala:184) [error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4$adapted(MixedAnalyzingCompiler.scala:164) [error] sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:239) [error] sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:164) [error] sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:212) [error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:534) [error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:534) [error] sbt.internal.inc.Incremental$.$anonfun$apply$3(Incremental.scala:178) [error] sbt.internal.inc.Incremental$.$anonfun$apply$3$adapted(Incremental.scala:176) [error] sbt.internal.inc.Incremental$$anon$2.run(Incremental.scala:454) [error] sbt.internal.inc.IncrementalCommon$CycleState.next(IncrementalCommon.scala:117) [error] sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:56) [error] sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:52) [error] sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:265) [error] sbt.internal.inc.Incremental$.$anonfun$incrementalCompile$8(Incremental.scala:409) [error] sbt.internal.inc.Incremental$.withClassfileManager(Incremental.scala:496) [error] sbt.internal.inc.Incremental$.incrementalCompile(Incremental.scala:396) [error] sbt.internal.inc.Incremental$.apply(Incremental.scala:170) [error] sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:534) [error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:488) [error] sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:332) [error] sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:425) [error] sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:137) [error] sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:2427) [error] sbt.Defaults$.$anonfun$compileIncrementalTask$2(Defaults.scala:2377) [error] sbt.internal.server.BspCompileTask$.$anonfun$compute$1(BspCompileTask.scala:41) [error] sbt.internal.io.Retry$.apply(Retry.scala:47) [error] sbt.internal.io.Retry$.apply(Retry.scala:29) [error] sbt.internal.io.Retry$.apply(Retry.scala:24) [error] sbt.internal.server.BspCompileTask$.compute(BspCompileTask.scala:41) [error] sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:2375) [error] scala.Function1.$anonfun$compose$1(Function1.scala:49) [error] sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:63) [error] sbt.std.Transform$$anon$4.work(Transform.scala:69) [error] sbt.Execute.$anonfun$submit$2(Execute.scala:283) [error] sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:24) [error] sbt.Execute.work(Execute.scala:292) [error] sbt.Execute.$anonfun$submit$1(Execute.scala:283) [error] sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265) [error] sbt.CompletionService$$anon$2.call(CompletionService.scala:65) [error] java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) [error] java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) [error] java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) [error] java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) [error] java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) [error] java.base/java.lang.Thread.run(Thread.java:1583) [error] ```
Gedochao commented 2 weeks ago

Repro with Scala CLI:

//> using platform js
//> using options -Ycheck:all
package x

import scala.util.*
import scala.scalajs.js.{JavaScriptException, Thenable}
import scalajs.*

case class JSPromiseWrapper[A](val jsPromise: js.Promise[Either[A,JSPromiseWrapper[A]]])  {

  def flatMapTry[B](f: Try[A] => JSPromiseWrapper[B]): JSPromiseWrapper[B] = {

    JSPromiseWrapper(
      jsPromise.`then`[Either[B,JSPromiseWrapper[B]]](
        onFulfilled = {
          case Left(a) =>
            evalOp(f(Success(a)))
          case Right(wa) =>
            Right(wa.flatMapTry(f))
        },
        onRejected = { (e: Any) =>
          e match
          case ex: Throwable =>
            evalOp(f(Failure(ex)))
          case other =>
            evalOp(f(Failure(JavaScriptException(other))))
        }
      )
    )
  }

}

def evalOp[T](op: => JSPromiseWrapper[T]): Either[T, JSPromiseWrapper[T]] = {
  ???
}